2015-07-01 121 views
1

我想在一個SSH會話上運行幾個命令。例如,我的劇本,現在有類似以下內容:在Bash中的相同SSH會話上運行多個命令?

ssh "machine A" do-thing-1 
ssh "machine B" do-thing-2 
ssh "machine A" do-thing-3 

說完就ssh在再中三分線被浪費了大量的時間。我如何執行此操作而無需再次進行SSH操作?這可能嗎?

+0

是否有任何原因機器B上的代碼必須在事物1和事物2之間運行(即使用'ssh「machine A」「do-thing-1; do-thing-3」; ssh「machine B」做事2')。否則,請在連接到機器A時使用'-M'選項,以便機器A的兩個登錄可以使用相同的套接字(只有第一個需要進行身份驗證;第二個可以在原始連接上捎帶)。 – chepner

回答

2

如果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瞭解更多。

+0

謝謝。 :D有沒有更好的方法來做到這一點,沒有任何外部工具,但?在不同的時間發生了不少命令,並且將它們放在同一個語句中將很難閱讀。 – Ashkay

+0

爲了讓多個會話保持開放並在它們之間進行通信,我會查看Python + Paramiko或類似的東西,除了完全無關緊要的情況之外。但是,現在請參閱ControlMaster hack的更新答案。 – tripleee

1

您可以使用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> 
相關問題