Estoy ejecutando un script que depende de que la red esté activa y se monte un recurso compartido de red. El script se ejecuta al iniciar sesión (lo que ocurre automáticamente después del arranque). El problema es que para cuando se ejecuta el script, por lo general todavía no tengo una dirección IP (DHCP). Por el momento, solo duermo el script durante 15 segundos, pero no me gusta este enfoque en absoluto, ya que quiero poder decirle al usuario si algo está mal.
Mi plan es un bucle mientras aún no tengo una dirección IP y continuar cuando lo tenga. Crucialmente, tiene que expirar después de un tiempo. Lo que se me ocurrió es hacerlo, if [ ifconfig | grep "192.168.100" ];
pero lo que sucede es que grepconsume el ];
y no le gusta. Entonces bash también se molesta, porque no puede encontrar ];
qué grep comió. Y luego ni siquiera he implementado el tiempo de espera.
Alguien sugirió mantener una variable y dormir, por ejemplo, un segundo en cada iteración y aumentar esta variable cada vez. Aquí está mi script completo (que no funciona) (soy bastante nuevo en bash scripting):
x=0
while [ ifconfig | grep "192.168.100." > /dev/null ]; do
echo "no nework"
if "$x" -gt 200; then
#Time out here
exit 1
x=$((x+1))
sleep .1
fi
done
#continue with rest of script...
¡Cualquier indicador en la dirección correcta sería muy apreciado!
fuente
network-online.target
...grep
salida a/dev/null
. Use la-q
opción en su lugar. Y tampoco me molesta que ifconfig sea una buena idea. ¿Por qué no usarping
en su lugar?ping
puede fallar dependiendo de la red en cuestión. Es mejor simplemente verificar la configuración en ejecución del sistema.Respuestas:
Sintaxis de Shell
Parece estar confundido con respecto a los condicionales en los scripts de shell. Cada comando de shell tiene un estado de salida, que es un número entero entre 0 y 255, donde 0 significa éxito y cualquier otro valor significa error. Las declaraciones como
if
ywhile
que esperan operandos booleanos inspeccionan el estado de salida del comando y tratan 0 (éxito) como verdadero y cualquier otro valor (falla) como falso.Por ejemplo, el
grep
comando devuelve 0 si se encuentra el patrón y 1 si no se encuentra el patrón. Entoncesrepite el ciclo siempre que el patrón
192.168.100.
se encuentre en la salida deifconfig
. Tenga en cuenta que el patrón192.168.100.
coincide con cadenas como192x168 1007
, porque.
en una expresión regular coincide con cualquier carácter; para buscar una cadena literal, pase la opción-F
agrep
. Para invertir la condición, poner!
al frente.Además en el script, desea comparar el valor de una variable con un número. Utiliza el
-gt
operador, que es parte de la sintaxis de las expresiones condicionales entendidas por eltest
comando. Eltest
comando devuelve 0 si la expresión condicional es verdadera y 1 si la expresión condicional es falsa.Es costumbre usar el nombre alternativo
[
para eltest
comando. Este nombre espera que el comando termine con el parámetro]
. Las dos formas de escribir este comando son exactamente equivalentes.Bash también ofrece una tercera forma de escribir este comando, con la sintaxis especial
[[ … ]]
. Esta sintaxis especial puede admitir algunos operadores más que[
, ya que[
es un comando ordinario sujeto a las reglas de análisis habituales, mientras que[[ … ]]
es parte de la sintaxis de shell.Nuevamente, tenga en cuenta que
[
es para expresiones condicionales , que son una sintaxis con operadores como-n
,-gt
...[
no significa "valor booleano": cualquier comando tiene un valor booleano (¿estado de salida = 0?).Detectando que la red está activa
Su forma de detectar que la red está activa no es sólida. En particular, tenga en cuenta que su script se activará tan pronto como cualquier interfaz de red adquiera una dirección IP dentro del rango especificado. En particular, es muy posible que el DNS no esté activo en ese momento, y mucho menos cualquier recurso compartido de red montado.
¿Realmente necesita ejecutar estos comandos cuando alguien inicia sesión? Es más fácil hacer que un comando se ejecute automáticamente cuando se abre la red. La forma de hacerlo depende de su distribución y de si usa NetworkManager.
Si necesita ejecutar estos comandos como parte de los scripts de inicio de sesión, pruebe el recurso que realmente necesita, no la presencia de una dirección IP. Por ejemplo, si desea probar si
/net/somenode/somedir
está montado, useSi tienes advenedizo o systemd ...
entonces puedes usarlo. Por ejemplo, con Upstart , marque su trabajo como
start on net-device-up eth0
(reempláceloeth0
por el nombre de la interfaz que proporciona la conectividad de red deseada). Con Systemd, vea ¿ Causa que se ejecute un script después de que se haya iniciado la conexión en red?fuente
/net/
debería ser/proc/net
?/net
es una ubicación común para dichos puntos de montaje.Solo cuente la salida de
ip add show
Por ejemplo:Luego puede simplemente ramificarse en el número de línea devuelta según corresponda. Probablemente solo verifique si fue cero, y si es así, duerma y repita el ciclo.
Código no probado para ilustración:
fuente
Ping devolverá una respuesta 0 si al menos un intento fue exitoso. Puede considerar hacer ping al servidor al que se está conectando hasta que sea exitoso.
fuente