我想在一个SSH会话上运行几个命令。例如,我的脚本现在具有以下内容:
ssh "machine A" do-thing-1
ssh "machine B" do-thing-2
ssh "machine A" do-thing-3
在第三行再次通过SSH连接到A会浪费很多时间。如何在不再需要SSH的情况下执行此操作?这可能吗?
答案 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>