UNIX/Linuxの部屋 socatコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド socat ソケットリレーツール (proxy) このエントリーをはてなブックマークに追加

最終更新


socat コマンドはひとことで言うと proxy ツールである。入力と出力にファイル・標準入出力・コマンド・他のマシンなど、いろいろな種類を割り当てることができる。FreeBSD・Linux などでは外部パッケージとして用意されているので、pkg・yum・apt-get などで簡単にインストール可能である。


socat の基本的な使い方
socat コマンドは、基本的には下記のように「入力アドレス」と「出力アドレス」を指定し、その間をつないでくれる proxy ツールである。
% socat 入力アドレス 出力アドレス

キーボードから入力したデータを他サーバに送る
% socat STDIN TCP4:www.jp.freebsd.org:80,crlf
GET / HTTP/1.0(と入力して Enter)
(Enter)
.... (http://www.jp.FreeBSD.org/ の内容を取得できる) ...

readline と連携する
入力を readline として、さらにオプションでヒストリファイルを指定すると、Ctrl-n や Ctrl-p などで前回入力した内容を再利用できる。
% socat readline,history=$HOME/.http_history TCP4:www.jp.freebsd.org:80,crlf
telnet で web サーバとお話する際などは毎回同じような内容をタイプするのでうんざりするが、socat を使うと非常に便利である。

ファイルから入力
あらかじめ、
GET / HTTP/1.0(Enter)
(Enter)
という内容の http.dat を用意しておき、
% socat OPEN:http.dat TCP4:www.jp.freebsd.org:80
とすることで http.dat に結果が追記され、以下のような内容になる。
GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 20 Feb 2005 05:43:01 GMT
Server: Apache
Content-Length: 199
(略)
socat はこのように、
% socat 入力アドレス 出力アドレス
とすると、「入力アドレス」の内容を「出力アドレス」に送り、「出力アドレス」が返した内容を「入力アドレス」に追記することに注意しよう。

プロトコルの内容を確認
「入力」に「TCP4-LISTEN:ポート番号」と指定すると、ローカルの指定されたポート番号を LISTEN する。「出力」は www.jp.FreeBSD.org:80 としているため、ブラウザで http://localhost:8080 にアクセスすれば、あたかも http://www.jp.FreeBSD.org/ を閲覧しているかのような状態になる。
% socat -v -d -d TCP4-LISTEN:8080,reuseaddr TCP4:www.jp.freebsd.org:80
2005/02/20 14:52:34 socat[8532] N listening on AF=2 0.0.0.0:8080
> GET / HTTP/1.1\r
> Host: localhost:8080\r
> \r
< HTTP/1.1 200 OK\r
< Date: Sun, 20 Feb 2005 05:55:41 GMT\r
< Server: Apache\r
< Last-Modified: Thu, 03 Feb 2005 14:35:13 GMT\r
< ETag: "26c078-39ec-46122a40"\r
< Content-Length: 14828\r
この例では -v で入出力の内容を表示させ、-d -d でエラー発生時にメッセージを表示させている。また、ポート 8080 の LISTEN 時に REUSEADDR を指定している。

簡易 echo サーバ
下記により簡単に echo サーバを立てることができる (echo サーバとは、受け取った文字列を返すだけのサーバ)。
% socat TCP4-LISTEN:8080 system:cat
下記で接続し、入力した文字列がそのまま返されることを確認してほしい。
% telnet localhost 8000%

自作スクリプトで簡易 echo サーバ
以下のような標準入力を標準出力に返すプログラムを echod.pl として作成する。
#!/usr/bin/perl
$|=1;
while (<STDIN>){
printf "%d: %s", ++$count, $_;
}
そして下記のようにする。
% socat TCP4-LISTEN:8000,reuseaddr,fork system:'./echod.pl',nofork