我已經閱讀了這裡有關此主題的幾篇文章,但我找到的每個解決方案似乎都是運行一個命令的單行程式碼。
我正在創建一個腳本,一次又一次地透過 ssh 連接到多個不同的主機。目標是透過 ssh 連接到計算機,執行一些本地命令,執行腳本,等待其完成,然後退出 ssh 會話並繼續進行下一個。
但是,當我使用“exit”命令時,它不起作用,只是完全退出腳本。
答案1
我猜您的腳本沒有退出 shell 會話,因為您直接使用./exit.sh
.你應該用source
它來代替。
exit
然後,腳本中的語句將關閉 shell 會話。
$ source exit.sh
# or
$ . exit.sh
內建函數source
執行您的腳本目前 shell 上下文,同時./exit.sh
啟動新外殼來運行它。
答案2
您是否嘗試過將命令放入文件中並使用 cat 或 EOF
ssh -t [email protected] << EOF
command1
command2
exit
EOF
答案3
我建議您查看pssh
您想要完成的任務 - 它允許您輕鬆處理跨機器打開/關閉連接的細微差別,甚至可以並行運行以減少執行時間。
它仍然用作ssh
傳輸協議,因此它顯然與循環連接一樣安全ssh
。
答案4
您通常可以毫無問題for
地進行循環。ssh
$ for srv in 192.168.88.138; do echo $srv:; ssh $srv uptime; done
192.168.88.138:
13:27:25 up 30 days, 8:42, 1 user, load average: 4.15, 4.06, 4.06
所以在這種情況下我就跑到uptime
另一邊了。您可以替換uptime
為您想要運行的內容。無論你放在那裡什麼,出口就在哪裡。 uptime
一旦列印輸出,就會退出,但如果您正在編寫腳本,您可能需要確保它最終退出,以便循環for
可以繼續。
如果您正在做任何複雜的事情,我建議您在單獨的檔案中建立腳本,然後scp
將其連接到您想要運行它的伺服器,然後透過 ssh 運行它。嘗試透過引用和轉義將複雜的東西帶入 ssh 比通常更具挑戰性。
我已經這樣做了數百次,當您希望一次在一台伺服器上運行時,它工作得很好。如果你想讓事情並行運行,還有其他選擇,但我會看看安西布爾第一的。