Comment écrire un script bash de serveur d'écho en utilisant des outils comme nc, echo, xargs, etc. capables de traiter simultanément les demandes de plusieurs clients avec une connexion durable?
Le meilleur que j'ai trouvé jusqu'à présent est
nc -l -p 2000 -c 'xargs -n1 echo'
mais il ne permet qu'une seule connexion.
Si vous utilisez ncat au lieu de nc, votre ligne de commande fonctionne correctement avec plusieurs connexions mais (comme vous l'avez souligné) sans -p.
ncat -l 2000 -k -c 'xargs -n1 echo'
ncat est disponible sur http://nmap.org/ncat/ .
P.S. avec l'original netcat (nc) du Hobbit, le drapeau -c n'est pas pris en charge.
Mise à jour: -k (--keep-open) est désormais requis pour gérer plusieurs connexions.
Voici quelques exemples. ncat services simples
Serveur d'écho TCP
ncat -l 2000 --keep-open --exec "/bin/cat"
Serveur d'écho UDP
ncat -l 2000 --keep-open --udp --exec "/bin/cat"
Dans le cas où ncat n'est pas une option, socat fonctionnera également:
socat TCP4-LISTEN:2000,fork EXEC:cat
Le fork
est nécessaire pour que plusieurs connexions puissent être acceptées. Ajout de reuseaddr
à TCP4-LISTEN
peut être pratique.
netcat
solution pré-installée dans Ubunut
Le netcat
pré-installé dans Ubuntu 16.04 provient de netcat-openbsd
, et n'a pas de -c
option, mais le manuel donne une solution:
Sudo mknod -m 777 fifo p
cat fifo | netcat -l -k localhost 8000 > fifo
Ensuite, exemple client:
echo abc | netcat localhost 8000
TODO: comment modifier la valeur de la chaîne d'entrée? Ce qui suit ne renvoie aucune réponse:
cat fifo | tr 'a' 'b' | netcat -l -k localhost 8000 > fifo
L'exemple de shell distant fonctionne cependant:
cat fifo | /bin/sh -i 2>&1 | netcat -l -k localhost 8000 > fifo
Cependant, je ne sais pas comment traiter les demandes simultanées.
qu'en est-il de...
#! /bin/sh
while :; do
/bin/nc.traditional -k -l -p 3342 -c 'xargs -n1 echo'
done