netcat no imprime la respuesta

12

Estoy tratando de enviar comandos a un puerto tcp usando una netcatrespuesta de tubería
cuando ejecuto netcaty escribo mi comando, imprime la respuesta correctamente, pero cuando paso el comando desde una tubería, envía el comando correctamente pero no imprime la respuesta

Entonces, esto funciona correctamente:

netcat  localhost 9009

mientras que esto solo envía un comando pero no imprime la respuesta:

echo 'my_command' | netcat  localhost 9009

¿por qué?
¿Cómo puedo hacer netcatpara imprimir el texto de respuesta?

RYN
fuente
esto es, probablemente, pasando a ti
Jeff Schaller
@JeffSchaller: no! ¡desafortunadamente usar esos comandos no ayuda! ¡Esta vez se bloquea para siempre!
RYN
¿Qué netcat estás usando? Desafortunadamente, hay una docena de variaciones diferentes de la herramienta netcat, y no todas se comportan igual. Además, ¿qué hay en el extremo remoto?
Patrick
@Patrick: mi netcat es la OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)versión; y en el extremo remoto está telegram-clien la misma máquina.
RYN
Creo que encontré una página de manual para ese netcat, pero no veo ningún indicador que controle lo que sospecho que está sucediendo. Sospecho que una vez que netcatrecibe el EOF en STDIN, que inmediatamente apaga ambos lados del zócalo en lugar de cerrar a medias y esperar a que el lado remoto cierre su extremo. Si socates una opción, lo recomendaría en su lugar. Solo hay uno socat, por lo que no tiene los problemas de portabilidad, ya que hay una docena de sabores diferentes, se comporta de manera mucho más sensata y es altamente configurable.
Patrick

Respuestas:

8

Como dijo @Patrick, este problema generalmente se debe a netcatsalir antes de que se haya dado la respuesta. Puede remediar eso agregando -q 2a la línea de comando, es decir, decir netcatque espere 2 segundos después de detectar EOF en la entrada estándar. Obviamente, también puede hacer que espere otros segundos.

Ralph Rönnquist
fuente
Gracias; -q 2funcionó pero ¿es confiable? está haciendo una solicitud web ¡No puedo estar seguro de que 2s sea siempre suficiente! puedo ?
RYN
1
Use un número mayor para que espere más tiempo, o algún número negativo para que espere indefinidamente. También existe la -wopción de jugar. Todo esto está en la man ncpágina, por supuesto.
Ralph Rönnquist
55
diceinvalid option -- 'q'
phil294
Creo que una buena pregunta de seguimiento es: ¿por qué ncsalir inmediatamente en lugar de esperar una respuesta? Si la conexión sigue abierta, no debe haber una opción para hacer ncesperar a que se cierre, no sólo para la entrada estándar a extremo
theferrit32
6

Utilizar este:

cat <(echo command) - | nc host port

El problema es que nccerrará la conexión inmediatamente después de cerrar stdin, lo cual es muy rápido para una my_commandcadena simple y, por lo tanto, nunca tiene la oportunidad de recibir una respuesta. (Si canaliza un archivo muy grande, verá que podría obtener una respuesta antes de que termine de enviar el archivo).

Ingrese catcon -como segundo argumento: hace que catescuchar en stdin para obtener más contenido a través del cual se ha enviado el contenido del primer argumento. El primer argumento es solo obtener el echocomando cat, también podría ser un archivo con sus comandos a la cat < file - | ....

Alternativamente, haga esto:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

Esto envía #caracteres ilimitados en la segunda línea de la entrada. Usar #trabajos para un bash como control remoto que ignoraría esto como un comentario. Elegí un pequeño tiempo de espera de 10 milisegundos aquí, por lo que reacciona más rápido al final de la conexión. YMMV.

La desventaja de eso puede ser eso cato el whilebucle y ncseguir corriendo hasta que golpees ^Co ^Dsobre el shell. Realmente depende del extremo remoto.

Agregar un tiempo de espera usando -w 1(OSX netcat) o -i 1(nmap's ncat) hace que cierre la conexión y ncdespués de 1 segundo, pero catseguirá funcionando hasta que ingrese algún carácter y la tubería se rompa (creo).

Sin embargo, funciona si el lado remoto cerrará automáticamente la conexión después de recibir y manejar el comando; esto también terminará con el nccliente y el proceso.

Esta respuesta se basa en esta respuesta a una pregunta de superusuario idéntica .

Alexander Klimetschek
fuente
{ echo my_command; cat;}haría lo mismo y podría considerarse más fácil de entender.
G-Man dice 'reinstalar a Monica' el
1

Diferentes versiones de OpenBSD-netcat son raras, que necesitan diferentes combinaciones de -w <seconds>, -q <seconds>, -Ny diferentes argumentos, incluso necesitar dependiendo de lo que se está ejecutando en el otro extremo de la conexión. El uso de opciones de tiempo de espera con ciertas versiones o servidores causa retrasos, y no usarlos puede resultar en un retraso extremadamente largo (¿infinito?). Y esperaría diferentes peculiaridades con gnu netcat, pero no sé si son diferentes entre las versiones de la misma.

Por ejemplo, la versión 1.130_3 de archlinux tarda mucho (¿para siempre?) Cuando hago esto:

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

Pero funciona con -N agregado al servidor o al cliente.

Peter
fuente
1

Sé que esto es un poco viejo, pero ninguna otra respuesta funcionó para mí y esto lo hizo:

echo 'test' | netcat -N $server $port

Observe el -N:

apague el socket de red después de EOF en la entrada. Algunos servidores requieren esto para terminar su trabajo.

Me funcionó tanto en Windows como en Linux.

Nota: Esta es una copia y pega de la respuesta que publiqué para una pregunta duplicada .

Estoy pensando que esto podría ser útil. Los mods se sienten libres de editar / eliminar si esto va en contra de la política o algo así.

yannick1976
fuente