Я хотел бы иметь цикл while на экране терминала, который пытается подключиться к моему серверу по ssh каждую секунду. На данный момент это выглядит примерно так:
while true; do echo INTERNALIP && date >> $HOME/server.log &&\
ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
date;\
sleep 1; done
У меня есть похожий while
цикл bash для подключения по ssh к той же машине, но с использованием внешнего IP-адреса, который я использую, когда не нахожусь в офисной сети:
while true; do echo EXTERNALIP && date >> $HOME/server.log &&\
ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
date;\
sleep 1; done
Я хотел бы объединить оба этих варианта в один однострочный, который (1) сначала пытается подключиться через INTERNALIP, а если это не удается, то пытается подключиться через EXTERNALIP. Я не слишком хорошо знаком с условными операторами в bash, поэтому не уверен, как это сделать.
Есть идеи?
решение1
Почему бы просто не использовать следующую строку внутри цикла:
ssh [email protected] || ssh [email protected]
Насколько я понимаю, только если ssh на 192.168.1.10 не сработает, то сработает второй ssh. Разве это не то, что вы хотите?
Я опустил все остальные детали опций SSH, журналов и т. д.
А еще лучше, наверное, что-то вроде этого:
( ssh [email protected] && echo INTERNALIP ) || ( ssh [email protected] && echo EXTERNALIP )
Это должно также позаботиться о журналах и является однострочным. (У меня нет возможности проверить это прямо сейчас, так что имейте в виду.)
решение2
Предполагая, что ваш скрипт делает именно то, что вам нужно, я бы запустил что-то вроде этого:
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
Здесь используется .external.pid для отслеживания того, какой сервер следует использовать.
PS: Вероятно, вы бы использовали это вместо этого:
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