bash one-liner while loop para ssh em IP interno ou IP externo

bash one-liner while loop para ssh em IP interno ou IP externo

Eu gostaria de ter um loop while na tela do meu terminal que tentasse fazer ssh no meu servidor a cada segundo. No momento parece algo assim:

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

Eu tenho um loop bash semelhante whilepara fazer sshing na mesma máquina, mas usando o IP externo, que é a forma como me conecto quando não estou na rede do escritório:

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

O que eu gostaria de fazer é consolidar ambos em uma única linha, que (1) primeiro tente se conectar através do INTERNALIP e, se isso falhar, tente conectar-se através do EXTERNALIP. Não estou muito familiarizado com condicionais no bash, então não sei como fazê-lo.

Alguma ideia?

Responder1

Por que não simplesmente usar a seguinte linha dentro do seu loop:

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

Pelo que entendi, apenas se o ssh para 192.168.1.10 falhar, o segundo ssh será acionado. Não é isso que você quer?

Deixei de fora todos os outros detalhes de opções de ssh, logs etc.

Melhor ainda, talvez algo assim:

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

Isso também deve cuidar dos logs e é uma linha única. (Não tenha a chance de testá-lo agora, então esteja avisado.)

Responder2

Supondo que seu script faça exatamente o que você deseja, eu executaria algo assim:

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

Isso usa um .external.pid para controlar qual servidor deve ser usado.

PS: Você provavelmente usaria isso:

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

informação relacionada