LoginSignup
0
0

More than 3 years have passed since last update.

curlコマンドで1000回ログイン試行するshellスクリプト

Posted at

経緯

1000セッションログインしても大丈夫か
簡単なテストを行いたかった。

Apache Benchや
JMeterなどのツールを導入するのが王道なんだろうけど、

多重下請けSIerあるあるで、ツール導入には、
各種申請(要1~2週間)が必要とか
ごにゃごにゃ言われてしまった。

「あ、めんどい。ぼくが自作したほうが早いわ」

ってことで

Shellのcurlコマンドでログイン試行するスクリプト作ったので、忘備録です。

めっちゃ車輪の再発明ですが。

ちなみに、こんなテキトーな作りなので
実行には少し時間かかります。
1000回ログインするのに3分くらいかな。

作ったもの

login_test.shが1回ログインを試行するスクリプト、
loop.shがそれを単に1000回繰り返すスクリプトです。

対象のWebサービスは1IDのセッション制限をつけてないので
同じIDで1000セッション

login_test.sh
#!/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
loop.sh
#!/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に捨ててしまうけど問題ない。

参考にしたページ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0