【问题标题】:Run Multiple Commands on Same SSH Session in Bash? [duplicate]在 Bash 中的同一 SSH 会话上运行多个命令? [复制]
【发布时间】:2015-09-18 04:00:49
【问题描述】:

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

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

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

【问题讨论】:

  • 机器 B 上的代码是否有任何理由必须在事物 1 和事物 2 之间运行(即使用 ssh "machine A" "do-thing-1; do-thing-3"; ssh "machine B" do-thing 2)。否则,请考虑在连接到机器 A 时使用 -M 选项,以便机器 A 的两个登录可以使用相同的套接字(只有第一个需要进行身份验证;第二个可以捎带原始连接)。跨度>

标签: linux bash ssh


【解决方案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>

【讨论】:

    【解决方案2】:

    如果 A 的 ssh 不消耗它的标准输入,你可以很容易地让它等待输入。也许是这样的。

    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 了解更多信息。

    【讨论】:

    • 谢谢。 :D 如果没有任何外部工具,没有更好的方法吗?有很多命令在不同的时间发生,将它们全部放在同一个语句中会很难阅读。
    • 为了保持多个会话打开并在它们之间进行通信,除了完全微不足道的情况外,我会考虑 Python+Paramiko 或类似的东西。但是,现在另请参阅 ControlMaster hack 的更新答案。
    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多