Help us understand the problem. What is going on with this article?

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


作成したシェルスクリプトには、実行属性を付けてください。
@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というユーザ権限で動作するネットワーク環境を切り替えるコマンドを見つけて解決😂

あとがき

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした