运行 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