Bash:データをネットワークに直接エコーしようとしたときに権限が拒否されました。

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

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)

することでNICに直接文字を転送するかなり最新バージョンのBashを使用している一部のルーターまたは組み込みデバイス(NASなど)では、代わりにnetcatまたはsocatを使用すると便利ですが、追加のツールをインストールすることはできません(または実装するのは難しい)。

なぜこれが起こり、どのように解決できますか?

またテストした内容:

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

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

答え1

編集済みユースケースのOPの説明は次のとおりです。

最新の公式バージョンbash(現在4.3.30)では、これを行うことはできません。このページ)。lib/sh/netopen.cBashを表示して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ブロードキャスト情報。

答え2

2つの端末を開き、次のように入力します。

CNC-ul 55555

3番目の端末を開き、必要に応じてsocatをインストールしてから、次のように入力します。 (netcatがブロードキャストをサポートしていないかどうかを尋ねる場合)

echo -n「テスト」| socat -udp データグラム: 127.255.255.255:55555, ブロードキャスト

両方の端末がメッセージを受信するのを見ることができます。

127.0.0.1を使用して同じ実験を試みると、1つの端末だけが期待したメッセージを受け取ります。

関連情報