Netcat como um serviço inetd na porta 1815 e redireciona a entrada para /dev/ttyS2

Netcat como um serviço inetd na porta 1815 e redireciona a entrada para /dev/ttyS2

Estou tentando permitir que meu sistema Debian 7 escute na porta 1815 netcate redirecione o tráfego de entrada para um VacuumFluorecentDisplay. Iptables estão abertos e estou usando inetd em vez de xinetd (veio com a distro). Mas não consigo fazer funcionar como quero

adicionei a seguinte linha ao /etc/services

vfd             1815/tcp                      
vfd             1815/udp    

adicionou a seguinte linha ao /etc/inetd.conf.

vfd stream tcp nowait  root     /bin/nc "-l 1815 > /dev/ttyS2"

Responder1

Isso está errado em quase todos os sentidos possíveis.

  1. Os parâmetros da linha de comando no inetd precisam ser especificados como palavras individuais – não citados como uma única string. Por exemplo (apenas para demonstrar a mudança de sintaxe; ainda não funcionará como está):

    -- vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2"
    ++ vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2
    
  2. Por razões históricas, o inetd requer o binário do serviçoeo 0º argumento da linha de comando a ser especificado separadamente, embora normalmente sejam iguais. Por exemplo (observe que 'nc' agora é especificado duas vezes):

    -- vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2
    ++ vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2
    
  3. O inetd não usa shell para iniciar os serviços, portanto não há nada que interprete o > /dev/ttyS2redirecionamento; tudo é simplesmente passado para nc como um argumento de linha de comando e nc não sabe o que fazer com isso.

    Este requer mudanças significativas – usando explicitamente um shell para executar seu comando...

    -- 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"
    

    ...ou usando uma ferramenta totalmente diferente, capaz de abrir o arquivo sem depender do redirecionamento do shell:

    -- 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. Finalmente, dois programas não podem ser instruídos a escutar individualmente na mesma porta. O ponto principal do inetd é queinetd e apenas inetdcriará o soquete de "escuta" inicial e os serviços baseados em inetd usarão apenas os soquetes que elesherdadodo inetd "pai". (No modo 'espera' eles herdam o soquete de "escuta" e no modo "nowait" eles herdam os soquetes individuais de conexão do cliente.)

    Em outras palavras, não faz sentido usar nc -lcomo um serviço do inetd, porque você está pedindo para duplicar tudo o que o inetd já fez. Em vez disso, o serviço precisa usar o stdin/stdout existente (que o inetd anexou ao soquete de conexão).

    Por exemplo, isso deve finalmente funcionar corretamente:

    vfd stream tcp nowait root /bin/sh sh -c "cat > /dev/ttyS2"
    

    Isso também deve funcionar:

    vfd stream tcp nowait root /bin/socat socat -u stdio file:/dev/ttyS2
    

informação relacionada