ターミナル画面に 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