Netcat как служба inetd на порту 1815 и перенаправление входящих на /dev/ttyS2

Netcat как служба inetd на порту 1815 и перенаправление входящих на /dev/ttyS2

Я пытаюсь разрешить моей системе 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

Это неверно почти во всех отношениях.

  1. Параметры командной строки в inetd должны быть указаны как отдельные слова – не заключенные в кавычки как одна строка. Например (только для демонстрации изменения синтаксиса; это все равно не будет работать как есть):

    -- vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2"
    ++ vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2
    
  2. По историческим причинам 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
    
  3. 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
    
  4. Наконец, нельзя сказать двум программам, чтобы они по отдельности слушали один и тот же порт. Весь смысл 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
    

Связанный контент