web-dev-qa-db-fra.com

Comment fermer automatiquement la connexion netcat après l'envoi des données?

J'exécute la commande suivante à partir d'un script:

echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat localhost 8001

Cependant, le client netcat reste ouvert indéfiniment. Comment puis-je fermer la connexion une fois ces données envoyées?

25
Justin Meltzer

Les deux autres réponses -c et -q donnés sont corrects dans le bon contexte, mais cela peut aider à résumer pourquoi il y a plusieurs réponses et donner une solution plus générale.

Ces différentes options font la même chose mais sont des implémentations différentes de netcat:

  • -c GNU implémentation de netcat
  • -q Implémentation OpenBSD de netcat.
  • -w (autre?) Implémentation OpenBSD de netcat.

Certaines versions nécessitent un int pour spécifier le nombre de secondes à attendre avant de quitter pour le -q et -w options. Cet int doit être > 0 ou >= 0, selon la version.

Si vous implémentez quelque chose sur plusieurs machines et n'êtes pas sûr qu'elles utilisent la même implémentation de netcat, vous pouvez envisager de boucler votre appel netcat avec le programme timeout pour tuer netcat après quelques secondes.

timeout 5 echo '{"hostUp": true}' | netcat localhost 8001

Cette approche est un peu maladroite car elle impose une limite supérieure à l'exécution de netcat, qu'il envoie ou non des données avec succès, mais si vous envoyez une petite quantité de données et avez quelques secondes à perdre, cela devrait fonctionner avec n'importe quelle implémentation netcat.

19
7yl4r

Vous pouvez utiliser -q, mais cela entraînera également la fermeture du serveur netcat.

$ echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat -q 5 localhost 8001    
5
cuonglm

Dans mon cas, la copie de netcat que j'utilisais sur mon Mac installé via Homebrew (v 0.7.1) n'avait pas d'option -q, mais j'ai pu utiliser l'option -c pour fermer sur STDIN EOF et mettez la commande entière dans une boucle:

while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
3
jmaxyz

Sur Windows c'est -w 5 (secondes d'attente avant de fermer avec un minimum de 1 sec)

Exemple d'envoi de "bonjour" en udp à une adresse de diffusion sur Windows et fermeture après 1 seconde:

echo hello|nc -w 1 -u 10.0.30.255 -p 4000 5000
1
Roel

Sur le serveur Ubuntu 18.04, j'ai dû utiliser ce qui suit: (trouvé dans les pages de manuel)

echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat -N localhost 8001

De toute évidence, le -N est similaire à -q ou -c sur d'autres distributions

1