збийте однолінійку під час циклу, щоб перетворити ssh на внутрішній IP або зовнішній IP


0

Мені б хотілося, щоб на моєму екрані терміналу був цикл часу, який щосекунди намагається вторгнутись у мій сервер. На даний момент це виглядає приблизно так:

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цикл bash для 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, а якщо це не вдасться, то намагається з'єднатись через ЗОВНІШНІЙ. Я не надто знайомий з умовними умовами в баші, тому не знаю, як це зробити.

Якісь ідеї?

Відповіді:


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

В Linux я отримую цю помилкуfind: unknown predicate '-x'
719016

1
Я оновив код, видаливши "-x": це не впливає на остаточний результат
Девід,

atime також відрізняється в Linux, ніж macosx
719016
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.