¿Cómo puedo canalizar comandos a un netcat que permanecerá vivo?
32
echo command | netcat host port
Esto hace que el comando se envíe al host remoto y que se lean algunos datos. Pero después de unos segundos, la conexión se cierra. El parámetro -w no cambió nada. Estoy usando netcat v1.10 en SuSE 10.1.
Es agradable, ya que funciona en un sistema integrado muy básico, donde netcat carece de todas las opciones sofisticadas.
SF.
{ echo command; cat;}haría lo mismo y podría considerarse más fácil de entender.
G-Man dice 'Restablecer a Monica' el
1
Según lo veo, el netcatcomando mantendrá el socket abierto hasta que vea el final de la entrada. Todos estos ejemplos demuestran esto sin decir mucho sobre por qué . Estoy interactuando con el servidor usando durante un período prolongado simplemente usando: . SocketTest es una herramienta útil que puede escuchar o servir en cualquier puerto TCP o UDP. SocketTestnetcatcat - | nc localhost 8063
No creo que vayas a manejar esto con netcat o socat. Acabo de hacer muchos ajustes con ambos, y Socat parecía el más prometedor.
Logré configurar socat para conectarme al puerto TCP remoto y escuchar en un socket de dominio unix local (en teoría, por lo que el enlace podría mantenerse todo el tiempo), pero tan pronto como el proceso local se separó del socket unix (otro socat vinculando el socket de Unix a stdin / out) cerró la sesión de socat TCP.
El problema aquí es que cada conexión a través de netcat / socat realiza una nueva conexión de flujo TCP al servidor, y cierra esa sesión de flujo TCP cuando el extremo local se desconecta.
Creo que probablemente tendrá que escribir un software proxy personalizado para esto que abra la conexión TCP al extremo remoto y luego escuche localmente en un socket / pipe / fifo o lo que sea y luego simplemente envíe los datos por la tubería TCP existente y devuelve los resultados.
¿Podría ser que la conexión esté cerrada en el otro extremo del zócalo?
Por defecto, nccierra la conexión después de la finalización, si no le dice explícitamente que se quede escuchando (con la -kopción):
-k Forces nc to stay listening for another connection after its current
connection is completed. It is an error to use this option without the
-l option.
Ver man nc.1.
Estoy transmitiendo datos con éxito entre dos máquinas como esta:
remitente:
while (true); do
echo -n "$RANDOM " | nc <host> <port>
done
El método de Georges funciona bien desde un shell interactivo, pero no ayudará con los scripts, por ejemplo, cuando llama a su script como nohup ./script &.
Encontré que reemplazar stdin con un dummy fifo ayuda.
mkfifo dummy
cat command.txt dummy | nc host port
Como nada escribe en el fifo, después de generar el archivo, se catcuelga indefinidamente.
Changes the (address dependent) method of shutting down the write part of a connection to not do anything.
Probablemente también deba anular el período de tiempo de espera predeterminado utilizando -t <timeout>, de lo contrario, el socket se cerrará después de 0.5s. Esta opción anula el comportamiento predeterminado, que es:
When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.
Su comando finaliza, si el host remoto cierra la conexión (o no es accesible) o el comando antes de que finalice la canalización (mientras netcat aún envía el resto de su cola de entrada).
Respuestas:
Esto funciona con el
nc
comando en OS X (suponiendo que el comando que desea enviar esté en un archivo):(Básicamente,
cat
volca el contenido del archivo en stdout y luego te espera en stdin).Por extensión, si desea enviar el comando desde el propio shell, puede hacer esto:
fuente
{ echo command; cat;}
haría lo mismo y podría considerarse más fácil de entender.netcat
comando mantendrá el socket abierto hasta que vea el final de la entrada. Todos estos ejemplos demuestran esto sin decir mucho sobre por qué . Estoy interactuando con el servidor usando durante un período prolongado simplemente usando: . SocketTest es una herramienta útil que puede escuchar o servir en cualquier puerto TCP o UDP.SocketTest
netcat
cat - | nc localhost 8063
Con
nc
en Ubuntu:Desde la página del manual de Ubuntu
nc
:Tenga en cuenta que las
nc
opciones disponibles varían mucho entre las distribuciones, por lo que esto podría no funcionar en la suya (OpenSUSE).fuente
Lo encontré:
Mi compañero de trabajo lo sabía. No veo eso en la documentación en absoluto.
fuente
No creo que vayas a manejar esto con netcat o socat. Acabo de hacer muchos ajustes con ambos, y Socat parecía el más prometedor.
Logré configurar socat para conectarme al puerto TCP remoto y escuchar en un socket de dominio unix local (en teoría, por lo que el enlace podría mantenerse todo el tiempo), pero tan pronto como el proceso local se separó del socket unix (otro socat vinculando el socket de Unix a stdin / out) cerró la sesión de socat TCP.
El problema aquí es que cada conexión a través de netcat / socat realiza una nueva conexión de flujo TCP al servidor, y cierra esa sesión de flujo TCP cuando el extremo local se desconecta.
Creo que probablemente tendrá que escribir un software proxy personalizado para esto que abra la conexión TCP al extremo remoto y luego escuche localmente en un socket / pipe / fifo o lo que sea y luego simplemente envíe los datos por la tubería TCP existente y devuelve los resultados.
fuente
¿Podría ser que la conexión esté cerrada en el otro extremo del zócalo?
Por defecto,
nc
cierra la conexión después de la finalización, si no le dice explícitamente que se quede escuchando (con la-k
opción):Ver
man nc.1
.Estoy transmitiendo datos con éxito entre dos máquinas como esta:
remitente:
receptor:
fuente
El método de Georges funciona bien desde un shell interactivo, pero no ayudará con los scripts, por ejemplo, cuando llama a su script como
nohup ./script &
.Encontré que reemplazar stdin con un dummy fifo ayuda.
Como nada escribe en el fifo, después de generar el archivo, se
cat
cuelga indefinidamente.fuente
socat
Lashut-none
opción debería ayudar aquí:Probablemente también deba anular el período de tiempo de espera predeterminado utilizando
-t <timeout>
, de lo contrario, el socket se cerrará después de 0.5s. Esta opción anula el comportamiento predeterminado, que es:Entonces, un comando como:
mantendrá el socket abierto durante 10 segundos después de enviar el 'bla'.
fuente
Su comando finaliza, si el host remoto cierra la conexión (o no es accesible) o el comando antes de que finalice la canalización (mientras netcat aún envía el resto de su cola de entrada).
fuente