我正在尝试将字符直接发送到网络堆栈,如中所述这个线程。
即使进程在 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 进行相同的实验,则只有一个终端会收到预期的消息。