リダイレクタを介したネットワークトラフィック管理(/dev/tcp/host/port へのデータ転送/受信)を許可する Linux シェルとは何ですか?

リダイレクタを介したネットワークトラフィック管理(/dev/tcp/host/port へのデータ転送/受信)を許可する Linux シェルとは何ですか?

これに従ってくださいバッシュチュートリアル、私は正常に次のコードを取得しました。簡単なコマンドを発行するWebページこの方法を使用すると、次のようになります。

$ exec 3<>/dev/tcp/www.google.com/80
$ echo -e "GET / HTTP/1.1\n\n" >&3
$ cat <&3

実際、デフォルトのGoogle HTMLサイトコードは次のとおりです。

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.es/?gfe_rd=cr&ei=HsiuVafkLpGt8weX7o-YAg
Content-Length: 258
Date: Tue, 21 Jul 2015 22:30:54 GMT
Server: GFE/2.0
Alternate-Protocol: 80:quic,p=0

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.es/?gfe_rd=cr&amp;ei=HsiuVafkLpGt8weX7o-YAg">here</A>.
</BODY></HTML>

このトリックは私にとって非常に効果的です。たとえば、マジックパケット(Wake on LAN)の送信に成功しました(例:はい)。

どのシェルがこれを許可しますか?簡単なコマンドとリダイレクタを使用してネットワークに直接データを送信するには?
もちろんBashを除いて。

この情報は、そのシステムに次の機能があるかどうかを理解するために使用されます。

  • Linuxが組み込まれたルーター
  • 一般的なAndroidシェル。
  • iOS(iPhone/iPad)ケース。
  • 一種のLinux(NAS、Compulab's Utilite、Odroid...など)を実行するその他の組み込みデバイス。

答え1

ATT ksh93の機能です。次へ追加バッシュ2.04で。他の一般的なシェルでは使用できません。特に、dashバリアント、pdkshまたはmksh(2015年7月現在)、BusyBoxまたはAndroidバリアント、zsh、またはFishにはありません。 Bashはこの機能なしでコンパイルできます(参照:--enable-net-redirections)、したがってbashがあっても組み込みデバイスにはないかもしれません。

機能があるかどうかをテストするには、TCPポートを開こうとするとエラーメッセージが表示されます。ドロップサービス:bashとkshは両方とも「接続拒否」を表示します(またはローカルシステムにドロップサービスがある場合はコマンドがすぐに返されます)。これは、一部のネットワーク接続が確立されていないと表示できません。

: </dev/tcp/127.0.0.1/9

これが一般的な機能ではない理由の1つは、多くのネットワークプロトコルが双方向通信を必要とし、誰がいつ会話するのか、どのシェルがそれにとってあまり便利ではないかを慎重に処理する必要があるためです。もう一つの理由は、単純な場合、パイプに次のものが含まれることです。インターネット猫ソカットまたはソケットまた動作します。これらのプログラムはバイナリデータを処理し、サーバーまたはクライアントにすることができます。 Wake on LANを除いて、簡単な方法で処理できるほとんどのプロトコル用の専用ツールがあります。

echo -e "GET / HTTP/1.1\n\n" | nc www.google.com 80

echo -e "GET / HTTP/1.1\n\n" | socat - TCP:www.google.com:80

socket入力の終わりに書き込みのために接続を閉じないため、実際にはHTTPクライアントとして機能しません。)

スクリプトの場合:

case $(export LANGUAGE=C LC_ALL=C; { : </dev/tcp/127.0.0.1/9; } 2>&1) in
  ""|*"Connection refused"*) echo "/dev/tcp is present";;
  *)
    if type nc >/dev/null 2>/dev/null; then
      echo "netcat is present"
    elif type socat >/dev/null 2>/dev/null; then
      echo "socat is present"
    else
      echo "I can't do TCP"
    fi
esac

1 ZshはUDPとTCPソケットを異なる方法で使用します。

関連情報