Estoy intentando permitir que mi sistema Debian 7 escuche en el puerto 1815 netcat
y redirija el tráfico entrante a VacuumFluorecentDisplay. Las iptables están abiertas y estoy usando inetd en lugar de xinetd (viene con la distribución). Pero no puedo hacer que funcione como quiero.
agregó la siguiente línea a /etc/services
vfd 1815/tcp
vfd 1815/udp
Agregué la siguiente línea a /etc/inetd.conf.
vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2"
Respuesta1
Esto está mal en casi todos los sentidos posibles.
Los parámetros de la línea de comandos en inetd deben especificarse como palabras individuales, no entre comillas como una sola cadena. Por ejemplo (solo para demostrar el cambio de sintaxis; aún así no funcionará tal 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 razones históricas, inetd requiere el binario del servicio.yel argumento 0 de la línea de comandos se especificará por separado, aunque normalmente sean los mismos. Por ejemplo (tenga en cuenta que 'nc' ahora se especifica dos veces):
-- vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2
inetd no utiliza un shell para iniciar los servicios, por lo que no hay nada que interprete la
> /dev/ttyS2
redirección; todo se pasa simplemente a nc como argumento de línea de comandos y nc no sabe qué hacer con ello.Éste requiere cambios significativos, ya sea usando explícitamente un shell para ejecutar su 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"
...o usando una herramienta completamente diferente, una que sea capaz de abrir el archivo sin depender de la redirección del 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, no se puede decir a dos programas que escuchen individualmente en el mismo puerto. El objetivo de inetd es queinetd y solo inetdcreará el socket de "escucha" inicial y los servicios basados en inetd solo usarán los sockets que hayanheredadodel inetd "padre". (En el modo 'espera' heredan el socket de "escucha" y en el modo "nowait" heredan los sockets de conexión de cliente individuales).
En otras palabras, no tiene sentido usarlo
nc -l
como servicio de inetd, porque le estás pidiendo que duplique todo lo que inetd ya ha hecho. En su lugar, el servicio necesita utilizar la entrada/salida estándar existente (que inetd ha conectado al socket de conexión).Por ejemplo, esto finalmente debería funcionar correctamente:
vfd stream tcp nowait root /bin/sh sh -c "cat > /dev/ttyS2"
Esto también debería funcionar:
vfd stream tcp nowait root /bin/socat socat -u stdio file:/dev/ttyS2