簡易サーバを起動して、なんか処理をして結果を返却する方法

やりたいこと

別サーバにクエリつきの要求をcurlで送信し、引数に応じた値を返却値として受け取る
※サーバBにncコマンドがない、かつ勝手に入れるのもよろしくなかったので、
こんな手法を取りました。

環境

サーバA(要求を送る方)
CentOS Linux release 7.2.1511 (Core)

サーバB(要求を受ける方)
Red Hat Enterprise Linux Server release 7.1 (Maipo)

なお両方ともにサーバZを踏み台として経由していますが関係ないと思います。

pythonのバージョン(サーバB)
Python 2.7.5

curlのバージョン(サーバA)
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.19.1 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.4.3

準備(全てサーバB)

1.ディレクトリの作成
任意のディレクトリに「cgi-bin」という名前のディレクトリを作成します。

2.スクリプトの作成
bash,perl,pythonなどでスクリプトを作成してcgi-binに配置します。
スクリプトには実行権限を付与してください。
例としてbashスクリプトを提示します。
(私はperl,pythonは書けないです。)

[任意のディレクトリ]/cgi-bin/test.bash
#!/bin/bash

echo "Content-type:text/plain"
echo ""

param=$(echo ${QUERY_STRING} | awk -F= '$0=$2')

echo ${param}

3.ディレクトリの移動(重要!!)
これで結構ハマりました。。
「cgi-bin」がある[任意のディレクトリ]にcdしてください。
(これがなくてもできそうな気がしますが、できませんでした。)

4.簡易サーバの起動
下記コマンドをroot以外のユーザで実行します。
rootで実行するとCGIHTTPServerのモジュールの実行途中で異常終了します。

※補足
下記コマンドを実行したディレクトリが簡易サーバのルートディレクトリとして扱われます。

python -m CGIHTTPServer

必要に応じて、

python -m CGIHTTPServer &

や、

nohup python -m CGIHTTPServer &

としてもよいです。
なおpython3の場合はこれではダメなのですが、
すみません、調べてません。

これで、サーバBで簡易サーバが起動しました。
なおポートはデフォルトでは8000を使用します。
ポートを変更したい場合は下記のようにしてください。

python -m CGIHTTPServer 10000

curlで要求を投げる(サーバA)

以下のようにcurlを投げてみます。

curl "http://[サーバBのIP]:8000/cgi-bin/test.bash?q=hello"

すると「hello」の文字が標準出力に表示されたと思います。

クエリである「q=hello」の部分が「test.bash」では「${QUERY_STRING}」で取得できますので、後は煮るなり焼くなりお好きにどうぞ。

以上

参考にさせて頂いたサイト様

コマンド1つで今すぐWebサーバを起動させるためのワンライナー(Ruby or Python) - 元RX-7乗りの適当な日々
bashでCGIを実行する 小粋空間
一行でCGIサーバー(1)python編 - Qiita
2013-11-28 - since 2010

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.