
為了這個解釋,機器是我的筆記型電腦,我用它連接到遠端伺服器 - 我將其稱為伺服器名稱。
該過程可以描述如下:
- 我連接到伺服器伺服器名稱與
ssh
來自機器 - 然後我插入密碼伺服器名稱
- 我編譯了一些東西伺服器名稱
- 我退出伺服器名稱(使用
exit
) - 然後我重新啟動伺服器名稱從機器
- 我
ping
伺服器名稱然後我等到收到它的回應(ping
的輸出顯示在控制台上) - 我
ssh
進入伺服器名稱再次 - 我進行了一些檢查
- 最後,我
exit
要伺服器名稱為了回到機器
為了完成上面的食譜,我手動運行以下命令機器:
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ cd /some/path/
<server_name>$ make clean > /dev/null
<server_name>$ make > /dev/null
<server_name>$ exit
<machine>$ ./my_reboot_script server_name
<machine>$ ping server_name
PING 10.23.22.7 with 56(84) bytes of data.
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
^C
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ ./run_some_checks
<server_name>$ exit
<machine>$ echo "Done!"
上面的幾個註釋按順序排列:
-my_reboot_script
只是一個允許我冷啟動的程序伺服器名稱從我自己的座位上來看。
- 冷重啟後伺服器名稱,我需要等待它恢復,以便我可以使用 重新連接到它ssh
。為此,我使用ping
;它僅用作何時的指示伺服器名稱準備好再次接受連線;只有當我看到ping
輸出最終在控制台上生成時,我才會使用 Ctrl+C 中斷它,然後ssh
進入伺服器名稱。
手動執行上述操作既乏味又耗時。所以我想把上面的流程自動化,但有三個困難:
- 連接到時伺服器名稱
exit
,從 shell發出命令會優雅地將我註銷並返回到機器。但是,exit
從腳本.sh
文件內發出將終止腳本... - 我怎麼才能自動輸入密碼伺服器名稱階段?我不想手動輸入密碼,而是讓腳本來完成;換句話說 - 我想以某種方式將密碼硬編碼到腳本中,這樣它就不會打擾我。
- 「等待伺服器準備好 ssh 連線」階段:如何自動化此操作?意思是,
ping
我希望腳本能夠ping
辨識出有來自伺服器名稱,然後連接ssh
。雖然,ping
在這裡使用可能不是一個好主意,因為回應並ping
不能保證伺服器名稱已準備好監聽連線(根據我對上述過程的經驗,從獲得ssh
第一個回應開始還需要幾秒鐘)。ping
因此,更好的方法可能是讓腳本繼續嘗試ssh
循環,直到授予存取權限(某種繁忙的等待機制,甚至是每隔幾秒鐘睡眠和喚醒以嘗試連接的循環)。
答案1
如果您可以將公鑰資料從您的電腦取得到伺服器的.ssh/authorized_key
文件,則可以透過每個伺服器的一次呼叫來執行編譯ssh
,而無需輸入密碼:
ssh someone@$SERVER 'cd /some/path/; make clean > /dev/null; make > /dev/null;'
SERVER
您可以將其放入 shell 腳本的循環中,每次都更改 shell 變數的值。如果您不介意每次ssh
呼叫時輸入密碼,您甚至不需要伺服器上的公鑰資料。