やりたいこと
別サーバにクエリつきの要求を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は書けないです。)
#!/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