質問: BashでTCP/UDP通信を行う http://orebibou.com/2016/05/bash%E3%81%A7tcpudp%E9%80%9A%E4%BF%A1%E3%82%92%E8%A1%8C%E3%81%86/ このページでしていることを解説してください。 telnetと同じことをしているのでしょうか? exec &3 nc などがよく分かりません。
回答: たぶん、一番重要なのは、`3`が何を意味するかです。それがわかると、見えてくると思います。 `3`は**ファイルディスクリプタ**の番号です。UNIX/Linuxではあらゆるプログラムにおいてファイル(標準入出力やネットワーク通信含む)の読み書きをするときはファイルディスクリプタというただの番号でやり取りしています。`2>&1`とかの`2`や`1`も同じくファイルディスクリプタの番号です。 ファイルには読み(r)と書き(w)があるため、各ファイルディスクリプタの番号に対してrかwかrwが設定されて、何かしらのデバイス(ファイル)に割り当てることができます。bashでは通常起動した直後は次のようになっています。 | 番号 | デバイス | モード | | --- | --- | --- | | 0 | stdin | r | | 1 | stdout | w | | 2 | stderr | w | | 3 | (無し) | - | 最初は`0`と`1`と`2`だけで、`3`以降は割り当てがありません。なお、`3`だけでなくそれよりも大きい数字が使えます(どこまで使えるかはulimitの制限等による)。そこで、`exec 3<> /dev/tcp/相手先ホスト名/ポート番号`としたときにどうなるかです。 `exec`は「指定された新しいコマンドを実行して今のプロセスと置き換える」というコマンドです。Cのsystemと同じです。ただ、今回、`exec`にはコマンドにあたる部分はありません。この場合は、`3<> /dev/tcp/相手先ホスト名/ポート番号`のファイルのリダイレクト処理だけして、置き換わるという動作をします。そう、この`3<>...`の部分はファイルのリダイレクトです。`> hoge.txt`や`< hoge.txt`と書くのと同じで、`3`にtcpの接続先を割り当てるという意味になります。よって、このあとは、先ほどの表が下記のように変わります。 | 番号 | デバイス | モード | | --- | --- | --- | | 0 | stdin | r | | 1 | stdout | w | | 2 | stderr | w | | 3 | /dev/tcp/相手先ホスト名/ポート番号 | rw | こうしてTCP通信を普通のファイルや標準入出力のように扱えるようになったと言うことです。 忘れてました、どうやってアクセスするかですが、それが`&3`です。`2>&1`とかで使うのと一緒です。`>&3`なら`3`に出力、`<&3`なら`3`から入力となります。 最後に、`nc`ですが、これはネットワーク通信をするためのコマンドのようです。上の動作は、クライアントの動作しかできませんが、`nc`はポートをリッスンできるため、サーバの動作を行うこともできます。`man nc`としてmanページを参照すると良いと思います。