Chapter 08

おまけ:電源を入れたら自動で立ち上がるようにする

yutafujii
yutafujii
2021.07.03に更新

おまけとして,Raspberry Piの電源を入れるだけでモニター・キーボードなしでも自動でWiFiホスティングできるための手順を紹介します.

Raspberry Piのポータビリティがあるのに,モニタやキーボードがないとWiFiを立ち上げられないのは不便です.そこでRunlevelを変更してGUIがなくてもログイン可能にして,キーストロークインジェクションを組み合わせることで,電源を入れてUSBを挿入すればWiFiが立ち上がるようにします.

トリッキーなのはモニタもキーボードもなしにログインするという点であり,キーストロークインジェクションという変わったツールを利用します.

手順の概要は以下の通りです:

  1. Raspberry PiがGUIがなくても起動するモードに変更
  2. WiFiホスティングのshファイルを作成
  3. USB Rubber Duckyにキーボード操作手順を入力し,Raspberry Piに挿入

GUIがなくても起動するモード

Linuxには起動モードが複数用意されています.

Runlevel モード 処理
0 poweroff シャットダウン
1 rescue, single-user rootユーザーログインのみ,ネットワーク設定,デーモン起動なし
2 multi-user ネットワーク設定,デーモン起動なし
3 multi-user GUI起動しない点を除き通常起動
4 undefined ユーザー設定可能
5 graphical runlevel3 + GUI起動
6 reboot 再起動

モニタがなくても起動させるためには最低限GUIマネージャーの起動をOFFにする必要があるので,runlevelを3にします.

# 現在のRunlevelを確認
ls -l /lib/systemd/system/default.target
-> graphical.targetになっているはず

# 現在のRunlevelを確認
systemctl set-default multi-user.target

設定はこれで終わりです.終わったら再起動してみましょう.

なおRunlevel3で起動しても,この段階だとモニタに繋がないとさすがに何もできません.通常通りモニタにHDMIで接続し,起動してみると,質素なコマンドラインだけの見た目になってログイン画面が映ると思います.このとき,マウスは全く使えません.

Runlevel3で起動してGUIを使いたいという場合,以下のコマンドを打ち込んでください.

# start GUI, run:
startx

# kill GUI instance, press ctrl alt backspace

scriptを書く

Runlevel3で起動する準備ができたっら,次は今回の手順で紹介してきたhostapd, dnsmasqを起動するスクリプトを書きます.多少雑な部分もあると思いますが私は以下のように書きました.

#! /bin/bash

NIC=$(airmon-ng|grep 8188eu|awk '{print $2}')
out=$(airmon-ng|grep brcmfmac|awk '{print $2}')

systemctl stop dnsmasq
killall hostapd

if [ "$NIC" != "" ]; then
sed -i "s/wlan[0-9]\{1\}/$NIC/g" /etc/hostapd/hostapd.conf
sed -i "s/wlan[0-9]\{1\}/$NIC/g" /etc/dnsmasq.d/dnsmasq.conf

hostapd /etc/hostapd/hostapd.conf -B

ifconfig $NIC up 192.168.1.1 netmask 255.255.255.0
# route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1

systemctl start dnsmasq

if [ "$out" != "" ]; then
iptables --table nat --append POSTROUTING --out-interface $out -j MASQUERADE
# iptables --append FORWARD --in-interface $NIC -j ACCEPT
fi

echo 1 > /proc/sys/net/ipv4/ip_forward
fi

同じものはGithub上にも置きましたのでご活用してみてください.

https://github.com/YutaFujii0/wifi-hosting/blob/main/wifi-hosting.sh

USB Rubber Ducky

最終的にモニタがなくても動かすためには,ログインができて,WiFiホスティングのスクリプトを実行する,という操作が必要です.普段は当たり前のようにモニタを見ながらキーボードで必要な処理を打っているのですが,絶対に間違わないキーボード打鍵ができればモニタは要らなくなります.

USB Rubber Duckyはキーストロークインジェクションツールと呼ばれるもので,キーボードの操作をメモリに保存し,USB挿入時に当該打鍵をキーボードなしで再現するものです.

出所 公式HP

なので,事前にUSB Rubber Duckyには以下のようなコマンドをmicroSDカードを通してINPUTする作業が必要になります.詳細な設定方法はここでは割愛しますが(参考:公式Doc),再現するキーストロークは以下のようなものです.

DELAY 2000
STRING root
DELAY 1000
ENTER
DELAY 2000
STRING <YOUR LOGIN PASSWORD>
DELAY 1000
ENTER
DELAY 3000
STRING bash <path to wifi-hosting.sh>
DELAY 800
ENTER

USB挿入後2秒待ち,"root"を入力,1秒待ってENTERキーを打鍵,2秒待ってパスワード文字列を打鍵・・・というようなイメージです.

完成!

説明下手な箇所も多々あったかと思いますが,これで手順は終了です!電源を入れて1〜2分待ち,ログイン画面までの起動が終わっているだろうタイミングでUSBを挿入すればWiFiが立ち上がるようになります.