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

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

我正在尝试将字符直接发送到网络堆栈,如中所述这个线程

即使进程在 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

在 PC 版 Ubuntu 上测试:

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

以及 RaspBerry Pi 2 的 Ubuntu:

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

通过这样做直接字符发送到NIC对于某些具有相当现代的 Bash 版本的路由器或嵌入式设备(如 NAS)来说,而不是使用 netcat 或 socat 可能很有用,但不允许(或者很难实现)安装额外的工具。

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

也测试过:

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

和:

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

来自 @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:~$

在使用 Bash v4.2.37 的 Kali Linux v1.1.0 上测试也失败:

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

通过安装的 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

答案1

已编辑以下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

写入/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)

编辑:

有时 netcat 有-b启用广播地址的标志。看这个答案关于 Ubuntu 上的 UDP 广播。

答案2

打开两个终端并在它们上键入:

数控-u-l 55555

打开第三个终端,根据需要安装 socat 并输入:(如果您询问 netcat 不支持广播)

回声-n“测试”| socat - udp 数据报:127.255.255.255:55555,广播

您应该看到两个终端都收到消息。

如果您尝试使用 127.0.0.1 进行相同的实验,则只有一个终端会收到预期的消息。

相关内容