포트에서 수신 대기 중이고 간단한 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]:$
내 주요 스크립트에 netcat
와 faucet
를 대체 할보다 더 행복 할 것이다, 그러나 문제는 독립적 인 서버 프로세스를 생성 할 것입니다 : 내가 netcat
에서 서버 측을 예를 들어, 컬 잘 작동합니다 같은 기본 셸에서 클라이언트를 실행할 수 있습니다. faucet
은 매우 편리합니다. --daemon
매개 변수는 백그라운드로 포크되어 있으므로 $?
(종료 코드)을 사용하여 바인드가 성공했는지 확인할 수 있습니다. 비슷한 목적으로 netcat
을 사용하려면 &
및 $?
을 사용하여 포크 화해야합니다.
누가이 특별한 경우에 faucet
이 올바르게 응답하지 않고 왜이 문제에 대한 해결책을 제안하는지 알 수 있습니까? 나는 faucet
이나 netcat
과 결혼하지 않았지만 bash 또는 유틸리티 (Perl이나 Python과 같은 또 다른 스크립팅 언어에서 뭔가를 작성하는 것과 반대)를 사용하여 솔루션을 구현하고자합니다.
$ (())'안에'(())'' for ((i = PORT_BASE; i
귀하의 조언 주셔서 감사합니다, 귀하의 의견에 따라 내 스크립트를 수정합니다. – mindas