自宅にあるWindows PC を外出中に起動する (WoL)

私が外出中に自宅にある Windows PC を起動する仕組みを導入する話です。 単純に Ubuntu のマシンから WoL (Wake On LAN) で Magic Packet を投げるだけの話ではあります。

PCを外出中に起動したくなる状況

正直にいうと頻繁に起動したい場面があるわけでもなく、絶対出来ないと困る、というものでもないです。  最近、私が外出時でも自宅NWに接続するために ZTNA のツールとなる Microsoft Global Secure Access (GSA)のPrivate Access を自宅でも使える状態にしました。  ついでに WoL 実行できる環境も整えておこう、位な感じです。 

とりあえず外出中にPCを起動したい場面を想像してみました。 無理やりというかひねり出した感じです。

  1. 自宅のPC上にあるファイルに緊急でアクセスしたいとき (ほぼほぼクラウドストレージに保管しているけど・・)
  2. 自宅のPCで処理させたいのに電源を落として外出してしまったとき(急ぎパッチを当てたい場面)
  3. 停電やその他要因で不意にPCがシャットダウンされてしまったとき (流しっぱの処理でなんとか再開させたい場面)
  4. 夜中とか子供メイン利用のゲームPCをこっそり使いたいとき(ゲームだったりローカルLLMだったり)
  5. 防犯目的で緊急起動しカメラやマイクで状況を探りたいとき(カメラは複数すでにあるが予備、奥の手として)
  6. TVやブルーレイレコーダを起動したいとき (そんな場面ないけど・・)
  7. プレステを起動してリモートプレイしたいとき 

こんな感じ by 生成AI

Ubuntu への wakeonlan ツールのインストールと基本的な使い方

Perl で書かれたシンプルなツール “wakeonlan” をインストールします。

“wakeonlan”のインストール

apt コマンドで”wakeonlan”をインストールします。 と思ったらすでにインストール済でした。

bash
$ sudo apt install wakeonlan
[sudo: authenticate] Password:
wakeonlan is already the newest version (0.42-6).
Summary:
  Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 2

使い方

使い方はとても簡単で、引数にMACアドレスを”:”区切りで指定するだけです。

bash
$ wakeonlan XX:XX:XX:XX:XX:XX

対話型のシェルスクリプトによる WoL 実行

毎回、MACアドレスを指定して”wakeonlan”を実行するよりも簡単に実行できる準備をしておきます。

テキストファイルのMACアドレスのリスト、シェルスクリプトで対話的に起動したいホストを番号で指定。 これを準備しておきます。

起動対象デバイスリストの準備

起動対象のデバイスを事前にリストに登録しておきます。 “HOSTNAME”にメニューに表示されるデバイス名(これは任意の自分がわかりやすい名前でOK)、半角空白を区切り文字に1ついれて、”-“または”:”区切り文字のMACアドレス

以下の感じです。

wol_list.txt
HOSTNAME 77-88-99-dd-ee-ff

MACアドレスはWindowsでもLinuxでも “arp -a”コマンドで確認可能です。 出力フォーマットはWindowsとLinuxで異なりまして、Linuxは区切り文字が”:”、Windowsは区切り文字が”-“です。 なのでリストではどちらのフォーマットで登録してもよいようにしています。 このあと紹介するスクリプト側でそこは処理するだけです。

対話型のWoL実行用のシェルスクリプト

以下がシェルスクリプトのサンプルです。 そんなに変更するところはないですが、リストのファイル名や置き場を変えたい場合はLIST_FILEを変えてください。

wol_menu.sh
#!/bin/bash

# ホストリストファイルのパス(環境に合わせて変更してください)
LIST_FILE="wol_list.txt"

# ファイルが存在するかチェック
if [ ! -f "$LIST_FILE" ]; then
    echo "エラー: リストファイルが見つかりません: $LIST_FILE"
    exit 1
fi

