运行 Bash 中同一 SSH 会话中的多个命令?
Run Multiple Commands on Same SSH Session in Bash?
我想 运行 在一个 SSH 会话中执行多个命令。例如,我现在的脚本如下所示:
ssh "machine A" do-thing-1
ssh "machine B" do-thing-2
ssh "machine A" do-thing-3
不得不在第三行再次通过 SSH 连接到 A 浪费了很多时间。如何执行此操作而无需再次 SSH?这可能吗?
您可以使用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>
如果ssh
到A不消耗它的标准输入,你可以很容易地让它等待输入。大概是这样的。
ssh B 'sleep 5; do-thing-2; echo done.' | ssh A 'do-thing-1; read done; do-thing3'
允许 do-thing-1
首先发生的任意 sleep
显然是一个疣和潜在的竞争条件。
一种更简单、更可靠的解决方案是使用 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。
我想 运行 在一个 SSH 会话中执行多个命令。例如,我现在的脚本如下所示:
ssh "machine A" do-thing-1
ssh "machine B" do-thing-2
ssh "machine A" do-thing-3
不得不在第三行再次通过 SSH 连接到 A 浪费了很多时间。如何执行此操作而无需再次 SSH?这可能吗?
您可以使用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>
如果ssh
到A不消耗它的标准输入,你可以很容易地让它等待输入。大概是这样的。
ssh B 'sleep 5; do-thing-2; echo done.' | ssh A 'do-thing-1; read done; do-thing3'
允许 do-thing-1
首先发生的任意 sleep
显然是一个疣和潜在的竞争条件。
一种更简单、更可靠的解决方案是使用 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。