経緯
1000セッションログインしても大丈夫か
簡単なテストを行いたかった。
Apache Benchや
JMeterなどのツールを導入するのが王道なんだろうけど、
多重下請けSIerあるあるで、ツール導入には、
各種申請(要1~2週間)が必要とか
ごにゃごにゃ言われてしまった。
「あ、めんどい。ぼくが自作したほうが早いわ」
ってことで
Shellのcurl
コマンドでログイン試行するスクリプト作ったので、忘備録です。
めっちゃ車輪の再発明ですが。
ちなみに、こんなテキトーな作りなので
実行には少し時間かかります。
1000回ログインするのに3分くらいかな。
作ったもの
login_test.shが1回ログインを試行するスクリプト、
loop.shがそれを単に1000回繰り返すスクリプトです。
対象のWebサービスは1IDのセッション制限をつけてないので
同じIDで1000セッション
# !/bin/bash
set -Ce
# --------------------------------------------
# ログイン画面取得→ログイン試行
# →ログイン後の画面取得のテスト
# --------------------------------------------
echo "login_test start $1"
# ログインURL
login_url="http://hogehoge.com/login"
# ログイン後のみ見れるURL
func_url="http://hogehoge.com/main.html"
# ユーザーID
userId="user0001"
# パスワード
password="pCK&Ts3aYz"
# ログインURLアクセス、csrf_tokenを取得する
curl -s -c cookie_$1.txt $login_url > log_$1.txt
csrf_token=$(grep _csrf log_$1.txt | head -1 | cut -f 6 -d '"')
# ログイン試行
curl -s -b cookie_$1.txt -c cookie2_$1.txt -X POST -d userId=$userId -d password=$password -d _csrf=$csrf_token $login_url
# ログイン後のみ見れるURLにアクセス。見れなかったら「失敗」と表示
curl -s -I -b cookie2_$1.txt $func_url > log2_$1.txt
if grep 'HTTP/1.1 200' log2_$1.txt >/dev/null; then
:
else
echo '失敗'
fi
exit 0
# !/bin/bash
set -Ceu
# --------------------------------------------
# 1000回ログイン試行するshell
# --------------------------------------------
echo "------------start--------------"
for i in `seq 1000`
do
sh login_test.sh $i
done
echo "------------end--------------"
もう少し詳しく解説
curl
コマンドについて
たぶん「シーユーアールエル」と読む。でもぼくは「カール」と呼ぶ。
指定したURLを叩いて、レスポンスを取得するコマンド
-c オプション cookieを保存する。保存するcookieのパスを指定する
-b オプション 指定したcookieを読み込んで使う。ログインが絡む処理では必須
-I オプション ヘッダのみ取得する。HTTPレスポンスが200かどうかだけ知りたかったので
-s オプション プロセスメータや細かいメッセージを非表示にする。
-X オプション POSTをつけることで、 GETではなくPOSTすることを明示
-d オプション 各パラメータをつけられる
csrf_token=$(grep _csrf log_$1.txt | head -1 | cut -f 6 -d '"')
これは何してるかと言うと、保存したログイン画面のHTMLから、csrf_tokenを探して
変数にブチこんでいるところ。
本当はHTMLフォームの属性名から拾ってきたかったけど、いい感じに
拾える関数がなかったので、無理くり取得している。
(区切り文字を"にして、cutで分割、6つ目の要素を取得する、という方法。
HTMLに依存するのでログインページのHTMLみてうまく書き換えること)
if grep 'HTTP/1.1 200' log2_$1.txt >/dev/null; then
grep
して'HTTP/1.1 200'が見つかったら、
then
以下を実行する、というif。
grep結果は/dev/nullに捨ててしまうけど問題ない。
参考にしたページ