たぶん、一番重要なのは、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ページを参照すると良いと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/01 00:50
2016/06/01 09:31 編集