Redirigir stdin y stdout a puertos

10

Me gustaría tomar un programa Pque lea stdiny escriba stdout, pero que lo conecte nco lo que sea que lea desde un puerto determinado y lo envíe a otro puerto.

# The reading is easy, here P reads from port 50505
nc -l 50505 | P

¿Cómo consigo que escriba de nuevo para decir el puerto 60606?

Yimin Rong
fuente
Su pregunta no es clara como se indicó. ¿Quiere decir que alguien puede abrir 2 conexiones TCP a su máquina, una al puerto 50505 y otra al puerto 50506, enviar datos al primero destinado a ser alimentado Py esperar leer la salida de Pla segunda conexión TCP? ¿Por qué la etiqueta UDP?
Stéphane Chazelas
¡Si! En lo que respecta a UDP, creo que quería ports, pero esa no era una palabra clave existente, así que pensé TCP, y creo que agregué UDPpor reflejo.
Yimin Rong

Respuestas:

12

Me refiero a que alguien puede abrir 2 conexiones TCP a su máquina, una al puerto 50505 y otra al puerto 60606, enviar datos sobre el primero destinado a ser alimentado a P y esperar leer la salida de P de la segunda conexión TCP, entonces eso sería:

< /dev/null nc -q -1 -l 50505 | P | nc -l 60606 > /dev/null

O con socat:

socat -u tcp-listen:50505,reuseaddr - | P | socat -u - tcp-listen:60606,reuseaddr

Para Penviar su salida de vuelta a la misma conexión:

socat tcp-listen:50505,reuseaddr exec:P
Stéphane Chazelas
fuente
3

No es necesario ncpara trabajar con puertos. bashpuede hacer eso por sí mismo:

Bash maneja varios nombres de archivo especialmente cuando se usan en redirecciones, como se describe en la siguiente tabla:

/dev/fd/fd
    If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
    File descriptor 0 is duplicated.
/dev/stdout
    File descriptor 1 is duplicated.
/dev/stderr
    File descriptor 2 is duplicated.
/dev/tcp/host/port
   If host is a valid hostname or Internet address, and port is an integer 
   port number or service name, bash attempts to open a TCP connection to
   the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer 
    port number or service name, bash attempts to open a UDP connection to
    the corresponding socket.
Hauke ​​Laging
fuente
3
/dev/tcpa menudo está deshabilitado y no se puede usar para escuchar . Lo necesita zshsi desea un shell que pueda crear sockets tcp de escucha.
Stéphane Chazelas
@ StéphaneChazelas Tengo que admitir que nunca lo intenté. No dice nada sobre esta restricción en la página de manual, ¿verdad?
Hauke ​​Laging
Bueno, ¿cómo lo harías? Un zócalo de escucha es una puerta para crear más zócalos de aceptación, las redirecciones no funcionan tan bien para eso. zsh usa una función incorporada para eso ( ztcp -lpara escuchar y ztcp -aaceptar conexiones en la toma de escucha).
Stéphane Chazelas