Comment envoyer un seul paquet UDP avec netcat?


121

Je veux envoyer une seule valeur courte dans un paquet UDP, mais en exécutant la commande

echo -n "hello" | nc -4u localhost 8000

Je peux voir que le serveur reçoit le bonjour mais je dois appuyer sur Ctrl+ cpour quitter la commande netcat.

Comment puis-je l'arrêter après avoir envoyé bonjour ?


Désolé, pour le bruit, j'ai relu la page de manuel et j'ai trouvé l' -qoption.

 echo -n "hello" | nc -4u -q1 localhost 8000

fonctionne (il se ferme après 1 seconde).

Pour une raison quelconque, cela ne fonctionne pas avec -q0.


Page de manuel sur Debian:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
luckydonald

Réponses:


204

Si vous utilisez bash, vous pouvez aussi bien écrire

echo -n "hello" >/dev/udp/localhost/8000

et évitez toutes les idiosyncrasies et incompatibilités de netcat.

Cela fonctionne également pour l'envoi à d'autres hôtes, par exemple:

echo -n "hello" >/dev/udp/remotehost/8000

Ce ne sont pas de "vrais" périphériques sur le système de fichiers, mais des alias "spéciaux" bash . Il y a des informations supplémentaires dans le manuel Bash .


24
Ok, vous avez raison, permettez-moi de préciser que cela ne fonctionnera pas avec ZSH.
jturolla

1
C'est bien mieux que de se débarrasser de netcat. Merci pour le conseil!
johnboiles

3
C'est peut-être la chose la plus incroyable que j'aie jamais vue.
vendredi

4
Pour une raison quelconque, j'avais besoin d'utiliser à la 127.0.0.1place localhostsur Ubuntu 14.04. (Oui, j'ai localhosten /etc/hosts.)
tuomassalo

3
/dev/udp/n'est pas un vrai fichier. Ce n'est qu'un nom de fichier interprété spécialement par bash.
Peter Eisentraut

46

Je n'ai pas trouvé l' -q1option sur mon netcat. Au lieu de cela, j'ai utilisé l' -w1option. Vous trouverez ci-dessous le script bash que j'ai fait pour envoyer un paquet udp à n'importe quel hôte et port:

#!/bin/bash

def_host=localhost
def_port=43211

HOST=${2:-$def_host}
PORT=${3:-$def_port}

echo -n "$1" | nc -4u -w1 $HOST $PORT

OS X fonctionne comme suit: "echo -n" test "| nc -4u -w0 localhost 9999" comme le dit SimonW
Simon Unsworth

14

Sur un netcat actuel (v0.7.1), vous avez un commutateur -c:

-c, --close                close connection on EOF from stdin

Par conséquent,

echo "hi" | nc -cu localhost 8000

devrait faire l'affaire.


3
Il est important de noter que cela n'est vrai que pour GNU netcat, mais pas pour BSD netcat.
MarSoft

Pour plus de clarté, avec netcat basé sur Linux, l'option -c nécessite une commande comme argument, qui "exécute l'argument donné via / bin / bash" - commandlinux.com/man-page/man1/nc.1.html
Blake Neal

5

Netcat envoie un paquet par nouvelle ligne. Alors tu vas bien. Si vous faites quelque chose de plus complexe, vous pourriez avoir besoin d'autre chose.

Je plaisantais avec Wireshark quand j'ai réalisé cela. Je ne sais pas si ça aide.


3
Je pense que ce n'est correct que pour TCP. Avec UDP, il enverra plusieurs lignes dans un seul paquet (si elles correspondent).
sleske

1
Non, testez simplement echo -n "hello\nworld" >/dev/udp/localhost/514et vous obtiendrez 2 lignes
bebbo

5

J'ai eu le même problème mais j'utilise l' -w 0option pour envoyer un seul paquet et quitter. Vous devez utiliser cette commande:

echo -n "hello" | nc -4u -w0 localhost 8000

nc 1.10-41 + b1 n'accepte pas -w0. Erreur: temps d'attente invalide 0
palik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.