我想在一個SSH會話上運行幾個命令。例如,我的劇本,現在有類似以下內容:在Bash中的相同SSH會話上運行多個命令?
ssh "machine A" do-thing-1
ssh "machine B" do-thing-2
ssh "machine A" do-thing-3
說完就ssh在再中三分線被浪費了大量的時間。我如何執行此操作而無需再次進行SSH操作?這可能嗎?
我想在一個SSH會話上運行幾個命令。例如,我的劇本,現在有類似以下內容:在Bash中的相同SSH會話上運行多個命令?
ssh "machine A" do-thing-1
ssh "machine B" do-thing-2
ssh "machine A" do-thing-3
說完就ssh在再中三分線被浪費了大量的時間。我如何執行此操作而無需再次進行SSH操作?這可能嗎?
如果ssh
至A不消耗它的標準輸入,你可以很容易地使等待輸入。也許是這樣的。
ssh B 'sleep 5; do-thing-2; echo done.' | ssh A 'do-thing-1; read done; do-thing3'
的任意sleep
允許do-thing-1
發生第一顯然是一個疣和潛在的競爭狀態。
一個更簡單,更健壯的解決方案是使用ControlMaster功能創建可重用的ssh
會話。
cm=/tmp/cm-$UID-$RANDOM$RANDOM$RANDOM
ssh -M -S "$cm" -N A &
session=$!
ssh -S "$cm" A do-thing-1
ssh B do-thing-2
ssh -S "$cm" A do-thing-3
kill "$session"
wait "$session"
查看https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing瞭解更多。
您可以使用screen
$: screen
$: do-thing-1
Ctrl-A and Ctrl-D exit this screen,
$: screen
$: do-thing-2
Ctrl-A and Ctrl-D exit this screen,
$: screen
$: do-thing-2
Ctrl-A and Ctrl-D exit this screen,
view all `screen`,
$: screen -ls
Restore screen by id,
$: screen -r <Screen ID>
是否有任何原因機器B上的代碼必須在事物1和事物2之間運行(即使用'ssh「machine A」「do-thing-1; do-thing-3」; ssh「machine B」做事2')。否則,請在連接到機器A時使用'-M'選項,以便機器A的兩個登錄可以使用相同的套接字(只有第一個需要進行身份驗證;第二個可以在原始連接上捎帶)。 – chepner