1. はじめに
以前の記事で、PythonスクリプトでのWi-Fiルータ再起動について紹介しましたが、bashスクリプトだけでも行けそうな気がしたので試してみました。案の定、curlでWi-Fiルータの再起動をトリガできたので、新たに記事を書くことにします。今回は、スマホでbashスクリプトを実行することに焦点を当てています。
本記事の対象ルータは「BUFFALO WSR-1166DHPL2」です。
以前の記事はこちらです。
2. Termuxのインストール
まずはこれが必要です。AndroidでLinuxターミナルが動いて、サーバ構築すらできてしまう強力なツール。Google Play版はなぜかバージョンが古いので、F-Droid経由でインストールします。以下のサイトをスクロールしていくと「F-DROIDをダウンロード」と書かれたボタンがあるので、ここから .apk ファイルをダウンロードしてインストールします。
F-Droidがインストールできたらアプリを起動してください。アプリ内で「Termux」を検索すると、Termuxの最新版をインストールできます。
3. SSH接続の準備
スマホ画面からポチポチではなかなか話も進まないので、PCからSSHで接続できるようにしてしまいます。まずはTermuxを起動して、以下のコマンドを実行してください。何か入力を求められたら、とりあえずEnterキーを押しておけばOK。
pkg update
pkg upgrade
pkg install openssh
続いて、接続用のパスワードを設定します。
passwd
接続に必要なユーザ名とIPアドレスを確認します。
whoami
ifconfig
最後に、SSHデーモンを起動します。
sshd
4. bashスクリプトの作成
確認しておいたユーザIDとIPアドレスでPCからスマホに接続します。Windowsの場合はPowerShellを使用して以下のコマンドを実行してください。初回接続時は警告が出ますので、yes と入力してください。
ssh u0_axxx@192.168.x.x -p 8022
それでは、ざくざくと進めていきます。まずはスクリプト用のフォルダを作成します。
mkdir ~/reboot_router
次のコマンドで、テキストエディタを開きます。以下のコードをコピペして「Ctrl + O」からのEnterで保存、「Ctrl + X」で終了です。
nano ~/reboot_router/reboot_wsr-1166dhpl2.sh
#!/data/data/com.termux/files/usr/bin/bash
set -euo pipefail
# .envファイルを読み込む
set -a
source "$(dirname "$0")/.env"
set +a
ROUTER_URL="http://${ROUTER_IP}"
LOGIN_URL="${ROUTER_URL}/login.html"
INIT_URL="${ROUTER_URL}/init.html"
COOKIE_JAR="$(mktemp)"
trap 'rm -f "$COOKIE_JAR"' EXIT
# 1. ログイン
login_status=$(curl -sS \
-c "$COOKIE_JAR" \
-o /dev/null \
-w "%{http_code}" \
-X POST \
--data "nosave_Username=${ROUTER_USER}" \
--data "nosave_Password=${ROUTER_PASS}" \
--data "MobileDevice=0" \
--data "nosave_session_num=" \
"$LOGIN_URL")
echo "Login status: ${login_status}"
# 2. init.htmlを取得してセッション番号を探す
init_html="$(curl -sS -b "$COOKIE_JAR" "$INIT_URL")"
session_num="$(grep -Po \
'name="nosave_session_num" value="\K\d+' \
<<<"$init_html" | head -n1)"
if [[ -z "${session_num:-}" ]]; then
echo "セッション番号が見つかりません" >&2
exit
fi
echo "取得したセッション番号: ${session_num}"
# 3. 再起動
set +e
reboot_output=$(curl -sS \
-b "$COOKIE_JAR" \
-o /dev/null \
-w "%{http_code}" \
-X POST \
--max-time 5 \
--data "nosave_reboot=1" \
--data "nosave_session_num=${session_num}" \
"$INIT_URL")
curl_exit=$?
set -e
if [[ $curl_exit -ne 28 ]]; then
echo "再起動リクエスト: ${reboot_output}"
else
echo "ルータ再起動中。タイムアウトしましたが正常です。"
fi
保存してエディタを終了したら、スクリプトに実行権限を付与します。
chmod +x ~/reboot_router/reboot_wsr-1166dhpl2.sh
.env ファイルも必要になるので作成します。お使いの環境に合わせて入力してください。
nano ~/reboot_router/.env
ROUTER_IP=192.168.x.x
ROUTER_USER=xxxxx
ROUTER_PASS=xxxxxxxx
5. エイリアスの作成
スマホ画面からポチポチのレベルでスクリプトを実行したいので、エイリアスを作成します。Termux起動時に有効になるように、.bashrc に追加します。
nano ~/.bashrc
alias wifi='~/reboot_router/reboot_wsr-1166dhpl2.sh'
保存してエディタを終了したら、Termuxを一旦終了して立ち上げ直してください。スマホ画面から wifi と打ってEnterすると…どうでしょうか。Wi-Fiルータを再起動できたでしょうか。私の環境では動きますw