netcat non termina alla chiusura di stdin


11

Sto cercando di inviare un messaggio netcat. Dopo aver inviato il messaggio, netcatdeve terminare.

Ho provato quanto segue:

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin

L' -qopzione afferma:

-q secondi

dopo EOF su stdin, attendere il numero specificato di secondi e poi uscire. Se i secondi sono negativi, aspetta per sempre.

Ma

nc -q0 -u localhost 4300 < message.bin

inoltre non funziona.

Cosa mi sto perdendo?

Risposte:


6

Supponendo che dopo l'invio della connessione EOF rimarrà inattivo, è possibile utilizzare l' -w timeoutopzione, che funziona per timeoutessere uguale a zero (a differenza -qdell'opzione stupida ...)

cat tsmmessage.bin | nc -u localhost 4300 -w0

1
Questa è la risposta corretta e deve essere quella accettata anziché -q.
ccpizza,

1
zero timeout non funziona sulla mia macchina (debian stretch). diceinvalid wait-time 0
Anubi il

3

Senza la -qbandiera la tua istanza netcataspetterà per sempre. Non esiste un messaggio "end of stream" con UDP, quindi non c'è modo netcatdi sapere che sia stdin che la connessione di rete sono terminate.

Ad esempio, utilizzando TCP / IP funziona come previsto:

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

Ma come hai determinato, usando UDP / IP questo non finisce mai:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

È qui -qche entra in gioco la bandiera. Ma sfortunatamente non accetta un valore di 0. Inoltre, non accetta valori non interi. Ecco la migliore alternativa che posso offrire senza ricorrere a timeoutqualche altra utility esterna:

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

Anche qui, non è possibile avere il netcattempo di ascolto con grazia. (L' -wopzione di timeout viene ignorata ed -qè irrilevante.) Qualcosa del genere potrebbe essere utile in una situazione pratica, in modo che netcatvenga ucciso dopo 90 secondi:

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

-q 0per me va bene.
AlikElzin-Kilaka,

@ AlikElzin-kilaka non funziona per me però. Stai sicuramente usando UDP nei tuoi test? Quale versione di netcat hai? Probabilmente stai utilizzando una versione più recente.
roaima,

0

udp

# listen on receiver
nc -u -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300

tcp

# listen on receiver
nc -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -N localhost 4300

perché i downvotes? l'opzione -N risolve questo problema
camelccc

-1

Ci siamo imbattuti in questo quando Google su praticamente lo stesso problema. Si è scoperto che il problema era che netcat veniva ucciso da bash subito dopo che tutti i dati venivano risucchiati, senza avere alcuna possibilità di ricevere la risposta.

La mia soluzione è stata quella di aggiungere qualche ritardo dopo il piping dei dati, in questo modo:

(echo INFO; sleep 1) | nc redis.service.consul 6379

Con un file questo può apparire come:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300

netcatnon si chiude ancora quando sleepfinisce. Mi aspetto che la prima riga di comando ritorni al prompt dopo 1 secondo, ma non è così.
Frank Kusters,

che ne dici di aggiungere -q 1? cioè (echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379?
SkyWriter,

Con -qtutto funziona, anche l'esempio nella mia domanda originale. Da allora mi sono trasferito in una versione più recente di Ubuntu, forse questo fa la differenza.
Frank Kusters,

Quello è strano. Comunque, sono contento che entrambi abbiamo trovato un modo per aggirare questo :)
SkyWriter
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.