gpt4 book ai didi

linux - 监听 netcat 工作但不能 grep'able(或其他几个实用程序)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:21 26 4
gpt4 key购买 nike

我正在测试一些 netcat udp shell 工具,并试图获取输出并通过标准管道发送它。在这个例子中,我有一个 netcat 客户端,它发送 'foo',然后是 'bar',然后是 'foo',每次尝试从监听器读取时都带有换行符:

[root@localhost ~ 05:40:20 ]# exec 5< <(nc -d -w 0 -6 -l -k -u 9801)
[root@localhost ~ 05:40:25 ]# awk '{print}' <&5
foo
bar
foo
^C
[root@localhost ~ 05:40:48 ]# awk '{print}' <&5 | grep foo
^C
[root@localhost ~ 05:41:12 ]# awk '{print}' <&5 | grep --line-buffered foo
^C
[root@localhost ~ 05:41:37 ]#
[root@localhost ~ 05:44:38 ]# grep foo <&5
foo
foo
^C
[root@localhost ~ 05:44:57 ]#

我已经检查了 --line-buffered... 我也从“od -bc”得到了相同的行为,即什么也没有。 Grep 在 fd 上工作......但是如果我将该 grep 传递给任何东西(比如 od -bc,cut),我得到相同的(没有)。尝试在最后一个 grep 前加上 stdbuf -oL,但无济于事。可以 > to file 然后 tail -f 它,但感觉好像遗漏了什么。

更新:似乎与描述符/顺序/时间相关。我创建了一个文件“tailSource”并改用它,这在我运行 echo -e "foo\nfoo\nbar\nfoo">> tailSource

时产生了同样的问题(无输出)
[root@localhost shm 07:16:18 ]# exec 5< <(tail -n 0 -f tailSource)
[root@localhost shm 07:16:32 ]# awk '{print}' <&5 | grep foo

...当我在没有'|的情况下运行时grep foo',我得到了我期望的输出。(GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu))

最佳答案

awk 在其输出未进入终端时进行缓冲。如果你有 GNU awk,你可以使用它的 fflush() 函数在每次打印后刷新

gawk '{print; fflush()}' <&5 | grep foo

不过在这种特殊情况下,您不需要 awk 和 grep,两者都可以。

awk /foo/ <&5
grep foo <&5

参见 BashFAQ 9有关缓冲及其解决方法的更多信息。

关于linux - 监听 netcat 工作但不能 grep'able(或其他几个实用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30252467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com