Python
ShellScript
Bash
curl

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

More than 1 year has passed since last update.

やりたいこと

別サーバにクエリつきの要求を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