TL; DR (今北産業)
Automator で新規「アプリケーション」を立ち上げ、再起動用のシェル・スクリプトを登録する。
シェルスクリプト欄にコピペするスクリプト
password
と ip_router
の値を自分の環境に変更してください。
bash
#!/bin/bash
clear; set -u
# -------------------------------
# Router settings
# -------------------------------
user='admin'
password=''
ip_router='192.168.0.1'
# -------------------------------
# Functions
# -------------------------------
function is_ip_up () {
result=1
ping -c 3 -t 3 -s 32 $1 > /dev/null;
if [ $? -eq 0 ]; then
#success
result=0
fi
return $result
}
# -------------------------------
# Begin
# -------------------------------
echo "Running script to reboot router at ${ip_router}"
url_base="http://$user:$password@$ip_router"
if is_ip_up $ip_router; then
echo "Router is up. Fetching files..."
else
echo "Router is down."
exit 1
fi
html_reboot=`curl -s "$url_base/reboot.htm" --compressed`
session_id=`echo "$html_reboot" \
| grep hidden \
| sed -e 's/.*hidden\" value=\"\([^\"]\+\)\".*/\1/g' \
| grep -o '[0-9a-z]\{32\}'`
echo "SESSION_ID is: $session_id"
sleep 1
html_result=`curl -s "$url_base/boafrm/formReboot" \
-H "Origin: $url_base" \
-H "Referer: $url_base/reboot.htm" \
--data "SESSION_ID=$session_id&reboot=%BA%C6%B5%AF%C6%B0+" \
--compressed`
while is_ip_up $ip_router; do
echo -en "\rShutting down router..."
sleep 1
done
echo; echo "Now rebooting..."
while ! is_ip_up $ip_router; do
echo -en "\rPinging... router is down"
sleep 1
done
echo; echo "Router is up."
echo "Router rebooted."
exit 0
動作検証済み環境
項目 | 内容 |
---|---|
ルーター | NEC Aterm WG1200HS(FW: v1.0.20) |
OS | macOS HighSierra (OSX 10.13) |
PC | MacBook Pro (Retina, 13-inch, Early 2015) |
Bash | 3.2 |
- シェルスクリプト自体は Raspbian(Debian 8, jessie)+ bash v4.3.30 でも動作確認取れています。
TS; DR (kwsk)
ルーターの再起動アプリの作り方
- Automator でアプリケーションを新規作成する。
- [ユーティリティ] - [シェルスクリプトを実行] アクションを右の欄にドラッグ&ドロップする。
- 上記スクリプトをシェルスクリプト欄にコピペする。
-
ip_router
,user
,password
の値を自分のルーターの環境に設定する。 - 実行してみる。
- 動いたら、「完了の通知」など良い感じに自分好みにアクションを追加したりカスタムして保存する。
- 恐らく大抵の NEC の Aterm 系のルーターなら動くと思いますが、他のルーターでも基本動作は同じだと思うのでスクリプトをいじってみてください。
スクリプトの動作概要
-
curl
でルーターの再起動画面のHTMLフォームを取得-
$html_reboot
にフォームを格納。ベーシック認証で取得するのがポイント
-
- フォームに埋め込まれたセッション ID を
grep
とsed
で取得-
$session_id
に格納。再起動のリクエスト(POST)に必要
-
- セッション ID と共に 1 で取得したフォームの他の値も一緒に POST する
- POST (
data
にアクセストークンを添えてcurl
)した結果は$html_result
に格納
- POST (
-
ping
を飛ばし、ルーターのダウンを確認→待機→再アップを確認し、スクリプトを終了-
is_ip_up
関数の結果が「0」の場合はルーター起動中
-
うまく行かない場合
スクリプト・ファイルにしてターミナルから実行して動作するか確認してみてください。
-
適当なファイルに上記スクリプトをコピペ&編集して保存
$ vi /path/to/your/script/reboot.sh
-
実行権限を与える
$ chmod 0755 /path/to/your/script/reboot.sh
-
実行しながらエラーを確認し修正する
$ /path/to/your/script/reboot.sh
-
set -e
などの bash オプションを付けてエラー箇所で止める。 -
curl
時に-v
オプションを付けてHTML取得結果を出力しながら確認する。
-
所感
実家の WiFi ルーターを再起動するために PHP でルータを再起動するスクリプトを書いたのですが、curl
を2回叩くだけなので「シェルコマンドと Automator でアプリ化したら楽じゃね?」と思い bash
で書いてみました。
昔、お客様先のオフィスやクライアントさんの会社で WiFi が不安定と相談された時、(余り良い解決策ではないのですが迅速な対応として)大半がルーターの再起動で直ったことから、調子が悪い時は電源の入れ直しを案内するより、こういったアプリの方が良いかもと、ふと思い出して記事を書いてみました。