¿Cómo enviar solo un paquete UDP con netcat?

121

Quiero enviar solo un valor corto en un paquete UDP, pero ejecutando el comando

echo -n "hello" | nc -4u localhost 8000

Puedo ver que el servidor está recibiendo el mensaje de saludo, pero tengo que presionar Ctrl+ cpara salir del comando netcat.

¿Cómo puedo hacer que se cierre después de enviar un saludo ?


Lo siento, por el ruido, volví a leer la página del manual y encontré la -qopción.

 echo -n "hello" | nc -4u -q1 localhost 8000

funciona (se cierra después de 1 segundo).

Por alguna razón, no funciona con -q0.

Janne H
fuente
Página de -q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
manual

Respuestas:

204

Si está usando bash, también podría escribir

echo -n "hello" >/dev/udp/localhost/8000

y evitar todas las idiosincrasias e incompatibilidades de netcat.

Esto también funciona enviando a otros hosts, por ejemplo:

echo -n "hello" >/dev/udp/remotehost/8000

Estos no son dispositivos "reales" en el sistema de archivos, pero bash alias "especiales" . Hay información adicional en el Manual de Bash .

Peter Eisentraut
fuente
24
Ok, tienes razón, déjame aclarar que esto no funcionará con ZSH.
jturolla
1
Esto es mucho mejor que jugar con netcat. ¡Gracias por el consejo!
johnboiles
3
Esto puede ser lo más asombroso que he visto en mi vida.
Freb
4
Por alguna razón, necesitaba usar 127.0.0.1en su lugar localhosten Ubuntu 14.04. (Sí, lo tengo localhosten /etc/hosts.)
tuomassalo
3
/dev/udp/no es un archivo real. Es solo un nombre de archivo interpretado especialmente por bash.
Peter Eisentraut
46

No encontré la -q1opción en mi netcat. En su lugar, usé la -w1opción. A continuación se muestra el script bash que hice para enviar un paquete udp a cualquier host y puerto:

#!/bin/bash

def_host=localhost
def_port=43211

HOST=${2:-$def_host}
PORT=${3:-$def_port}

echo -n "$1" | nc -4u -w1 $HOST $PORT
TraderJoeChicago
fuente
OS X funciona así: "echo -n" test "| nc -4u -w0 localhost 9999" como dice SimonW
Simon Unsworth
14

En un netcat actual (v0.7.1) tiene un interruptor -c:

-c, --close                close connection on EOF from stdin

Por lo tanto,

echo "hi" | nc -cu localhost 8000

debería hacer el truco.

Simón
fuente
3
Es importante tener en cuenta que esto es cierto solo para GNU netcat, pero no para BSD netcat.
MarSoft
Para mayor claridad, con netcat basado en Linux, la opción -c requiere un comando como argumento, que "ejecuta el argumento dado a través de / bin / bash" - commandlinux.com/man-page/man1/nc.1.html
Blake Neal
5

Netcat envía un paquete por línea nueva. Entonces estás bien. Si hace algo más complejo, es posible que necesite algo más.

Estaba jugando con Wireshark cuando me di cuenta de esto. No sé si ayuda.

Evan
fuente
3
Creo que esto solo es correcto para TCP. Con UDP, enviará varias líneas en un paquete (si encajan).
sleske
1
No. Simplemente pruebe echo -n "hello\nworld" >/dev/udp/localhost/514y obtendrá 2 líneas
bebbo
5

Tuve el mismo problema, pero utilizo la -w 0opción para enviar solo un paquete y salir. Deberías usar este comando:

echo -n "hello" | nc -4u -w0 localhost 8000
Sajjad Baeidi
fuente
nc 1.10-41 + b1 no acepta -w0. Error: tiempo de espera no válido 0
palik