Come inviare un solo pacchetto UDP con netcat?


121

Voglio inviare solo un valore breve in un pacchetto UDP, ma eseguendo il comando

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

Vedo che il server sta ricevendo la roba hello ma devo premere Ctrl+ cper uscire dal comando netcat.

Come posso smetterla dopo aver inviato ciao ?


Scusa, per il rumore, ho riletto la pagina man e ho trovato l' -qopzione.

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

funziona (si chiude dopo 1 secondo).

Per qualche motivo non funziona con -q0.


Pagina man su debian:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
luckydonald

Risposte:


204

Se stai usando bash, potresti anche scrivere

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

ed evitare tutte le idiosincrasie e le incompatibilità di netcat.

Funziona anche con l'invio ad altri host, ad esempio:

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

Questi non sono dispositivi "reali" sul file system, ma alias "speciali" di bash . Ci sono informazioni aggiuntive nel Manuale di Bash .


24
Ok, hai ragione, lascia che sia esplicito che questo non funzionerà con ZSH.
jturolla

1
Questo è molto meglio che masticare con netcat. Grazie per il consiglio!
johnboiles

3
Questa potrebbe essere la cosa più sorprendente che abbia mai visto.
freb

4
Per qualche motivo, avevo bisogno di usarlo 127.0.0.1invece localhostsu Ubuntu 14.04. (Sì, ce l'ho localhostdentro /etc/hosts.)
tuomassalo

3
/dev/udp/non è un vero file. È solo un nome di file interpretato appositamente da bash.
Peter Eisentraut

46

Non ho trovato l' -q1opzione sul mio netcat. Invece ho usato l' -w1opzione. Di seguito è riportato lo script bash che ho fatto per inviare un pacchetto udp a qualsiasi host e porta:

#!/bin/bash

def_host=localhost
def_port=43211

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

echo -n "$1" | nc -4u -w1 $HOST $PORT

OS X funziona così: "echo -n" test "| nc -4u -w0 localhost 9999" come dice SimonW
Simon Unsworth

14

Su un netcat corrente (v0.7.1) hai un interruttore -c:

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

Quindi,

echo "hi" | nc -cu localhost 8000

dovrebbe fare il trucco.


3
È importante notare che questo è vero solo per GNU netcat, ma non per BSD netcat.
MarSoft

Per chiarezza, con netcat basato su Linux, l'opzione -c richiede un comando come argomento, che "esegue l'argomento dato tramite / bin / bash" - commandlinux.com/man-page/man1/nc.1.html
Blake Neal

5

Netcat invia un pacchetto per newline. Quindi stai bene. Se fai qualcosa di più complesso, potresti aver bisogno di qualcos'altro.

Stavo scherzando con Wireshark quando me ne sono reso conto. Non so se aiuta.


3
Penso che questo sia corretto solo per TCP. Con UDP, invierà più linee in un pacchetto (se si adattano).
sleske

1
No. Basta fare un test echo -n "hello\nworld" >/dev/udp/localhost/514e riceverai 2 righe
bebbo

5

Ho avuto lo stesso problema ma utilizzo l' -w 0opzione per inviare un solo pacchetto e uscire. Dovresti usare questo comando:

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

nc 1.10-41 + b1 non accetta -w0. Errore: tempo di attesa non valido 0
palik
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.