我在玩awk,我想通过tcp套接字公开它。
一开始我试过,但在微信息网络上失败了。考虑到问题可能在于回车/换行符的处理方式,我决定尝试切换到socat。
使用带有套接字的远程命令非常容易:
socat TCP4-LISTEN:9000 EXEC:/bin/cat
socat TCP4-LISTEN:9000 SYSTEM:"/bin/python -i"这两项工作
但是,当尝试使用简单的awk命令(例如‘awk '{print NR}’以逐步计数接收的行数)时,当从同一台机器上的另一个shell连接套接字时,我不会得到任何返回。
我尝试了很多事情(其中一些失败了,但语法错误对我来说有点模糊)。我甚至无法尝试对socat进行限制,以查看具体执行的是什么,因为实际的命令exec‘’ing被委托给shell):
socat TCP4-LISTEN:9000 SYSTEM:"/usr/bin/awk '{print NR}'"
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print NR}"'
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print\ NR}"'我还创建了一个小脚本/tmp/testawk
#! /bin/sh
/usr/bin/awk '{print NR}'(也使用exec变体)
#! /bin/sh
exec /usr/bin/awk '{print NR}'这两种方法都在本地工作,但是当调用
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk它不会让我返回输出
认为问题可能是继承stdin/stdout句柄和/或再次处理crlf.我也试过:
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,nofork
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,crnl
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk,crnl我找到了另一个抱怨类似的问题的人,但显然没能引起注意
知道出了什么问题吗?
发布于 2015-02-20 17:34:29
Awk正在打印到标准输出,当它指向终端时,它是行缓冲的,如果不是,则完全缓冲;这意味着在它填充缓冲区后,您应该得到输出(例如,它打印了(例如) 4KB )。
您可以通过发送大量输出(例如使用yes程序)来测试这一点;要修复这一点,您应该:- unbuffer的stdout (参见例如https://unix.stackexchange.com/a/25375/63847) -使用来自发送方的关闭(2)系统调用(丑陋)
欢迎任何更好的解决方案。
https://unix.stackexchange.com/questions/185983
复制相似问题