Я хотел бы иметь цикл while на экране моего терминала, который каждую секунду пытается подключиться к серверу. На данный момент это выглядит примерно так:

while true; do echo INTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@192.168.1.10;\
     date;\
sleep 1; done

У меня аналогичная Баш во while цикла для sshing в ту же машину, но с помощью внешнего IP, который является , как я подключиться , когда я не в офисной сети:

while true; do echo EXTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@NN.NNN.NN.NNN;\
     date;\
sleep 1; done

То, что я хотел бы сделать, это объединить их в одну однострочную строку, которая (1) сначала пытается подключиться через INTERNALIP, а в случае неудачи пытается подключиться через EXTERNALIP. Я не слишком знаком с условными выражениями в bash, поэтому не знаю, как это сделать.

Есть идеи?

2 ответа2

0

Почему бы просто не использовать следующую строку внутри вашего цикла:

ssh user@192.168.1.10 || ssh user@NN.NNN.NN.NNN

Насколько я понимаю, это только в случае сбоя ssh на 192.168.1.10, тогда будет запущен второй ssh. Разве это не то, что вы хотите?

Я пропустил все остальные детали опций ssh, логов и т.д.

Еще лучше может быть что-то вроде этого:

( ssh user@192.168.1.10 && echo INTERNALIP ) || ( ssh user@NN.NNN.NN.NNN && echo EXTERNALIP )

Это должно заботиться о журналах, а также является одним вкладышем. (У вас нет возможности проверить это прямо сейчас, поэтому будьте осторожны. )

0

Предполагая, что ваш скрипт выполняет именно то, что вы хотите, я бы запустил что-то вроде этого:

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 user@192.168.1.10; \
        if [ $? == 255 ]; then touch -d "-1 day" .external.pid; fi; \
    else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@NN.NNNN.NN.NNN; \
        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 user@192.168.1.10 'date'; \
        if [ $? == 255 ]; then touch .external.pid; fi; \
    else ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@NN.NNNN.NN.NNN 'date'; \
        if [ $? == 255 ]; then rm .external.pid; fi; \
    fi; \
sleep 1; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .