2011-12-04 19 views
30

Cómo escribir un script echo bash de servidor utilizando herramientas como nc, echo, xargs, etc. capaz de procesar simultáneamente solicitudes de clientes múltiples, cada una con conexión duradera?¿Cómo hacer un servidor de eco con Bash?

La mejor que he venido hasta ahora es

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

pero sólo permite una única conexión.

+2

Ubuntu 12.04's 'nc' no tiene' -c' option = (('paquete netcat-openbsd'). –

Respuesta

31

Si utiliza ncat en lugar de nc, su línea de comando funciona bien con varias conexiones pero (como ha señalado) sin -p.

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

ncat está disponible en http://nmap.org/ncat/.

P.S. con el original netcat de Hobbit (nc) el indicador -c no es compatible.

Actualización: ahora se requiere -k (--keep-open) para manejar conexiones múltiples.

+0

¡Gracias! Funciona pero con un cambio menor, deberíamos usarlo sin la opción "-p" : ncat -l 2000 -c 'xargs -n1 echo' – Roskoto

+0

Tienes razón. Respuesta editada –

+0

Esto también solo tiene una conexión en mi entorno ... –

17

Aquí hay algunos ejemplos. ncat simple services

TCP del servidor de eco servidor

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

UDP eco

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

Esto funciona para mí. –

+0

Sin embargo, tenga cuidado, con '--udp', ncat mantendrá las" conexiones "abiertas y si no desea alcanzar el límite predeterminado de 100 conexiones, entonces debe aumentar el máximo con' --max- Opción de conns o deje que las "conexiones" mueran después de un tiempo de inactividad que puede establecer con '--idle-timeout'. – josch

4

En caso NCAT no es una opción, socat también funcionará:

socat TCP4-LISTEN:2000,fork EXEC:cat 

El fork es necesario para múltiples conexiones pueden ser aceptadas Agregar reuseaddr a TCP4-LISTEN puede ser conveniente.

1

netcat solución pre-instalado en Ubunutu

El netcat preinstalado en Ubuntu 16.04 viene de netcat-openbsd, y no tiene ninguna opción -c, pero el manual da una solución:

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

Entonces ejemplo de cliente:

echo abc | netcat localhost 8000 

TODO: ¿cómo modificar el valor de la cadena de entrada? El siguiente no se devuelve ninguna respuesta:

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

El ejemplo shell remoto sin embargo funciona:

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

No sé cómo hacer frente a las solicitudes concurrentes simplemente sin embargo.

Cuestiones relacionadas