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.

Janne H
la source
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 .

Peter Eisentraut
la source
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
MarchandJoeChicago
la source
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.

Simon
la source
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.

Evan
la source
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
Sajjad Baeidi
la source
nc 1.10-41 + b1 n'accepte pas -w0. Erreur: temps d'attente invalide 0
palik