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

22

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?

Justin Meltzer
la source

Réponses:

17

Les deux autres réponses -cet -qdonnées sont correctes 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 Implémentation GNU 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 les options -qet -w. Cet int doit être > 0ou >= 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 timeoutprogramme 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.

7yl4r
la source
5

Vous pouvez utiliser un -qparamètre, mais cela entraînera netcatégalement la fermeture du serveur.

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

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 mettre le 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
jmaxyz
la source
1

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

Évidemment, le -Nest similaire à -qou -csur d'autres distributions

Daniel Schoonwinkel
la source