/dev/tcpを使用するには<または>が必要な理由

/dev/tcpを使用するには<または>が必要な理由

電話をかけるときは、/dev/tcp/www.google.com/80次のように入力してください。

/dev/tcp/www.google.com/80

バッシュは言ったno such file or directory。オンラインで他の人のコードを表示するときは、次の構文を使用します。

 3<>/dev/tcp/www.google.com/80

私はこれも動作することがわかりました。

</dev/tcp/www.google.com/80

Bashで何かを呼び出すためにこれらのシンボルが必要なのはなぜですか?

答え1

これは、シェル(bashによってコピーされたkshの機能)であり、シェルだけの機能であるためです。

/dev/tcp/...実際のファイルではない場合、この場合、シェルはファイルへ/dev/tcp/...のリダイレクトの試みを傍受しsocket(...);connect(...)(ファイルを開く)代わりに(TCP接続設定)を実行します。open("/dev/tcp/..."...)

このようにスペルを書く必要があることに注意してください。cat < /dev/./tcp/...または///dev/tcp/...、機能せずにファイルを開こうとします(ほとんどのシステムにはファイルが存在せず、エラーメッセージが表示されます)。

リダイレクトの方向も重要ではありません。3< /dev/tcp/...OR3> /dev/tcp/...または3<> /dev/tcp/...ORを使用しても違いはありません3>> /dev/tcp/...。そのファイル記述子から読み書きできるため、TCPソケットを介してデータを受信または送信できます。

同じ特殊処理が実装されていないため、これを実行するとcat /dev/tcp/...機能しません。すべてのファイルに対して同様の操作を実行します(.onlyシェル(ksh、bashのみ)を除いて、リダイレクトターゲットのみ)。catopen("/dev/tcp/...")-

これはcat -、ファイルパスを具体的に処理する別の例です。今回はcatシェルではなく処理されます。

open("-")を実行し、結果ファイルディスクリプタから入力を読み取るのではなく、catファイルディスクリプタ0(stdin)から直接読み込みます。cat多くのテキストユーティリティはこれを行いますが、シェルはリダイレクトしません。ファイルの内容を読むには、または(または)-が必要です。ただし、存在しないシステムでは、この(ダミー)ファイルからのリダイレクトに対して同様の操作が行われます。そのようなファイルがあるシステムでも、GNUは同じことを行います。これは、これらのファイルが異なる動作をするため、Linuxなどのシステムで少し驚きをもたらす可能性があります。cat ./-cat < -cat - < -/dev/stdinbashawk/dev/stdin/dev/stdout/dev/stderr

zshTCP(およびUnixドメインストリーム)ソケットのサポートもありますが、これはztcp(および)組み込み機能を介してzsocket行われるため、ksh / bashアプローチよりも制限が少なくなります。特に、ksh / bashができない方法でサーバーとして機能することもできます。しかし、実際のプログラミング言語でできるよりもはるかに制限的です。

答え2

アイデアを混同したり、ファイルを読み込んでコマンドを実行しているようです。データと命令の違い。

Googleホームページは実行可能なプログラムではありません。もしそうなら、実行するのは安全ではありません。

リダイレクト文字(<および含む>)は、データをコマンドに渡すために使用されます。

これは可能ですが、送信するまでポートが応答しないため、機能しませcat < /dev/tcp/towel.blinkenlights.nl/23ん。/dev/tcp/www.google.com/80GET / HTTP/1.0\r\n\r\n

だから試してみてください

{
  printf >&3 'GET / HTTP/1.0\r\n\r\n'
  cat <&3
} 3<>/dev/tcp/www.google.com/80

関連情報