bash one-liner while loop para ssh en IP interna o IP externa

bash one-liner while loop para ssh en IP interna o IP externa

Me gustaría tener un bucle while en la pantalla de mi terminal que intente ingresar a mi servidor cada segundo. Por el momento se parece a esto:

while true; do echo INTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
     date;\
sleep 1; done

Tengo un whilebucle bash similar para conectarme a la misma máquina, pero usando la IP externa, que es la forma en que me conecto cuando no estoy en la red de la oficina:

while true; do echo EXTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
     date;\
sleep 1; done

Lo que me gustaría hacer es consolidar ambos en una sola línea, que (1) primero intenta conectarse a través de INTERNALIP y, si eso falla, luego intenta conectarse a través de EXTERNALIP. No estoy muy familiarizado con los condicionales en bash, así que no estoy seguro de cómo hacerlo.

¿Algunas ideas?

Respuesta1

¿Por qué no utilizar simplemente la siguiente línea dentro de su bucle?

ssh [email protected] || ssh [email protected]

Según tengo entendido, solo si falla el ssh a 192.168.1.10, se activará el segundo ssh. ¿No es eso lo que quieres?

Omití todos los demás detalles de las opciones de ssh, registros, etc.

Aún mejor tal vez algo como esto:

( ssh [email protected] && echo INTERNALIP ) || ( ssh [email protected] && echo EXTERNALIP )

Esto también debería ocuparse de los registros y es una sola línea. (No tengo la oportunidad de probarlo ahora, así que tenga cuidado).

Respuesta2

Suponiendo que su script haga exactamente lo que desea, ejecutaría algo como esto:

while true; do echo INTERNALIP && date >> $HOME/server.log && \
    if [ "`find .external.pid -mtime 1 | egrep '.*'`" == "" ]; then \
        ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected]; \
        if [ $? == 255 ]; then touch -d "-1 day" .external.pid; fi; \
    else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected]; \
        if [ $? == 255 ]; then rm .external.pid; fi; \
    fi; \
    date; \
sleep 1; done

Esto utiliza un .external.pid para realizar un seguimiento de qué servidor se debe utilizar.

PD: Probablemente usarías esto en su lugar:

while true; do echo INTERNALIP && date >> $HOME/server.log && \
    if [ "`find .external.pid -atime +1s | egrep '.*'`" == "" ]; then \
        ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 -o [email protected] 'date'; \
        if [ $? == 255 ]; then touch .external.pid; fi; \
    else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected] 'date'; \
        if [ $? == 255 ]; then rm .external.pid; fi; \
    fi; \
sleep 1; done

información relacionada