2011-09-04 3 views
0

다음 스크립트를 사용하여 간단한 CGI 서버 (http://www.jfranken.de/homepages/johannes/vortraege/netcat_inhalt.en.html)를 만들려고했습니다. 이게 좋은 아이디어인지 아닌지 기술적 이유에 대한 자세한 내용입니다.netcat을 간단한 CGI 서버로 사용

#!/bin/bash 
export port=${port:-$1} # inherit $1 as $port 
/usr/local/bin/nc -l -p $port -e $0 & # await further connections on this port 
echo "hi" 

왜 이것이 제대로 작동하지 않는지 알고 계십니까? 첫 번째 실행시 터미널에 "hi"를 출력합니다. 그런 다음 netcat이 지정된 포트에서 대기 중이므로 (-e 플래그로 인해) 네트워크 소켓과 연관된 STDOUT을 사용하여이 스크립트의 새 사본을 생성 할 준비가됩니다. 따라서 지정된 포트에 대한 HTTP GET 요청은 "hi"텍스트를 수신합니다.

실제로 어떤 일이 발생하는지는 각 GET 요청이 새로운 netcat 프로세스를 생성하여 한 번에 하나씩 (예상 한대로) 발생 시키지만 모든 netcat 프로세스를 죽일 때까지 GET 요청이 완료되지 않습니다. 이 시점에서 내가 발행 한 첫 번째 GET 요청은 "hi"로 응답하고 다른 모든 요청은 실패한 연결 시도로 돌아옵니다. 나는 이것이 STDOUT 리다이렉션의 세부 사항에 대한 나의 혼란과 관련이 있다고 생각하지만 나의 이해는이 스크립트는 누군가가 연결될 때마다 새로운 버전의 스크립트를 생성 할 것이고 스크립트의 STDIN/OUT은 네트워크 소켓이어야한다는 것이다. -e netcat 플래그 때문에.

답변

0

netcat의 -e 옵션은 -DGAPING_SECURITY_HOLE로 컴파일하지 않으면 작동하지 않습니다.이 옵션은 이런 식으로 일하는 지혜에 잠시 멈춰야합니다. 또한 Hobbit의 netcat 및 bsd-ish 파생물에서만 사용할 수있는 옵션이며 GNU netcat에서는 afaik가 아닙니다.

데이터를 netcat 프로세스로 파이핑하여 원하는 결과를 얻을 수 있습니까? 예를 들어

echo "hi" | nc -l -p $port 

그러나 데이터가 확실하게 접속보다는 이후로 -e 플래그를 사용하여, 수행된다전에 생성되어, 대체로 동일한 효과를 갖는 것으로 보인다. 데이터가 시간 기반이거나 대화식 일 필요가 없다면 이것은 효과적 일 것입니다.

+0

-DGAPING_SECURITY_HOLE 옵션을 사용하여 컴파일했습니다. 커맨드 라인 자체에서 실행할 때 작동하지만 내가 언급 한 스크립트는 예상대로 수행되지 않습니다. – jeffmax

+0

FWIW, 귀하의 코드가 나를 위해 작동하는 것 같습니다. 예외적으로 나는 그것을 시작하는 터미널에서 'hi'를 얻습니다. 그러나 나는 또한 그것을 테스트하기 위해 연결하는 클라이언트 (netcat)에게 배달을 받는다 - 이것은 아마도 목표이다. 그러나 가능하다면, 뭔가를 집행하기 위해 그것을 사용하는 것보다 netcat으로 파이핑 입력을 장려 할 것입니다. –