cns*_*nst 2 shell pipe io-redirection openbsd output
这样看来,从输出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 基础中没有解决方案:
有两种常见的解决方案,stdbuf和unbuffer。
stdbuf来自 GNU coreutils,它是在 2009 年的 7.5 版中添加的,因此它已被用于除 CentOS 5 之外的所有当前非嵌入式 Linux 系统。自 8.4 版以来,它也在 FreeBSD 中。我所知道的其他 Unix 变体还没有采用它,尤其是 OpenBSD 5.4。
unbuffer是一个Expect脚本,因此在 Expect 可用的任何地方都可用,其中几乎包括任何 unix。所有 BSD 变体都在它们的端口集合中,在expert包中。
所以安装expect包并运行unbuffer hping … | perl …