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 广播的答案。
| 归档时间: |
|
| 查看次数: |
9172 次 |
| 最近记录: |