Comportmento Netcat / socat con tubazioni e UDP?

Suppongo 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 che sto utilizzando Ubuntu 11.04 e il netcat predefinito su di esso, che indovino è il openbsd :

 $ 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 terminal:

 $ sudo nc -ul 5000 

… e in un altro terminal ho avviato una nuova connessione client UDP – e ho digitato hello tre volte, premendo INVIO dopo ciascuno:

 $ nc -u 127.0.0.1 5000 hello hello hello ^C 

… e tornando al terminal server, ha printingto hello tre volte, come previsto:

 $ sudo nc -ul 5000 hello hello hello ^C 

Finora così buono, tutti funzionano come previsto. Tuttavia, diciamo che provo ora la stessa cosa facendo piping input nel client; quindi stabilire prima un server UDP in un terminal:

 $ sudo nc -ul 5000 

… e in un altro, condividere alcuni dati in nc come client UDP:

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

… dopo il command client, il tipo di shell si blocca come se fosse in attesa dell'ingresso – quindi hello e INVIO ancora due volte; ma il server ha registrato solo il primo hello (che è stato piped via echo ). Inoltre, anche se si preme Ctrl-C e si tenta di ripetere l' echo hello | nc -u 127.0.0.1 5000 del client echo hello | nc -u 127.0.0.1 5000 echo hello | nc -u 127.0.0.1 5000 comandi, il server rimane ancora sul fatto che ha segnalato solo il primo hello :

 $ sudo nc -ul 57130 hello ^C 

… e solo dopo aver arrestato il server con Ctrl-C e riavviandolo di nuovo, si può ripetere l' echo hello | nc -u 127.0.0.1 5000 del client echo hello | nc -u 127.0.0.1 5000 echo hello | nc -u 127.0.0.1 5000 command e osservarlo funzionante.

È questo il modo in cui il nc dovrebbe essere comportrsi? Mi aspetterei che alless le chiamate ripetute per echo hello | nc -u 127.0.0.1 5000 echo hello | nc -u 127.0.0.1 5000 sarebbe stato registrato – senza wherer riavviare il server? O forse c'è un interruttore di row di command speciale per quel tipo di comportmento?

EDIT: Ho trovato questa bella presentazione PDF: socat – Gestione di tutti i tipi di zoccoli , che contiene i seguenti netcat vs note socat :

netcat – Limitazioni
● solo fotogramma (termina dopo la chiusura della presa)

Esempi 1: sostituzione di netcat

● client UDP con port di origine:
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, riutilizzo

… tuttavia, sto prendendo molto lo stesso comportmento come sopra, se sostituisco il command server con " socat - udp4-listen:5000,reuseaddr " – e la linea client con " socat - udp:127.0.0.1:5000 "… Con l'ingresso in echo hello | socat - udp:127.0.0.1:5000 ," echo hello | socat - udp:127.0.0.1:5000 ", l'unica differenza è che qui il command esista alless dopo che la parola hello era stata inviata – tuttavia, di questo command non provoca alcuna ricezione sul server, fino al riavvio del server.

Ok, penso alless che ho qualcosa con socat – vale a dire, la fork opzioni deve essere aggiunta alla linea del server:

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

… e poi, in un altro terminal, possiamo call echo piping nella linea client socat più volte sulla row di command, perché uscirà immediatamente ( ben 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 terminal, possiamo vedere che il server ha dimostrato con successo tutti i tre hello s:

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

Si noti che anche con un server di fork -ed socat , la linea echo "hello" | nc -u 127.0.0.1 5000 echo "hello" | nc -u 127.0.0.1 5000 rimarrà 'bloccato' come se fosse in attesa dell'ingresso dell'utente; tuttavia, ora dopo Ctrl-C e rieseguire il command, vale a dire

 $ 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 socat della fork mostrerà tre hello senza che sia necessario riavviare.

Apparentemente, questo netcat openBSD non dispone di un'opzione fork – ma non sono sicuro se ha uno che corrisponde a esso ..

Comunque, spero che questo aiuti qualcuno,
Saluti!

Il tuo netcat sta solo leggendo l'output dello stdout di echo quando si utilizza il pipe, non è più "collegato" alla tastiera. Per get la risposta che ti aspetti, puoi aggiungere i tuoi tre "hello" a un file

 cat [myfile] | nc -u 127.0.0.1 5000 

Se fai una strace dell'ascolto nc, mostrerà che netcat sta aspettando la connessione e una volta che lo otterrà, collegherà a tale host e alla port ignorando tutti gli altri. Devi aggiungere '-k' per continuare e '-w 0' per timeout each connessione dopo 0 secondi. Socat è una scelta migliore, penso.