2011-12-04 2 views
30

Come scrivere uno script bash di server eco utilizzando strumenti come nc, echo, xargs, ecc in grado di elaborare simultaneamente le richieste da più client ciascuna con una connessione duratura?Come creare un server Echo con Bash?

Il migliore che ho è venuta finora è

nc -l -p 2000 -c 'xargs -n1 echo' 

ma consente solo una singola connessione.

+2

'nc' di Ubuntu 12.04 non ha' -c' option = (('pacchetto netcat-openbsd'.) –

risposta

31

Se si utilizza ncat anziché nc, la riga di comando funziona correttamente con più connessioni ma (come indicato) senza -p.

ncat -l 2000 -k -c 'xargs -n1 echo' 

NCAT è disponibile presso http://nmap.org/ncat/.

P.S. con l'originale Hobbit's netcat (nc) il flag -c non è supportato.

Aggiornamento: -k (--keep-open) è ora necessario per gestire più connessioni.

+0

Grazie! Funziona ma con una piccola modifica - dovremmo usarlo senza l'opzione" -p " : ncat -l 2000 -c 'xargs -n1 echo' – Roskoto

+0

Hai ragione Risposta modificata –

+0

Anche questo mantiene solo una connessione nel mio ambiente ... –

17

Ecco alcuni esempi. ncat simple services

server TCP echo server di

ncat -l 2000 --keep-open --exec "/bin/cat" 

UDP echo

ncat -l 2000 --keep-open --udp --exec "/bin/cat" 
+0

Questo funziona per me. –

+0

Attenzione però, con '--udp', ncat manterrà le" connessioni "aperte e se non vuoi raggiungere il limite predefinito di 100 connessioni, allora dovresti aumentare il massimo con' --max- conns' o lasciare che le "connessioni" muoiano dopo un timeout di inattività che è possibile impostare con '--idle-timeout'. – josch

4

In caso NCAT non è un'opzione, socat funziona anche:

socat TCP4-LISTEN:2000,fork EXEC:cat 

Il fork è necessario affinché possono essere accettate più connessioni. Aggiungere reuseaddr a TCP4-LISTEN potrebbe essere conveniente.

1

netcat soluzione pre-installato in Ubunutu

Il netcat pre-installato in Ubuntu 16.04 viene da netcat-openbsd, e non ha alcuna opzione -c, ma il manuale dà una soluzione:

sudo mknod -m 777 fifo p 
cat fifo | netcat -l -k localhost 8000 > fifo 

Poi client esempio:

echo abc | netcat localhost 8000 

TODO: come modificare il valore della stringa di input? Quanto segue non restituisce alcuna risposta:

cat fifo | tr 'a' 'b' | netcat -l -k localhost 8000 > fifo 

L'esempio shell remota funziona comunque:

cat fifo | /bin/sh -i 2>&1 | netcat -l -k localhost 8000 > fifo 

non so come trattare con richieste simultanee semplicemente comunque.