bash однострочный цикл while для ssh на внутренний IP или внешний IP

bash однострочный цикл while для ssh на внутренний IP или внешний IP

Я хотел бы иметь цикл 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

Связанный контент