Estoy tratando de enviar comandos a un puerto tcp usando una netcat
respuesta de tubería
cuando ejecuto netcat
y 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 netcat
para imprimir el texto de respuesta?
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
versión; y en el extremo remoto estátelegram-cli
en la misma máquina.netcat
recibe 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. Sisocat
es una opción, lo recomendaría en su lugar. Solo hay unosocat
, 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.Respuestas:
Como dijo @Patrick, este problema generalmente se debe a
netcat
salir antes de que se haya dado la respuesta. Puede remediar eso agregando-q 2
a la línea de comando, es decir, decirnetcat
que espere 2 segundos después de detectar EOF en la entrada estándar. Obviamente, también puede hacer que espere otros segundos.fuente
-q 2
funcionó pero ¿es confiable? está haciendo una solicitud web ¡No puedo estar seguro de que 2s sea siempre suficiente! puedo ?-w
opción de jugar. Todo esto está en laman nc
página, por supuesto.invalid option -- 'q'
nc
salir inmediatamente en lugar de esperar una respuesta? Si la conexión sigue abierta, no debe haber una opción para hacernc
esperar a que se cierre, no sólo para la entrada estándar a extremoUtilizar este:
El problema es que
nc
cerrará la conexión inmediatamente después de cerrar stdin, lo cual es muy rápido para unamy_command
cadena 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
cat
con-
como segundo argumento: hace quecat
escuchar 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 elecho
comandocat
, también podría ser un archivo con sus comandos a lacat < file - | ...
.Alternativamente, haga esto:
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
cat
o elwhile
bucle ync
seguir corriendo hasta que golpees^C
o^D
sobre 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 ync
después de 1 segundo, perocat
seguirá 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
nc
cliente y el proceso.Esta respuesta se basa en esta respuesta a una pregunta de superusuario idéntica .
fuente
{ echo my_command; cat;}
haría lo mismo y podría considerarse más fácil de entender.Diferentes versiones de OpenBSD-netcat son raras, que necesitan diferentes combinaciones de
-w <seconds>
,-q <seconds>
,-N
y 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:
Pero funciona con -N agregado al servidor o al cliente.
fuente
Sé que esto es un poco viejo, pero ninguna otra respuesta funcionó para mí y esto lo hizo:
Observe el
-N
: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í.
fuente