161 votes

Comment envoyer un seul paquet UDP avec netcat ?

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 + c pour quitter la commande netcat.

Comment faire pour qu'il s'arrête après l'envoi Bonjour ?


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

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

fonctionne (il s'arrête après 1 seconde).

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

0 votes

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.

257voto

Peter Eisentraut Points 12513

Si vous utilisez bash, vous pouvez tout aussi bien écrire

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

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

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

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

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

34 votes

Ok, vous avez raison, laissez-moi préciser que cela ne fonctionnera pas avec ZSH.

0 votes

Comment obtient-on ce paquet ?

1 votes

C'est bien mieux que de s'embêter avec netcat. Merci pour le conseil !

51voto

TraderJoeChicago Points 2101

Je n'ai pas trouvé le -q1 sur mon netcat. A la place, j'ai utilisé l'option -w1 option. Voici le bash script 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

1 votes

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

17voto

Simon Points 477

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

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

D'où,

echo "hi" | nc -cu localhost 8000

devrait faire l'affaire.

12voto

Sajjad Baeidi Points 94

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

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

6voto

Evan Points 21

Netcat envoie un paquet par nouvelle ligne. Donc tout va bien. Si vous faites quelque chose de plus complexe, vous aurez peut-être besoin d'autre chose.

Je m'amusais avec Wireshark quand j'ai réalisé ça. Je ne sais pas si ça peut aider.

3 votes

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

2 votes

Non. Il suffit de tester echo -n "hello\nworld" >/dev/udp/localhost/514 et vous obtiendrez 2 lignes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X