2011-01-08 4 views
3

포트에서 수신 대기 중이고 간단한 HTTP 응답으로 응답하는 간단한 bash 스크립트를 작성하려고합니다. 내 특정 문제는 포트를 사용할 수 있는지 잘 모르겠다. 바인드 실패의 경우 바인드가 성공할 때까지 다음 포트로 폴백한다. 내가 netpipes 우분투 패키지에서 faucet를 사용하고 여기에netpipes/netcat을 사용하여 포트에 바인딩

for ((i=$PORT_BASE; i < $(($PORT_BASE+$PORT_RANGE)); i++)) 
do 
    if [ $DEBUG -eq 1 ] ; then 
    echo trying to bind on $i 
    fi 
    /usr/bin/faucet $i --out --daemon echo test 2>/dev/null 
    if [ $? -eq 0 ] ; then      #success? 
    port=$i 
    if [ $DEBUG -eq 1 ] ; then 
     echo "bound on port $port" 
    fi 
    break 
    fi 
done 

: 뭔가처럼

지금까지 나에게 이것을 달성하는 가장 쉬운 방법이었다.

출력에 "test"를 단순히 인쇄하면 curl이 비표준 HTTP 응답 (오류 코드 18)에 대해 불만을 나타냅니다. HTTP 호환 응답을 인쇄하지 않아도 충분합니다. 내가 echo -ne "HTTP/1.0 200 OK\r\n\r\ntest"으로 echo test를 교체 할 경우

는 컬은 여전히 ​​불평 :

[email protected]:$ faucet 10020 --out --daemon echo -ne "HTTP/1.0 200 OK\r\n\r\ntest" 
... 
[email protected]:$ curl ip.of.the.server:10020 
curl: (56) Failure when receiving data from the peer 

나는 문제가 faucet 응답을 인쇄하고 연결을 처리하는 방법에있다 생각합니다.

[email protected]:$ echo -ne "HTTP/1.0 200 OK\r\n\r\ntest\r\n" | nc -l 10020 
... 
[email protected]:$ curl ip.of.the.server:10020 
test 
[email protected]:$ 

내 주요 스크립트에 netcatfaucet를 대체 할보다 더 행복 할 것이다, 그러나 문제는 독립적 인 서버 프로세스를 생성 할 것입니다 : 내가 netcat에서 서버 측을 예를 들어, 컬 잘 작동합니다 같은 기본 셸에서 클라이언트를 실행할 수 있습니다. faucet은 매우 편리합니다. --daemon 매개 변수는 백그라운드로 포크되어 있으므로 $? (종료 코드)을 사용하여 바인드가 성공했는지 확인할 수 있습니다. 비슷한 목적으로 netcat을 사용하려면 &$?을 사용하여 포크 화해야합니다.

누가이 특별한 경우에 faucet이 올바르게 응답하지 않고 왜이 문제에 대한 해결책을 제안하는지 알 수 있습니까? 나는 faucet이나 netcat과 결혼하지 않았지만 bash 또는 유틸리티 (Perl이나 Python과 같은 또 다른 스크립팅 언어에서 뭔가를 작성하는 것과 반대)를 사용하여 솔루션을 구현하고자합니다.

+1

$ (())'안에'(())'' for ((i = PORT_BASE; i

+0

귀하의 조언 주셔서 감사합니다, 귀하의 의견에 따라 내 스크립트를 수정합니다. – mindas

답변

4
faucet 10020 --out --daemon \ 
    echo -ne "HTTP/1.0 200 OK\r\nContent-Length: 4\r\n\r\ntest" 

잘 작동합니다. 이 문제는 echo이 정확히 shutdown 소켓을 사용하는 대신 정확히 close을 사용하는 것으로 보이며 curlrecvfrom에서 0 (정상 종료)이 아닌 -1 (비정상 종료)이 발생하는 것에 만족하지 않습니다.

socat 시도해 보니 아이가 완료된 후에 정리됩니다.

socat tcp-l:10020,fork,reuseaddr \ 
    exec:'echo -ne "HTTP/1.0 200 OK\r\n\r\ntest"' 
+0

완벽하게 작동하는 답변, 정말 고마워요! – mindas

1

정말로 HTTP 프로토콜을 사용해야합니까, 아니면 말리세요? 이 후자의 경우, 단순히

hose $server $port --in cat 
+0

예, HTTP 프록시 모니터링을 수행하는 최종 결과로 HTTP를 사용해야합니다. – mindas

1

faucet $port --out --daemon echo test 

을 결합 방법 DJB ucspi-TCP 패키지에서 tcpserver는라는 프로그램을 사용하는 방법에 대한.

http://lserinol.blogspot.com/2008/12/simple-tcp-server-with-djb-tcpserver.html

netcat을 행 고급 대체 또는 NC는 각각 ncat (nmap이 부분)이다.

+0

제안 해 주셔서 감사합니다.하지만, 필자가 man 페이지를 잘못 읽지 않았다면, tcpserver와 ncat 모두 netcat보다 우수합니다 (제 맥락에서). 질문의 요점은'수도꼭트'가 왜 반응하지 못하는지 이해하거나 프로세스 상태를 확인할 수 있도록 bash (예 : 수도꼭지와 netcat과는 다른)에서 분기하지 않아도되는 대안을 갖는 것입니다. – mindas

2

리차드 스티븐스 (Richard Stevens)의 "양말"프로그램을 살펴볼 수도 있습니다. 그것은이 있습니다

-F fork after connection accepted (TCP concurrent server) 

http://www.icir.org/christian/sock.html

그리고 당신도 할 수있다 Bash를 이용한 사용 :

그것은`사용할 필요는 없습니다
echo $'HTTP/1.0 200 OK\r\n\r\ntest\r\n' 
+0

수도꼭지 솔루션이 이미 작동하고 있지만 고마워요. – mindas

관련 문제