leo-net認証スクリプト

今住んでいる家がレオパレスさんの所で、leonetの認証が面倒くさいので認証スクリプトを書いた。

leonetの認証

leonetでは、未認証の状態で任意のURLへアクセスすると認証用のページへリダイレクトされる(たぶん、ルータによって)。そのページで認証を済ませると、leonetのウェブサイトにリダイレクトされる。認証はbasic認証だと思う。そして、一定時間通信がなかった場合、再度認証を求められる。何時間だったのかは調べてませんw。

スクリプトの簡単な説明

leonetの認証はbasic認証なので、wgetのオプション--http-user= 、--http-password=を利用してbasic認証を行うというもの。

もし万が一、このスクリプトを利用される場合

自己責任のもとで使用して下さい。

初期版

これは、どこかのサイト(忘れた)でleonetの認証にwget使ったらいいんじゃねということが書いてあったので、それを参考にして書いたもの。

#!/bin/sh

# leonet認証スクリプト

# filename : leonet_auth.sh
# date     : 21-Jan-2011
# author   : furu

# Input your id & password.
id=
pass=

wget --http-user=${id} --http-password=${pass} http://www.google.co.jp/

rm index.html
echo "index.htmlを削除しました.\n"

echo "認証が完了しました!"
read uho

改良?版

(以下、セキュリティうんぬんの所は間違ったことを書いているかもしれないので、間違っていればご指摘下さい。)

初期版のスクリプトでは、認証してようがしてまいがwgetを実行してしまうので、指定したURLにユーザIDとパスワードを送信してしまいセキュリティ的に危ないんじゃないかと思った。
そこで、インターネットにつながっているかどうかを確認し、つながっていなければwgetを使って認証をする、つながっていれば何もしないという機能を付け足すことにした。
インターネットにつながっているかどうかの確認はステータスコードで確認するものとし、ステータスコードcurlの-IオプションでHTTPヘッダーを取得、それをファイルに書き出して、そのファイルをgrepステータスコードがPETTERN(ここでは、^HTTP/1.1 200 OK)に一致するかどうかを調べる。grepした結果、PETTERNに一致するのものが見つかれば特殊変数$?に0が、見つからなければ1が入るので、それをif文に利用して、wgetを実行するかどうかを分岐させる。
WEB+DB PRESSシェルスクリプトの特集(いつのかは忘れた)をすこーし参考にさせていただきました。

#!/bin/sh

# leonet認証スクリプト(improved)

# filename : leonet_auth_improved.sh
# date     : 8-April-2011
# author   : furu


# Input your id & password.
ID=
PASS=
SERVER="www.google.co.jp"
PETTERN="^HTTP/1.1 200 OK"

# mktemp -t : /tmp/ 以下にtmp.XXXXXXXXXXを作成
# 下のじゃ動かない。tmplogfileには'mktep -t tmp.XXXXXXXXXX'が文字列で入る。
# tmplogfile='mktemp -t tmp.XXXXXXXXXX' || exit 1
touch tmp

# get http header for $SERVER
curl -I ${SERVER} > tmp 2> /dev/null

grep "${PETTERN}" tmp > /dev/null 2>&1
if [ ${?} -eq 0 ]
then
    echo "${SERVER} -> OK\n"
    echo "Authentication has been done.\n"
else
    echo "${SERVER} -> NG\n"
    echo "start authentication ..."
    wget --http-user=${ID} --http-password=${PASS} http://www.google.co.jp/ 2> /dev/null
    rm index.html
    echo "Authentication was completed!\n"
fi

rm tmp

# Wait.
read uho

はまったところ

スクリプトを実行すると↓のメッセージが出てif文がうまく動かなかった。
[: 42: missing ]
42とかあるから42行目にあるfiが原因なのかなーとか思ってたけど、
これは
if [ $? -ep 0]
と0と]の間にスペースがないことが原因だった。
スペースを忘れずに!
参考:http://d.hatena.ne.jp/hatappo/20100219/1266569445

うまくいかなかったところ

mktempうんぬんのところ。

メモ

$?: 最後に実行したコマンドの終了コード
終了コードとは、あるコマンドを実行したときに、正常終了ならば0、異常終了ならば1が返ってくるもの。


もっといい方法があれば教えて頂けるとありがたいです。

あとスクリプト中の英語が下手くそなのは勘弁してくださいw

今、Rubyの勉強をしているつもりなので、Ruby版を練習がてら書くかもしれない。たぶん。