2015-01-16 4 views
1

나는 데이터를 TCP 포트 밖으로 스트리밍하는 도구를 가지고 있으며 스크립트에서 표준 도구를 사용하여 스트림을 사용할 수 있는지 확인하고 싶습니다.스트리밍 서버의 트래픽을 테스트하는 스크립트는 무엇입니까?

수동으로 데이터 스트림을 사용할 수없는 경우 즉시 종료하는 ncat을 사용합니다.

은 여기 내 초기 bash는 스크립트입니다 :

#!/bin/bash 
ncat somehost 1234 >/dev/null & 
pid=$! 
sleep 1 
if [ -d /proc/$pid/ ]; then 
    kill -KILL $pid 
    echo "It's alive, ALIVE\!" 
    # Launch clients 
else 
    echo "He's dead, Jim." 
    # Perform resurrection 
fi 

그것은 작동하지만, 심지어 ncat 작업 제어 또는 procfs의 나에 의존하지 않는이 작업을 수행 할 수있는 간단한 또는 더 나은 방법이 있는지 궁금 하군요. 타임 아웃이 끝나기 전에 얼마나 많은 데이터가 전송되었는지 알고 싶습니다.

그리고 bash ncat host portcat </dev/tcp/host/port으로 바꿀 수 있지만 bash-isms를 피하고 싶습니다. (따라서 busybox에서 작동 할 수 있습니다).

또 다른 접근법은 행/문자 출력을 ncat으로 계산하기 위해 wc을 사용하는 것입니다. 이는 한 줄만 출력하고 연결이 불가능할 경우 종료되기 때문입니다. 하지만 스트림이 끝났다면 영원히 종료를 기다릴 수 없으므로 명령 출력에 액세스 할 때 자체적 인 복잡성이있는 timeout과 같은 것을 사용해야 할 것입니다.

최소한의 종속성으로 작동하는 "일반"접근 방식이 있습니까?

대신 간단한 도구를 써야합니까? 호스트/포트에 연결되면 읽을 바이트 수를 반환하고, 그렇지 않으면 음수 errno를 반환하고 대기 시간 및 프로토콜 사양 (tcp/udp)을 지원합니다. 반환 값 0은 연결이 이루어 졌음을 의미하지만 대기 시간이 만료되기 전에 데이터가 도착하지 않았습니다 (알 수있는 좋은 점).

또는 ncat 패치를 적용 하시겠습니까?

+0

'timeout' 대신에'ncat' 출력을'head -n 3 '으로 재 지정하는 것이 가능합니다. 이것은 3 라인 (활성 스트림을 가리킴) 이후에 파이프 오류를 일으킬 것입니다. 불행히도'ncat '은'SIGPIPE'에 잘 반응하지 않으며'bash'에서 신호 오류를 처리하는 것은 PITA입니다. – BobC

답변

0

netcat in FreeBSD은 포트가 열려 있는지 여부를 단순히 확인하는 -z 옵션이 있습니다. 이렇게하면 스크립트에서 사용중인 배경과 수면이 사라집니다.

-z Specifies that nc should just scan for listening daemons, without 
     sending any data to them. 

옵션은 netcat의 기존 우분투 상자에 있으므로 옵션이 될 수 있습니다.

$ nc -z somehost 1234 && echo "It's alive, ALIVE!" 

ncat에는 해당 옵션이 표시되지 않습니다. netcat을 비지 박스로 컴파일 할 수 있습니다. 적어도 내 시스템에 ncat보다 훨씬 작다 :

리눅스 :

$ ls -lH `which nc ncat` 
-rwxr-xr-x 1 root root 31296 2010-02-21 01:32 /bin/nc 
-rwxr-xr-x 1 root root 130448 2009-11-06 04:39 /usr/bin/ncat 

FreeBSD의 : 물론

ls -l `which nc ncat` 
-r-xr-xr-x 1 root wheel 28112 Jan 15 14:53 /usr/bin/nc 
-rwxr-xr-x 1 root wheel 182775 Mar 19 2012 /usr/local/bin/ncat 

, 이것은 당신이 트래픽의 양을 확인 도움이되지 않습니다 스트림을 통해, 또는 콘텐츠를 분석 할 수 있습니다. 이를 위해서는 혁신적이고 합리적인 솔루션이 필요합니다.하지만 제시 한 문제는 쉽게 해결할 수 없습니다.

ps을 사용하면 procfs 종속성을 피할 수 있으며, 대신 분석을 위해 임시 파일에 저장할 수 있습니다. busybox에는 mktemp이 포함되어야하지만 옵션을 확인해야합니다.나는 이것을 시험하지 않았다 :

#!/bin/sh 

TMPFILE=`mktemp /tmp/str.XXXX` 
trap "rm -f $TMPFILE" 0 1 2 3 15 

nc somehost 1234 > $TMPFILE & 
pid=$! 
sleep 1 

if ps $pid >/dev/null; then 
    kill -KILL $pid 
    echo -n "It's alive, " 
    if [ -s $TMPFILE ]; then 
    echo "ALIVE!" 
    else 
    echo "but unresponsive." 
    fi 
else 
    echo "He's dead, Jim." 
fi 

그게 다예요. 그리고 이미 가지고있는 것과별로 다르지 않습니다.

또 다른 옵션은 자신의 통화 중 저장실로 컴파일 할 수있는 사용자 정의 도구를 작성하는 것일 수도 있지만 질문이 아닌 질문이됩니다. :-)

+0

good ol 'netcat을 돌아볼 생각이 없다. 감사! – BobC

+0

이미 도구에 필요한 C 코드의 대부분을 가지고 있으므로 아마도 그렇게 할 것입니다. – BobC

+0

"nc -w 1 -z somehost 1234"를 사용하면 데이터가 적어도 초당 1 회 이상 예상되는 한 약간 속도가 향상됩니다. – BobC