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

我有一個類似的 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

相關內容