2012-03-14 1 views
79

Voglio inviare un solo valore a breve in un pacchetto UDP, ma l'esecuzione del comandoCome inviare solo un pacchetto UDP con netcat?

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

posso vedere che il server sta ottenendo la roba ciao ma devo premere Ctrl + c per uscire dal comando netcat.

Come posso chiuderlo dopo aver inviato ciao?


Siamo spiacenti, per il rumore, ho la pagina man riletto e ho trovato l'opzione -q.

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

funziona (si interrompe dopo 1 secondo).

Per qualche motivo non funziona con -q0.

+0

Pagina man su debian: '-q secondi: dopo EOF su stdin, attendere il numero specificato di secondi e quindi uscire. Se i secondi sono negativi, aspetta all'infinito. – luckydonald

risposta

41

Non ho trovato l'opzione -q1 sul mio netcat. Invece ho usato l'opzione -w1. Di seguito è riportato lo script bash che ho fatto di inviare un pacchetto UDP ad ogni 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 
+4

Grazie, per me su OSX anche il '-w0' funziona correttamente. – SimonW

+0

OS X funziona come segue: "echo -n" test "| nc -4u -w0 localhost 9999" come dice SimonW –

136

Se si utilizza bash, si potrebbe anche scrivere

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

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

Questo funziona anche l'invio ad altri host, es:

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

Questi non sono i dispositivi "reali" sul file system, ma bash "speciale" aliases.

+1

Questo non è corretto. Non è limitato a Linux. –

+5

Sì, funziona su OS X con bash. –

+10

Ok, hai ragione, fammi solo esplicitare che questo non funzionerà con ZSH. – jturolla

4

Netcat invia un pacchetto per newline. Quindi stai bene. Se fai qualcosa di più complesso allora 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ù righe in un unico pacchetto (se si adattano). – sleske

4

Su un netcat corrente (v0.7.1) si dispone di un interruttore -c:

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

Quindi,

echo "hi" | nc -cu localhost 8000 

dovrebbe fare il trucco.

+0

Importante notare che questo è vero solo per GNU netcat, ma non per BSD netcat. – MarSoft