Comportamento Netcat / Socat con piping e UDP?


16

Immagino che questo sia vicino a Linux - Netcat smette di ascoltare il traffico UDP - Super User , ma ho pensato che sarebbe meglio chiedere comunque

Per quanto riguarda le versioni di netcat sto usando Ubuntu 11.04 e il valore predefinito netcatsu di esso, che suppongo sia openbsdquello:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

Questo è ciò che trovo strano: il primo caso funziona come previsto - Apro un server UDP in un terminale:

$ sudo nc -ul 5000

... e in un altro terminale avvio una nuova connessione client UDP - e scrivo hellotre volte, premendo INVIO dopo ciascuna:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... e tornando al terminale del server, ha stampato hellotre volte, come previsto:

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

Fin qui tutto bene, tutto funziona come previsto. Tuttavia, supponiamo che provo ora lo stesso eseguendo il piping dell'input nel client; quindi stabilire prima un server UDP in un terminale:

$ sudo nc -ul 5000

... e in un altro, reindirizza alcuni dati nccome client UDP:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... dopo il comando client, la shell si blocca come se fosse in attesa di input - quindi lì scrivo helloe INVIO altre due volte; ma il server ha registrato solo il primo hello(che è stato reindirizzato tramite echo). Inoltre, anche se si preme Ctrl-C e si tenta di ripetere il echo hello | nc -u 127.0.0.1 5000comando client , il server rimarrà comunque dopo aver segnalato solo il primo hello:

$ sudo nc -ul 57130 
hello
^C

... e solo dopo aver arrestato il server con Ctrl-C e averlo riavviato, è possibile ripetere il echo hello | nc -u 127.0.0.1 5000comando client e osservarlo mentre funziona.

 

È così nc dovrebbe comportarsi? Mi aspetto che echo hello | nc -u 127.0.0.1 5000vengano registrate almeno le chiamate ripetute senza dover riavviare il server? O forse c'è uno speciale interruttore da riga di comando per quel tipo di comportamento?

EDIT: Ho trovato questa bella presentazione in PDF: socat - Gestione di tutti i tipi di socket , che contiene il seguente netcatvssocat note :

netcat - Limitazioni
● solo uno scatto (termina dopo la chiusura del socket)
...
Esempi 1: Sostituzione netcat
...
● Client UDP con porta sorgente:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Server TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...

... tuttavia, sto praticamente ottenendo lo stesso comportamento di cui sopra, se sostituisco il comando server con " socat - udp4-listen:5000,reuseaddr" - e la riga client con " socat - udp:127.0.0.1:5000" ... Con l'input convogliato " echo hello | socat - udp:127.0.0.1:5000", l'unica differenza è che qui il comando esiste almeno dopo che la parola è hellostata inviata - tuttavia, ancora una volta, esecuzioni consecutive di questo comando non causeranno alcuna ricezione sul server, fino al riavvio del server.

Risposte:


23

Ok, penso che almeno ho qualcosa con socat- vale a dire, l'opzione forkdeve essere aggiunta alla linea del server:

$ socat - udp4-listen:5000,reuseaddr,fork

... e poi, in un altro terminale, possiamo chiamare il echopiping nella socatlinea client più volte dalla riga di comando, poiché uscirà immediatamente ( beh, dopo mezzo secondo :) ):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... e tornando al primo terminale, possiamo vedere che il server ha mostrato con successo tutte helloe tre le s:

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

Si noti che anche con un server fork-ed socat, la linea si echo "hello" | nc -u 127.0.0.1 5000bloccherà comunque come se fosse in attesa dell'input dell'utente; tuttavia, ora dopo Ctrl-C e rieseguendo il comando, ad es

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... il server fork-ed socatmostrerà tre hellos senza la necessità di essere riavviato.

 

Apparentemente, questo openBSD netcatnon ha forkun'opzione - ma non sono sicuro se ne abbia uno corrispondente ad esso ..

Comunque, spero che questo aiuti qualcuno,
Saluti!


4

Il tuo netcat sta leggendo l'output dello stdout di echo solo quando usi pipe, non è più "connesso" alla tastiera. Per ottenere la risposta che ti aspetti, puoi aggiungere i tuoi tre "ciao" a un file una corsa

cat [myfile] | nc -u 127.0.0.1 5000

Ciao @OldWolf - molte grazie per la tua risposta! Ho provato il tuo suggerimento (anche in un modo un po 'più contorto, " cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000"), tuttavia, mentre vedo tre hellos, ciò che mi confonde è ancora presente: anche quel comando ordinerà un po' di "blocco", come se aspettassi l'input digitato da utente, e dopo aver premuto Ctrl-C e rieseguendolo, il server non vedrà alcun dato finché non verrà riavviato !? Questo è quello che mi piacerebbe sapere di più: evviva!
sdaau,

2
nc è in attesa di un EOF che, in questo caso, non arriva finché non si invia il segnale di uscita al programma.
OldWolf,

Ahh, capisco - molte grazie per quella spiegazione, @OldWolf! Apparentemente socatpuò aggirare quello con l' forkopzione ... Grazie ancora, evviva!
sdaau,

3

Se esegui una sequenza dell'ascolto nc, mostrerà che netcat è in attesa della connessione e, una volta ottenuta, si connetterà a quell'host e porta, ignorando tutti gli altri. È necessario aggiungere '-k' per continuare e '-w 0' per timeout ogni connessione dopo 0 secondi. Socat è una scelta migliore, credo.

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.