Bash:尝试将数据直接回显到网络时权限被拒绝

Sop*_*rez 5 networking bash ip udp

我正在尝试按照此线程中的说明将字符直接发送到网络堆栈。

即使该过程在 CygWin (Windows) 下运行正常,相同的行在 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
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu for PC 上测试:

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

和适用于 RaspBerry Pi 2 的 Ubuntu:

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

通过将字符直接发送到 NIC而不是使用 netcat 或 socat 来执行此操作对于某些具有相当现代 Bash 版本但不允许(或难以实现)安装的路由器或嵌入式设备(如 NAS)很有用额外的工具。

为什么会发生这种情况,我该如何解决?

也测试过:

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
Run Code Online (Sandbox Code Playgroud)

和:

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:~$
Run Code Online (Sandbox Code Playgroud)

来自@Emeric 的新信息:问题似乎只影响广播地址:

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:~$
Run Code Online (Sandbox Code Playgroud)

在 Kali Linux v1.1.0 和 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
Run Code Online (Sandbox Code Playgroud)

在通过Fun_Plug安装的 Conceptronic CH3SNAS(带有 2 个硬盘的 NAS)的 Bash 上测试也失败了:

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
Run Code Online (Sandbox Code Playgroud)

Eme*_*ric 10

按照 OP 对用例的说明进行编辑

您不能使用最新的官方版本bash(根据此页面当前为 4.3.30 )。lib/sh/netopen.c显示 bash 打开一个 UDP 套接字 ( SOCK_DGRAM) 然后直接尝试连接而不查看 IP 地址以确定设置特定套接字选项是否有意义(在您的情况下SO_BROADCAST)。

最好的办法是将补丁发送给当前的bash维护者或适当的邮件列表,将其包含在正式版本中,然后等到 NAS 中相当现代的 bash 版本更新为更现代的版本,包括您的功能。

简短回答:bash目前不能这样做。

上一个答案
您必须求助于socat

$ echo -e "\xff" | socat - UDP-DATAGRAM:255.255.255.255:4000,broadcast
Run Code Online (Sandbox Code Playgroud)

写入/dev/udp使用bash的内置套接字实现。据我所知,此实现不允许将 UDP 数据报发送到广播地址,因为这需要SO_BROADCAST在发送之前为套接字设置一个标志。

使用netcat也不是一种选择,因为它拒绝 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)
Run Code Online (Sandbox Code Playgroud)

编辑:

有时 netcat 有-b标志来启用广播地址。请参阅有关 Ubuntu 上的 UDP 广播的答案