ShellScript
Mac
MacBook

Wifi接続先に応じてネットワーク環境設定を自動で切り替える

More than 1 year has passed since last update.

MacBookを自宅、会社、カフェ等出先で使っているのですが、
会社でIPアドレスやDNSサーバを静的に設定する必要がありました。
自宅に持って帰るとIPアドレスが違ってネットに繋がりません。
IPアドレスを自動取得に切り替えるのですが、面倒なので自動化しました。

この自動化の作成にあたり、以下の記事とサイトを参考にさせて頂きました。ありがとうございます。
http://qiita.com/narikin/items/41389c30cef80cc89b80
http://takuya-1st.hatenablog.jp/entry/2015/06/02/145548
http://takuya-1st.hatenablog.jp/entry/2014/11/06/104120

ネットワーク環境を使う (Mac OS X v10.6 以降)

Kobito.ZKmwf8.png

Kobito.3mbNJ0.png
↑このプルダウン・・・

Kobito.JOAR9t.png
IPアドレスやDNS、ネットワークに関する設定をまとめてプリセットとして保存することが出来ます。
自動化していなかった頃はこの画面からポチポチと手動で切り替えてました。
今回はこのポチポチする操作を自動化します。
ネットワーク環境の使い方は割愛します。
https://support.apple.com/ja-jp/HT202480

使い方

wifi_environment_auto_selector.sh
#!/bin/sh
switchtolocation() {
  currentlocation=`networksetup -getcurrentlocation`
  if test $currentlocation = $1; then
    return
  fi
  scselect `scselect|grep ${1}|cut -b 4-40`
  osascript -e 'display notification "'"ネットワーク環境を「${1}」へ変更しました。"'" with title "'"${0##*/}"'" subtitle "'"${2}"'"'
}

ADAPTER="MacBookのWifiインターフェース名"

airportpower=`networksetup -getairportpower ${ADAPTER}|cut -d' ' -f4`
if test ${airportpower} = 'Off'; then
  echo 'Wifi is Off.'
  exit
fi

ssid=`networksetup -getairportnetwork ${ADAPTER}|cut -d':' -f2|cut -b 2-`
case "$ssid" in
  "自宅のSSID")
    switchtolocation "自宅を定義しているネットワーク環境名" ${ssid}
    ;;
  "会社のSSID")
    switchtolocation "会社を…" ${ssid}
    ;;
  *)
    switchtolocation "Automatic" ${ssid}
    ;;
esac

11行目を
ADAPTER=en0
など、Wifiのインターフェース名に書き換えてください。

21行目,22行目ならびに24行目,25行目を
SSIDとそれに対応するネットワーク環境名に書き換えてください。

書き換えたシェルスクリプトファイルをどこでもいいので保存してください。
自分は/Users/naname/sh/wifi_environment_auto_selector.shに保存しました。

wifi_environment_auto_selector.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>wifi_environment_auto_selector</string>
  <key>ProgramArguments</key>
  <array>
    <string>スクリプトのパス</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WatchPaths</key>
  <array>
    <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
  </array>
</dict>
</plist>

10行目を保存したシェルスクリプトのパスへ書き換えてください。
自分の場合は<string>/Users/naname/sh/wifi_environment_auto_selector.sh</string>ですね。
上記plistファイルを~/Library/LaunchAgents/wifi_environment_auto_selector.plistとして保存してください。

launchctl load ~/Library/LaunchAgents/wifi_environment_auto_selector.plist
上記コマンドをターミナルで実行してください。

以下はスクリプトを書いてみて思った事と駄文です。

ネットワーク環境を自動で切り替えるシェルスクリプト

  1. SSIDの変更を検出する
  2. ネットワーク環境を切り替える
  3. 切り替えたことを画面に表示して通知する

SSIDの変更を検出する

launchdのwatchpathsを使って、SSIDに関する何かが書かれていると思われるファイルの変更を検出することでSSIDの変更を検出します。
https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html
さっぱり分かりません😱

ネットワーク環境を切り替えるコマンド

networksetupコマンドを使えばネットワーク環境が切り替えられる!これで自動化出来る!😀

切り替える場合はroot権限が必要😅

シェルスクリプトをroot権限で動かせばいいんじゃね?💪🏿

root権限で動かすとSessionTypeがnonGUIな感じで通知が出ないっぽい☠️

sudo噛ましてsudoersでnetworksetupコマンドのみ許可すれば・・・💩

シェルスクリプトを書く前に気がつくべきでした。問題にぶち当たる度に心が折れそうでした。

scselectというユーザ権限で動作するネットワーク環境を切り替えるコマンドを見つけて解決😂

あとがき

間違い、問題点、こうしたら良いなどありましたら、コメントへお願いします。