如何将命令列表(带管道)的stdin连接到其中一个命令

时间:2012-03-28 23:21:02

标签: bash shell unix networking netcat

我需要让用户能够在建立连接时通过网络发送/接收消息(使用netcat)(在这种情况下,用户使用nc作为客户端)。问题是我需要在用户开始交互之前发送一行。我的第一次尝试是:

echo 'my first line' | nc server port

这种方法的问题是nc echo完成执行时关闭连接,因此用户无法通过stdin发送命令,因为shell已经给出回到他身边(也没有收到来自服务器的回答,因为它延迟了几秒钟开始回答,并且当nc关闭连接时,用户从未收到答案)。

我也尝试过分组命令:

{ echo 'my first line'; cat -; } | nc server port

它几乎按照我需要的方式工作,但如果服务器关闭连接,它将等到我按<ENTER>再次给我shell。我需要在服务器关闭连接时返回shell(在这种情况下,客户端 - 我的nc命令 - 将从不关闭连接,除非我按下Ctrl + C)

我也尝试过命名管道,但没有成功。

你有任何关于如何做的提示吗?

  

注意:我正在使用openbsd-netcat。

5 个答案:

答案 0 :(得分:1)

您可能希望查看expect(1)

答案 1 :(得分:1)

等待'enter'是cat。 您可以在nc之后编写脚本执行以杀死cat,它将自动返回shell。

答案 2 :(得分:0)

我建议你使用cat << EOF,但我认为它不会像你期望的那样有用。

我不知道在连接关闭时如何发送EOF

答案 3 :(得分:0)

您可以尝试这样做以确定它是否适合您。

perl  -e "\$|=1;print \"my first line\\n\" ; while (<STDIN>) {print;}" | nc server port

答案 4 :(得分:0)

这个应该产生你想要的行为:

echo "Here is your MOTD." | nc server port ; nc server port