web-dev-qa-db-ja.com

Bash:データをネットワークに直接エコーしようとすると、アクセスが拒否されました

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ブロードキャストについて この回答 を参照してください。

8
Emeric

2つのターミナルを開き、両方に入力します。

nc -u -l 55555

3番目のターミナルを開き、必要に応じてsocatをインストールし、次のように入力します(netcatがブロードキャストをサポートしていないと尋ねた場合)

echo -n "テスト" | socat-udp-datagram:127.255.255.255:55555、broadcast

両方の端末がメッセージを受信して​​いるはずです。

127.0.0.1で同じ実験を試行すると、期待どおりに1つの端末のみがメッセージを受け取ります。

0
user161440