
我想在我的終端螢幕上有一個 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
我有一個類似的 bashwhile
循環,用於 sshing 到同一台機器,但使用外部 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