2011-08-19 85 views
2

我尝试通过ssh建立管道链。让管道链通过ssh打开

mkfifo localpipe;和远程机器mkfifo remotepipe;

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

使用echo "input;" > localpipe我可以发送输入到一个程序,从remotepipe读取。但在此之后,remotepipe,localpipe和ssh-connection将被关闭。 有没有办法保持localpipe和ssh打开,但关闭remotepipe,我需要为了使远程端的程序处理其输入?

如果这不适用于cat或其他unix命令,我可以在C中编写一个简短的猫替代品来实现这个目的吗?

localpipe也可能会关闭,但我想保持SSH速度的原因打开。

回答

2

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

+0

这似乎工作!有没有办法将ControlMaster作为隧道?另外:我可以将这些选项添加到我的.ssh/config中,以便所有与给定主机的ssh连接以这种方式建立连接? – highsciguy

+0

两个问题都可以。 – huitseeker

5

echo ... > pipe命令在完成写入操作后关闭管道,导致cat读取结束,然后ssh连接也关闭。尝试用文件描述符打开管道,使其保持打开状态,像

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

,直至关闭文件描述符与exec 3>&-的管道要保持开放。

+0

谢谢,不完全是我所需要的,但是。或者,也许我不明白。我需要该回声关闭远程管道,因为这会告诉远程端的程序它应该停止从远程管道读取并开始解释。这应该发生在我用exec 3>& - 关闭时,但是这也会关闭ssh,对。但我希望ssh始终保持开放,等待我发送下一个输入。也许我可以在远程端使用您的命令版本? – highsciguy