Estou tentando permitir que meu sistema Debian 7 escute na porta 1815 netcat
e 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.
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
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
O inetd não usa shell para iniciar os serviços, portanto não há nada que interprete o
> /dev/ttyS2
redirecionamento; 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
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 -l
como 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