netcat
내 Debian 7 시스템이 포트 1815에서 수신 대기 하고 들어오는 트래픽을 VacuumFluorcentDisplay로 리디렉션하도록 하려고 합니다 . Iptables가 열려 있고 xinetd 대신 inetd를 사용하고 있습니다(distro와 함께 제공됨). 하지만 원하는 대로 작동할 수는 없습니다.
/etc/services에 다음 줄을 추가했습니다.
vfd 1815/tcp
vfd 1815/udp
/etc/inetd.conf에 다음 줄을 추가했습니다.
vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2"
답변1
이것은 거의 모든 면에서 잘못된 것입니다.
inetd의 명령줄 매개변수는 단일 문자열로 인용되지 않고 개별 단어로 지정되어야 합니다. 예를 들어(구문 변경을 보여주기 위한 것일 뿐이며 여전히 그대로 작동하지는 않습니다):
-- vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2" ++ vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2
역사적인 이유로 inetd에는 서비스의 바이너리가 필요합니다.그리고0번째 명령줄 인수는 일반적으로 동일하더라도 별도로 지정됩니다. 예를 들어('nc'는 이제 두 번 지정됩니다):
-- vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2
inetd는 서비스를 시작하기 위해 쉘을 사용하지 않으므로 리디렉션을 해석할 수 있는 것이 없습니다
> /dev/ttyS2
. 모든 것이 단순히 명령줄 인수로 nc에 전달되고 nc는 이를 어떻게 해야할지 모릅니다.여기에는 상당한 변경이 필요합니다. 즉, 명시적으로 셸을 사용하여 명령을 실행하거나...
-- vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/sh sh -c "nc -l 1815 > /dev/ttyS2"
...또는 쉘 리디렉션에 의존하지 않고 파일을 열 수 있는 완전히 다른 도구를 사용합니다.
-- vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/socat socat -u tcp-listen:1815 file:/dev/ttyS2
마지막으로 두 프로그램이 동일한 포트에서 개별적으로 수신하도록 지시할 수 없습니다. inetd의 요점은 다음과 같습니다.inetd 및 inetd만초기 "수신" 소켓을 생성하고 inetd 기반 서비스는 자신이 보유한 소켓만 사용합니다.물려받은"부모" inetd에서. ('대기' 모드에서는 "수신" 소켓을 상속하고, "nowait" 모드에서는 개별 클라이언트 연결 소켓을 상속합니다.)
즉,
nc -l
inetd가 이미 수행한 모든 것을 복제하도록 요청하기 때문에 inetd 서비스로 사용하는 것은 의미가 없습니다. 대신 서비스는 기존 stdin/stdout(inetd가 연결 소켓에 연결되어 있음)을 사용해야 합니다.예를 들어, 다음은 마침내 올바르게 작동할 것입니다:
vfd stream tcp nowait root /bin/sh sh -c "cat > /dev/ttyS2"
이것은 또한 작동합니다:
vfd stream tcp nowait root /bin/socat socat -u stdio file:/dev/ttyS2