在Bash中在同一个SSH会话上运行多个命令?

时间:2015-07-01 06:16:27

标签: linux bash ssh

我想在一个SSH会话上运行几个命令。例如,我的脚本现在具有以下内容:

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

在第三行再次通过SSH连接到A会浪费很多时间。如何在不再需要SSH的情况下执行此操作?这可能吗?

2 个答案:

答案 0 :(得分:3)

如果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

答案 1 :(得分: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>
相关问题