Я пытаюсь разрешить моей системе Debian 7 прослушивать порт 1815 netcat
и перенаправлять входящий трафик на VacuumFluorecentDisplay. Iptables открыты, и я использую inetd вместо xinetd (поставляется с дистрибутивом). Но я не могу заставить его работать так, как мне хочется
добавил следующую строку в /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. (В режиме «wait» они наследуют «прослушивающий» сокет, а в режиме «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