# 空行やコメント行を除外して配列に読み込む
hosts=()
while IFS= read -r line || [ -n "$line" ]; do
    # 空行や # で始まるコメント行を無視
    [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
    hosts+=("$line")
done < "$LIST_FILE"

# 登録機器があるかチェック
if [ ${#hosts[@]} -eq 0 ]; then
    echo "エラー: リストファイルに有効なホストが登録されていません。"
    exit 1
fi

echo "======================================"
echo " Wake on LAN 起動メニュー"
echo "======================================"

# リストを番号付きで表示
for i in "${!hosts[@]}"; do
    # ホスト名とMACアドレスに分解して綺麗に表示
    read -r hostname mac <<< "${hosts[$i]}"
    printf "[%2d] %-20s (%s)\n" $((i+1)) "$hostname" "$mac"
done
echo "--------------------------------------"

# ユーザー入力の受付
while true; do
    read -p "起動したいホストの番号を入力してください (終了: q): " choice

    # 終了処理
    if [[ "$choice" == "q" || "$choice" == "Q" ]]; then
        echo "終了します。"
        exit 0
    fi

    # 入力が有効な数字かチェック
    if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le "${#hosts[@]}" ]; then
        # 配列のインデックス用に -1 する
        idx=$((choice-1))

        # 選択されたホスト情報からMACアドレスを抽出
        read -r target_name target_mac <<< "${hosts[$idx]}"

        # ハイフン区切り "-" を コロン区切り ":" に置換
        cleaned_mac=$(echo "$target_mac" | tr '-' ':')

        echo "=> ${target_name} (${cleaned_mac}) にマジックパケットを送信します..."

        # wakeonlanを実行
        wakeonlan "$cleaned_mac"
        break
    else
        echo "無効な入力です。1 から ${#hosts[@]} の数字か 'q' を入力してください。"
    fi
done

実行イメージ

実行イメージも簡単に。

bash
# スクリプトと同じディレクトリにリストファイルも配置
$ ls
wol_list.txt  wol_menu.sh


# スクリプトの起動(正常系)
$ ./wol_menu.sh
======================================
 Wake on LAN 起動メニュー
======================================
[ 1] GAMEPC              (d8-44-89-e3-2f-eb)
--------------------------------------
起動したいホストの番号を入力してください (終了: q): 1
=> GAMEPC (d8:44:89:e3:2f:eb) にマジックパケットを送信します...
Sending magic packet to 255.255.255.255:9 with payload d8:44:89:e3:2f:eb
Hardware addresses: <total=1, valid=1, invalid=0>
Magic packets: <sent=1>


# スクリプトの起動(異常系)
$ ./wol_menu.sh
======================================
 Wake on LAN 起動メニュー
======================================
[ 1] GAMEPC              (d8-44-89-e3-2f-eb)
--------------------------------------
起動したいホストの番号を入力してください (終了: q): 99    ←存在しない番号を入力
無効な入力です。1 から 1 の数字か 'q' を入力してください。

起動したいホストの番号を入力してください (終了: q): q     ←"q"で終了
終了します。
$

まとめ

とりあえず、wakeuplanコマンドで手動実行、事前にリストを準備しての対話型の実行の準備と確認ができました。 これでいつでもリモートから起動が行える状態になりました。

あとは実際にはやらないと思いますが、起動するアイデアが何個か浮かんできました。

  • 自分のWebサイトの各市ページで特定のキーワードが含まれていたら起動
  • DNSの自分のドメインで特定のクエリで起動(例えば hogehogehoge.bigriver.jpを1分間に3回検索したら、とか)

ここまで仕込んでPCを起動する場面はないのですけどね。  これをやるときはPC起動だけではなく他の処理も合わせて実行するとよいとは思っています(この命令受けたらすべての私のデータを消去、ロックダウンする、など)。 まあスパイではないのでやる必要はないしやらないと思います。

以上