2011-08-19 79 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