Network Users' Group ``wheel'' / Dai ISHIJIMA's Page /
RTA55i / POSTメソッドで監視データを送る - (あえてSNMPを使わずにMRTG

最終更新日: 2010-04-11


POSTメソッドで監視データを送る


●はじめに

あえてSNMPを使わずにMRTGでは、 SNMPを使えない環境において、 シェルスクリプトを利用してMRTGを利用する方法を説明しました (関連情報: netstatでifconfigで)。 また、リモートホストの情報を伝送する手段として syslogコマンドやHTTPプロトコル(GETメソッド、wgetコマンド)を 利用する方法を紹介しました。

ちょっとした情報であれば、コマンドラインから、

	% echo "$information" | logger -h $host -p $priority
	% wget -O - -q "http://${HTTP_HOST}${SCRIPTNAME}?${QUERY_STRING}"
とすれば送ることが可能です。

でも、送りたい情報が長くなったら?


●POSTメソッドで送信する

最近のwgetコマンドでは「--post-data=文字列」や 「--post-file=ファイル名」オプションを使えば、 POSTメソッドが利用でき、 指定した文字列やファイルの中身を送信することが可能です。 受け取る側のCGIスクリプトでは標準入力から、 その情報を得ることが可能です。


●送信側スクリプト

標準入力からのデータを送りたいときは、 次のようなスクリプトで実現できます。 送信されるデータは、 途中で妙な解釈をされないようにBASE64エンコーディングしています。
	#! /bin/sh

	# 送信先の設定 (適当に設定してください)
	http_host="host-to-send"
	script_name="/path/to/your/script.cgi"

	export LANG=C
	export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

	# 一時ファイル
	temp=/tmp/xxx.$$
	trap 'rm -f $temp*; exit 1' 1 2 15              # clean up files

	# 入力を集めてエンコードする
	cat "$@" > $temp.1
	openssl base64 < $temp.1 > $temp.2

	# POSTメソッドで送信
	wget -O - -q --post-file=$temp.2 "http://${http_host}${script_name}"

	# 後始末
	rm -f $temp*

	exit 0

	# EOF


●受信側スクリプト

受信側では次のようなスクリプトを使います。
	#! /bin/sh

	# 受信データを置く場所 (要設定)
	result=/path/to/save/result

	export LANG=C
	export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

	# 一時ファイル
	temp=/tmp/xxx.$$
	trap 'rm -f $temp*; exit 1' 1 2 15              # clean up files

	# 応答メッセージ
	echo 'Content-type: text/plain'
	echo ''

	# 入力を収集してデコード
	cat > $temp.1
	openssl base64 -d < $temp.1 > $result

	# 後始末
	rm -f $temp*

	exit 0

	# EOF


●注意点

受信側CGIスクリプトはCGIを設置できるディレクトリに配置する必要があります。 また「chmod +x」で実行権限を与えておく必要があります。 出力結果は、CGIスクリプトを実行しているユーザの権限で書き込まれるため、 適当な書き込み権限を与えておく必要があります。 また、世界中にCGIスクリプトを公開する必要はないので、 適当なパーミッションを設定し(.htaccessを適当に編集し)、 特定のリモートホストからしか 監視情報を送信できないようにしておくことも必要でしょう。 これ以外でもお使いの環境に応じてセキュリティ設定を追加してください。


●応用例

上の受信スクリプトでは、送信された監視情報を単に保存しているだけですが、 それをさらに別のシェルスクリプトで加工して、 やはりMRTGで可視化するということも可能です。 また、ファイルに保存する以外に メールで管理者に送信ということも可能かもしれません。 こちらは、監視情報の送信側で 何らかの理由により(SMTP(25/tcp)が塞がれているなどで) メールを送信できない環境では便利かもしれません。
ご質問などありましたらお気軽に