Bash: Autorisation refusée lors de la tentative d'écho des données directement sur le réseau

J'essaye d'envoyer des caractères directement à la stack de réseau comme expliqué dans ce fil .

Même lorsque le process fonctionne correctement sous CygWin (Windows), les mêmes lignes échouent sur Ubuntu v14.04:

luis@Zarzamoro:~$ sudo echo -e "\xff">/dev/udp/255.255.255.255/4000 -bash: connect: Permission denied -bash: /dev/udp/255.255.255.255/4000: Permission denied 

Testé sur Ubuntu pour PC:

 luis@Lamborghini:~$ bash --version GNU bash, versión 4.3.11(1)-release (i686-pc-linux-gnu) 

Et Ubuntu pour RaspBerry Pi 2:

 luis@Zarzamoro:~$ bash --version GNU bash, version 4.3.11(1)-release (arm-unknown-linux-gnueabihf) 

Effectuer ceci via l'envoi direct de caractères au NIC au lieu d'utiliser netcat ou socat pourrait être utile pour certains routeurs ou périphériques embarqués (comme le NAS) qui ont une version Bash plutôt moderne, mais ne permettent pas (ou il est difficile à réaliser) l'installation d'outils supplémentaires.

Pourquoi cela se produit-il et comment pourrais-je le résoudre?

Testé aussi:

 luis@Zarzamoro:~$ sudo bash -c 'echo -e "\xff" >/dev/udp/255.255.255.255/4000' bash: connect: Permission denied bash: /dev/udp/255.255.255.255/4000: Permission denied 

Et:

 luis@Zarzamoro:~$ echo -e "\xff" | sudo tee /dev/udp/255.255.255.255/4000 tee: /dev/udp/255.255.255.255/4000: No such file or directory ▒ luis@Zarzamoro:~$ 

Nouvelles informations de @Emeric: le problème ne semble affecter que les adresses de diffusion:

 luis@Zarzamoro:~$ sudo bash -c 'echo -e "\xff" >/dev/udp/192.168.11.255/4000' bash: connect: Permission denied bash: /dev/udp/192.168.11.255/4000: Permission denied luis@Zarzamoro:~$ sudo bash -c 'echo -e "\xff" >/dev/udp/192.168.11.1/4000' luis@Zarzamoro:~$ 

Testé échoué aussi sur Kali Linux v1.1.0 avec Bash v4.2.37:

 luis@Lamborghini:~$ sudo lsb_release -a No LSB modules are available. Dissortingbutor ID: Kali Description: Kali GNU/Linux 1.1.0 Release: 1.1.0 Codename: moto luis@Lamborghini:~$ bash --version GNU bash, versión 4.2.37(1)-release (i486-pc-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. luis@Lamborghini:~$ sudo bash -c 'echo -e "\xff" >/dev/udp/192.168.11.255/4000' bash: connect: Permiso denegado bash: /dev/udp/192.168.11.255/4000: Permiso denegado 

Testé échoué aussi sur Bash de Conceptronic CH3SNAS (un NAS avec 2 HDD) installé via Fun_Plug :

 sh-4.1# bash --version GNU bash, version 4.1.11(2)-release (arm-ffp-linux-uclibc) sh-4.1# su sh-4.1# echo -e "\xff" > /dev/udp/255.255.255.255/4000 sh: connect: Permission denied sh: /dev/udp/255.255.255.255/4000: Permission denied 

Modifié suite à la clarification de l'OP sur le cas d'utilisation:

Vous ne pouvez pas faire cela en utilisant la dernière version officielle de bash (actuellement 4.3.30 selon cette page ). lib/sh/netopen.c montre que bash ouvre une socket UDP ( SOCK_DGRAM ) puis essaie directement de se connecter sans regarder l'adresse IP pour déterminer s'il est logique de définir des options de socket spécifiques (dans votre cas SO_BROADCAST ).

Votre meilleur pari serait d'envoyer un patch aux mainteneurs actuels de bash ou la list de diffusion appropriée, de l'inclure dans les versions officielles, puis d'attendre que la version bash plutôt moderne de votre NAS soit mise à jour vers une version encore plus moderne incluant votre fonctionnalité.

Réponse courte: bash ne peut actuellement pas le faire.

Réponse précédente :
Vous devez recourir à socat :

 $ echo -e "\xff" | socat - UDP-DATAGRAM:255.255.255.255:4000,broadcast 

L'écriture dans /dev/udp utilise l'implémentation de socket embeddede de bash . Pour autant que je sache, cette implémentation ne permet pas d'envoyer des datagrammes UDP à l'adresse de diffusion, car cela nécessite de définir un indicateur SO_BROADCAST sur le socket avant de l'envoyer.

Utiliser netcat n'est pas non plus une option car il rejette la diffusion UDP:

 $ echo -e "\xff" | nc -u 255.255.255.255 4000 nc: netcat.c:573: main: Assertion `connect_sock.proto != NETCAT_PROTO_UDP' failed. Aborted (core dumped) 

Modifier:

Parfois, netcat a l'option -b pour activer l'adresse de diffusion. Voir cette réponse sur la diffusion UDP sur Ubuntu.

Ouvrez deux terminaux et tapez sur les deux:

nc -u -l 55555

Ouvrez un troisième terminal, installez socat si nécessaire et tapez: (au cas où vous requestrez à netcat de ne pas supporter la diffusion)

echo -n "TEST" | socat – datagramme udp: 127.255.255.255: 55555, diffusion

Vous devriez voir les deux terminaux recevoir le message.

Si vous essayez la même expérience avec 127.0.0.1, un seul terminal recevra le message comme prévu.