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
在 Ubuntu for PC 上測試:
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 發送字元而不是使用 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
和:
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
在通過Fun_Plug安裝的 Conceptronic CH3SNAS(具有 2 個 HDD 的 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
在 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 廣播的答案。