【问题标题】:Using named pipes to create a 'loop'使用命名管道创建“循环”
【发布时间】:2012-03-11 17:17:21
【问题描述】:

我对 shell 脚本非常陌生,我正在尝试掌握管道。我可能会在这里完全错误的方向......

我所拥有的是一个 shell 脚本,其中包含一个简单的 while true 循环,在这个循环中,我让 netcat 监听指定的端口并将输入管道输入到一个正在通过标准输入等待命令的二进制文件。这是脚本-A

我有第二个 shell 脚本,它接受输入作为参数,然后将这些参数回显到 netcat 正在侦听的端口。这是脚本-B

我的目标是通过 Netcat 将位于 Script-A 中的二进制文件的返回输出获取到 Script-B 中,以便可以通过 stdout 返回。二进制文件必须初始化并等待输入。

这就是我所拥有的:

脚本-A

while true; do
    nc -kl 1234 | /binarylocation/ --readargumentsfromstdinflag
done

脚本-B

foo=$(echo "$*" | nc localhost 1234)
echo "$foo"

使用此设置,二进制文件的输出是通过 Script-A 完成的 在做了一些研究之后,我到了这一点,我正在尝试使用命名管道创建一种从二进制文件返回到 netcat 的循环,它仍然无法正常工作 -

脚本-A

mkfifo foobar

while true; do
    nc -kl 1234 < foobar | /binarylocation/ --readargumentsfromstdinflag > foobar
done

Script-B 没有改变。

请记住,我的 shell 脚本编写经验大约只有一天,谢谢。

【问题讨论】:

    标签: linux bash shell pipe


    【解决方案1】:

    问题出在您的脚本 B.. netcat 从 STDIN 读取并在 STDIN 关闭时立即退出,而不是等待响应。

    当你这样做时你会意识到:

    foo=$( ( echo -e "$*"; sleep 2 ) | nc localhost 1234) 
    echo "$foo"
    

    nc 有一个标准输入行为的参数..

     -q    after EOF on stdin, wait the specified number of seconds and 
           then quit. If seconds is negative, wait forever.`
    

    所以你应该这样做:

    foo=$( echo -e "$*" | nc -q5 localhost 1234) 
    echo "$foo"
    

    【讨论】:

    • 感谢您的回答,我有几天不能回去测试了。我没有忘记这个问题——别担心!
    • 完美运行 :-) 感谢您的耐心和坚持!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2018-06-04
    • 2014-12-21
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多