Edited at

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

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に保存しました。


作成したシェルスクリプトには、実行属性を付けてください。

@okadate さん、コメントありがとうございます。



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


あとがき

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