것 같다hping
예완전히 버퍼링됨perl
파이프라인을 통해 행별로 추가 처리를 수행할 때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
는예상되는스크립트는 거의 모든 UNIX를 포함하여 어디에서나 사용할 수 있습니다. Expect를 사용할 수 있습니다. 모든 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 ...