内部 IP または外部 IP に SSH するための bash ワンライナー while ループ

内部 IP または外部 IP に SSH するための bash ワンライナー while ループ

ターミナル画面に while ループを表示して、1 秒ごとにサーバーに ssh で接続しようとします。現時点では、次のようになります。

while true; do echo INTERNALIP && date >> $HOME/server.log &&\
    ssh -Y -o ServerAliveInterval=5 -o ServerAliveCountMax=1 [email protected];\
     date;\
sleep 1; done

同じマシンに SSH 接続するための同様の bash ループがありますwhileが、これは外部 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 つのワンライナーに統合することです。つまり、(1) 最初に INTERNALIP 経由で接続を試み、それが失敗した場合は EXTERNALIP 経由で接続を試みます。私は bash の条件文にあまり詳しくないので、どのように実行すればよいかわかりません。

何か案は?

答え1

ループ内で次の行を使用するのはいかがでしょうか。

ssh [email protected] || ssh [email protected]

私の理解では、192.168.1.10 への ssh が失敗した場合にのみ、2 番目の 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

関連情報