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 while
para 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