Bash

Bash:嘗試將數據直接回顯到網路時權限被拒絕

  • December 20, 2015

我正在嘗試按照此執行緒中的說明將字元直接發送到網路堆棧。

即使該過程在 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 廣播的答案。

引用自:https://unix.stackexchange.com/questions/217613