首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过tcp公开awk (inetd、socat等)

通过tcp公开awk (inetd、socat等)
EN

Unix & Linux用户
提问于 2015-02-20 17:28:19
回答 1查看 1.4K关注 0票数 2

我在玩awk,我想通过tcp套接字公开它。

一开始我试过,但在微信息网络上失败了。考虑到问题可能在于回车/换行符的处理方式,我决定尝试切换到socat。

使用带有套接字的远程命令非常容易:

代码语言:javascript
复制
socat TCP4-LISTEN:9000 EXEC:/bin/cat
socat TCP4-LISTEN:9000 SYSTEM:"/bin/python -i"

这两项工作

但是,当尝试使用简单的awk命令(例如‘awk '{print NR}’以逐步计数接收的行数)时,当从同一台机器上的另一个shell连接套接字时,我不会得到任何返回。

我尝试了很多事情(其中一些失败了,但语法错误对我来说有点模糊)。我甚至无法尝试对socat进行限制,以查看具体执行的是什么,因为实际的命令exec‘’ing被委托给shell):

代码语言:javascript
复制
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

代码语言:javascript
复制
#! /bin/sh
/usr/bin/awk '{print NR}'

(也使用exec变体)

代码语言:javascript
复制
#! /bin/sh
exec /usr/bin/awk '{print NR}'

这两种方法都在本地工作,但是当调用

代码语言:javascript
复制
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk

它不会让我返回输出

认为问题可能是继承stdin/stdout句柄和/或再次处理crlf.我也试过:

代码语言:javascript
复制
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

我找到了另一个抱怨类似的问题的人,但显然没能引起注意

知道出了什么问题吗?

EN

回答 1

Unix & Linux用户

发布于 2015-02-20 17:34:29

Awk正在打印到标准输出,当它指向终端时,它是行缓冲的,如果不是,则完全缓冲;这意味着在它填充缓冲区后,您应该得到输出(例如,它打印了(例如) 4KB )。

您可以通过发送大量输出(例如使用yes程序)来测试这一点;要修复这一点,您应该:- unbuffer的stdout (参见例如https://unix.stackexchange.com/a/25375/63847) -使用来自发送方的关闭(2)系统调用(丑陋)

欢迎任何更好的解决方案。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/185983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档