【问题标题】:keep pipe chain over ssh open保持 ssh 上的管道链打开
【发布时间】:2011-08-19 21:48:41
【问题描述】:

我尝试通过 ssh 构建管道链。

mkfifo localpipe; 和远程机器上的mkfifo remotepipe;

cat localpipe | ssh -q einstein "cat > remotepipe"

使用echo "input;" > localpipe 我可以将输入发送到从远程管道读取的程序。但在那之后,远程管道、本地管道和 ssh 连接将被关闭。 有没有办法让 localpipe 和 ssh 保持打开但关闭 remotepipe,我需要这样做才能使远程端的程序处理其输入?

如果这不适用于 cat 或其他一些 unix 命令,我可以用 C 编写一个简短的 cat 替换来实现这一点吗?

localpipe 也可能已关闭,但出于速度原因,我想保持 ssh 处于打开状态。

【问题讨论】:

    标签: c bash unix ssh pipe


    【解决方案1】:

    echo ... > pipe 命令在完成写入后关闭管道,这导致从它读取的cat 终止,然后 ssh 连接也关闭。尝试使用文件描述符打开管道,使其保持打开状态,例如

    exec 3>localpipe
    # then ...
    echo input\; >&3
    

    管道应保持打开状态,直到您使用 exec 3>&- 关闭文件描述符。

    【讨论】:

    • 谢谢,不过,这并不是我所需要的。或者,也许我没有正确理解。我需要 echo 关闭远程管道,因为这告诉远程程序它应该停止从远程管道读取并开始解释。当我用 exec 3>&- 关闭时应该会发生这种情况,但这也会关闭 ssh,对吧。但我希望 ssh 一直保持打开状态,等待我发送下一个输入。也许我可以在远程端使用你的命令版本?
    【解决方案2】:

    首先打开一个打开ControlMaster的连接,然后通过它打开的控制套接字多路复用您的执行,如this SO answer中所述。

    【讨论】:

    • 这似乎有效!有没有办法让隧道作为 ControlMaster?另外:我可以将这些选项添加到我的 .ssh/config 中,以便到给定主机的所有 ssh 连接都以这种方式建立连接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2016-05-21
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多