看起来hping
是全缓冲当perl
通过管道进行进一步逐行处理时,所以管道 hping 到 perl不起作用。
hping --icmp-ts example.ca | perl -ne 'if (/Originate=(\d+) Receive=(\d+) Transmit=(\d+)/) { ($o, $r, $t) = ($1, $2, $3); } if (/tsrtt=(\d+)/) { print $r - $o, " ", $o + $1 - $t, "\n"; }'
如何将 hping 更改为全缓冲存在行缓冲什么时候用管道输送?
不是以下问题的重复,因为没有解决方案适用于 OpenBSD 基础:
答案1
有两种常见的解决方案,stdbuf
和unbuffer
。
stdbuf
来自 GNU coreutils,它于 2009 年在 7.5 版本中添加,因此它已经进入除 CentOS 5 之外的所有当前非嵌入式 Linux 系统。自 8.4 版本以来,它也出现在 FreeBSD 中。据我所知,还没有其他 UNIX 变体采用它,特别是 OpenBSD 5.4 版本中还没有采用它。
unbuffer
是一个预计脚本,因此在所有 Expect 可用的地方都可用,其中几乎包括任何 UNIX。所有 BSD 变体都在其端口集合中的expert
包中包含它。
所以安装expect
包并运行unbuffer hping … | perl …
答案2
另一种选择可能是使用socat
:
# cf. http://unix.stackexchange.com/a/25377
socat EXEC:'hping --icmp-ts example.ca',pty,ctty STDIO | perl -ne 'if ...