👻

macOSで無線LANのSSIDが切り替わった際に通知を送る

2022/10/12に公開

背景

大学内で部屋を移動した際に無線LANのネットワークが切り替わっていることに気づかないことが多いのでどうにかしたい。

実行環境

  • MacBook Pro (13-inch, M1, 2020)
  • macOS Monterey (12.6)

設定

  • 以下のシェルスクリプトを ~/bin/checkssid.sh として保存

    ~/bin/checkssid.sh
    #!/bin/zsh
    
    local ssid_file="/tmp/ssid-$USER"
    local prev_ssid=""
    if [ -f $ssid_file ]; then
      prev_ssid=$(head -n 1 $ssid_file)
    fi
    local ssid=$(/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -I | awk -F' SSID: ' '/ SSID: / {print $2}')
    echo $ssid > $ssid_file
    if [[ $ssid != $prev_ssid ]]; then
      # echo "SSID changed from $prev_ssid to $ssid"
      osascript -e 'display notification "'"SSID changed to $ssid"'" with title "Check SSID" sound name "default"'
    fi
    
  • とりあえず実行

    % /bin/zsh ~/bin/checkssid.sh
    % rm /tmp/ssid-$USER
    

    notify-ssid-changed

  • 通知が届くことを確認したら、LaunchAgent に仕込む。以下の内容を ~/Library/LaunchAgent/checkssid.plist として保存

    ~/Library/LaunchAgent/checkssid.plist
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>Label</key>
        <string>checkssid</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/zsh</string>
            <string>/Users/funa/bin/checkssid.sh</string>
        </array>
        <key>StartInterval</key>
        <integer>10</integer>
        <key>StandardOutPath</key>
        <string>/tmp/checkssid.out</string>
        <key>StandardErrorPath</key>
        <string>/tmp/checkssid.err</string>
    </dict>
    </plist>
    
    • 10行目の checkssid.sh のパス(/Users/funa/bin/checkssid.sh)を各自の絶対パスに変更する
    • SSIDをチェックする間隔を <integer>タグ内の数字で指定(上記例では 10秒間隔)
  • 念の為、lint で構文チェック

    % plutil -lint ~/Library/LaunchAgents/checkssid.plist
    /Users/funa/Library/LaunchAgents/checkssid.plist: OK
    
  • LaunchAgent に登録

    % launchctl load ~/Library/LaunchAgents/checkssid.plist
    % launchctl list | grep -e PID -e checkssid
    PID     Status  Label
    -       0       checkssid
    

    Status0 ではなかった場合、実行時にエラーが出ているので /tmp/checkssid.err を確認する。

うまく動作しているなら10秒後に通知が表示され、その後は SSID が切り替わった際に通知が届く。

考察

  • 再起動後に必ず通知が出るのを避けたい場合、checkssid.sh 3行目の local ssid_file= の右辺をホームディレクトリ以下(ex. $HOME/.ssid.txt 等)に変更する
  • 通知音を変更したい場合は checkssid.sh 12行目の sound name "default"sound name "Ping" などに変更(使用可能な名前は /System/Library/Sounds/*.aiff もしくは ~/Library/Sounds/*.aiff 参照)。
  • 通知がうざい、と思ったら以下のコマンドで登録を解除
    % launchctl unload ~/Library/LaunchAgents/checkssid.plist
    

参考文献

Discussion