this thread で説明されているように、ネットワークスタックに文字を直接送信しようとしています。
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)
Netcatまたはsocatを使用する代わりに、直接文字をNICに送信してこれを行うと、一部のルーターまたは組み込みデバイス(NASなど)で、最新のBashバージョンですが、追加のツールのインストールを許可しません(または実現するのが面倒です)。
なぜこれが起こっているのですか、どうすれば解決できますか?
テスト済み:
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:~$
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
Fun_Plug を介してインストールされたConceptronic CH3SNAS(a NAS 2 HDDの場合))からの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
の組み込みソケット実装を使用します。私の知る限り、この実装では、送信前にソケットにSO_BROADCAST
フラグを設定する必要があるため、UDPデータグラムをブロードキャストアドレスに送信できません。
UDPブロードキャストを拒否するため、netcat
の使用もオプションではありません。
$ 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つのターミナルを開き、両方に入力します。
nc -u -l 55555
3番目のターミナルを開き、必要に応じてsocatをインストールし、次のように入力します(netcatがブロードキャストをサポートしていないと尋ねた場合)
echo -n "テスト" | socat-udp-datagram:127.255.255.255:55555、broadcast
両方の端末がメッセージを受信しているはずです。
127.0.0.1で同じ実験を試行すると、期待どおりに1つの端末のみがメッセージを受け取ります。