在 OpenBSD 中关闭 `hping` 的缓冲

在 OpenBSD 中关闭 `hping` 的缓冲

看起来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

两种常见的解决方案stdbufunbuffer

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 ...

相关内容