Bash: Permissão negada ao tentar enviar dados diretamente para a rede

5

Estou tentando enviar caracteres diretamente para a pilha de rede, conforme explicado em este tópico .

Mesmo quando o processo funciona bem no CygWin (Windows), as mesmas linhas falham no 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

Testado no Ubuntu para PC:

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

E o Ubuntu para o RaspBerry Pi 2:

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

Fazer isso via envio direto de caracteres para NIC ao invés de usar netcat ou socat pode ser útil para alguns roteadores ou dispositivos embarcados (como NAS) que têm uma versão Bash bastante moderna, mas não permitir (ou é difícil de conseguir) a instalação de ferramentas extras.

Por que isso está acontecendo e como posso resolvê-lo?

testado também:

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

E:

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:~$

Novas informações do @Emeric: o problema parece afetar apenas o (s) endereço (s) de transmissão:

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:~$

Falha no teste também no Kali Linux v1.1.0 com Bash v4.2.37:

luis@Lamborghini:~$ sudo lsb_release -a
No LSB modules are available.
Distributor 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

Teste falhou também no Bash do CH3SNAS da Conceptronic (um NAS com 2 HDDs) instalado 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
    
por Sopalajo de Arrierez 22.07.2015 / 15:03

2 respostas

8

Editado após o esclarecimento do OP sobre o caso de uso:

Você não pode fazer isso usando o último lançamento oficial de bash (atualmente 4.3.30 de acordo com esta página ). lib/sh/netopen.c mostra que o bash abre um soquete UDP ( SOCK_DGRAM ) e tenta se conectar diretamente sem olhar o endereço IP para determinar se faria sentido definir opções de soquete específicas (no seu caso SO_BROADCAST ).

Sua melhor aposta seria enviar um patch para os atuais bash mantenedores ou a lista de discussão apropriada, incluí-la nos lançamentos oficiais e aguardar até que a versão bash bastante moderna do seu NAS seja atualizada para uma versão ainda mais moderna. versão incluindo seu recurso.

Resposta curta: bash pode atualmente não fazer isso.

Resposta anterior :
Você precisa recorrer a socat :

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

Gravar para /dev/udp usa a implementação de soquete interno de bash . Tanto quanto é do meu conhecimento, esta implementação não permite enviar datagramas UDP para o endereço de broadcast, pois isso requer a configuração de um SO_BROADCAST flag para o soquete antes do envio.

Usar netcat também não é uma opção, pois rejeita a transmissão 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)

Editar:

Às vezes, o netcat tem o sinal -b para ativar o endereço de transmissão. Veja esta resposta sobre a transmissão UDP no Ubuntu.

    
por 22.07.2015 / 15:41
0

Abra dois terminais e digite os dois:

nc -u -l 55555

Abra um terceiro terminal, instale o socat, se necessário, e digite: (caso você pergunte, o netcat NÃO suporta transmissão)

echo -n "TEST" | socat - udp-datagram:127.255.255.255:55555,broadcast

Você deve ver os dois terminais recebendo a mensagem.

Se você tentar a mesma experiência com 127.0.0.1, apenas um terminal receberá a mensagem como esperado.

    
por 21.12.2015 / 00:23