【问题标题】:BASH catching <&3 into varBASH 将 <&3 捕获到 var
【发布时间】:2014-01-05 03:17:38
【问题描述】:

试图了解如何将

当我运行下面的代码时,它在第 9 行停止,并打印了 MSG to SEND,就好像 cat &lt;&amp;3 正在运行,但没有在 var myRcvMsg 中捕获它。如果我在端口上打开另一个 shell 和 nc,它会继续打印发送的每一行(这就是我想要的,只需要捕获它而不是打印它)

如果我将行更改为myRcvMsg="$(&lt;&amp;3)",则执行第 10,11 行,但不会打印出任何 var。

我做错了什么?

谢谢 艺术

#!/bin/bash

echo "Starting Script"
exec nc -p 18000 -l &
sleep 1                                  # wait for port to open
exec 3<>/dev/tcp/192.168.1.1/18000
echo "MSG to SEND" >&3
echo "MSG has been sent"
myRcvMsg="$(cat <&3)"
echo "MSG should have been RCV'd"
echo "This is the RCV msg:${myRcvMsg}"

【问题讨论】:

  • 为什么你使用cat 程序而不是read shell 内置?

标签: bash var netcat


【解决方案1】:

nc 的执行使其进入监听模式,但它会将其输出写入标准输出,而不是通过网络回显。请参阅Echo server with bash 了解如何将其变成回显服务器。

在我的机器上,我必须使用 127.0.0.1 来获得连接。

下一个问题是您必须确保您的消息没有卡在缓冲区中。当您在 &3 的末尾等待 nc 回显某些内容时, nc 可能实际上并没有看到您的消息。在我的测试中,$(cat &lt;&amp;3) 只是挂起。

以下类型的作品。

#!/bin/bash

set -x
echo "Starting Script"
exec nc -p 18000 -l -c "xargs -n1 echo" &
sleep 1                                  # wait for port to open
exec 3<>/dev/tcp/127.0.0.1/18000
cat <&3 >ttt &
sleep 1
echo "MSG to SEND" >&3
echo "MSG has been sent"
sleep 1
myRcvMsg=$(cat ttt)
echo "MSG should have been RCV'd"
echo "This is the RCV msg:\"${myRcvMsg}\""

有关更多信息,请参阅http://www.ict.griffith.edu.au/anthony/info/shell/co-processes.hints,其中缓冲问题在3/缓冲输出问题中突出显示。

【讨论】:

    【解决方案2】:

    尝试阅读

    myRcvMsg="$(cat /dev/fd/3)"
    

    【讨论】:

    • /proc 特定于 Linux。 /dev/fd/3 应该被 bash 接受,无论文件系统实际提供什么。
    • @vanda 我正在使用 debian 但得到 cat: /dev/fd/3: No such device or address。在调用它之前我要以不同的方式初始化它吗?谢谢艺术。
    • @artvanderlay 如果您使用 linux,请尝试在脚本中使用 /proc/self/fd/3
    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 2010-10-11
    • 2013-02-12
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多