Macの起動/スリープ復帰時に自動でVPNに接続する
このご時世ということで、僕の勤務先もほぼ全面リモートワークに切り替わっている。
弊社では社外のネットワークからだと、勤怠システムやGitHub Enterpriseにアクセスすることができない。そのためVPNに接続する必要があるんだけど、VPNの接続って結構めんどくさいよね。
- Macを起動していてGitHubにアクセスしようとしたら、VPNに繋がっていなかった
- メニューバーからVPNに接続
- VPNに接続したままMacをスリープ→スリープ復帰すると、メニューバーの表示ではVPNに繋がっていることになっているが、通信が切断されている
- そのため手動で接続解除→再接続する必要がある
こんな感じ。面倒ですよね。
というのを、AppleScriptとsleepwatcherを使って解決する。
Macの起動時に自動でVPNに接続する
スクリプトエディタ.appを開く。以下をコピペ。
tell application "System Events"
tell current location of network preferences
set myConnection to the service "VPN_NAME"
if myConnection is not null then
if current configuration of myConnection is not connected then
connect myConnection
end if
end if
end tell
end tell
VPN_NAME
は、接続したいVPNの名前に置き換える。
で、書き出す。
書き出し名は適当に決める。分かりやすいように「ConnectVPN」という名前にした。ファイルフォーマットは「アプリケーション」にする。保存場所はアプリケーションフォルダに。
あとは、ログイン項目にConnectVPNを追加すれば終わり。次回の再起動のときから自動でVPNに接続してくれるようになる。
Macのスリープ復帰時に自動でVPNに接続する
正確には、Macのスリープ時にVPNを切断して、スリープ復帰時にVPNを接続するようにする。
上にも書いたけど、スリープ復帰時には見た目上はVPNに繋がっているものの、接続解除→接続をしないとちゃんと通信できないので。
シェルスクリプトを作成
connect_vpn.sh
とdisconnect_vpn.sh
という2つのシェルスクリプトを任意の場所に作成する(名前はなんでもいいです)。
connect_vpn.sh
#!/usr/bin/osascript
tell application "System Events"
tell current location of network preferences
set myConnection to the service "VPN_NAME"
if myConnection is not null then
if current configuration of myConnection is not connected then
connect myConnection
end if
end if
end tell
end tell
display notification "VPN reconnecting..." with title "Reconnect VPN"
delay 1
disconnect_vpn.sh
#!/usr/bin/osascript
tell application "System Events"
tell current location of network preferences
set myConnection to the service "VPN_NAME"
if myConnection is not null then
if current configuration of myConnection is connected then
disconnect myConnection
end if
end if
end tell
end tell
先ほどと同じく、VPN_NAME
は接続したいVPNの名前に置き換える。
実行権限を付与
$ chmod u+x /path/to/connect_vpn.sh
$ chmod u+x /path/to/disconnect_vpn.sh
sleepwatcherをインストール
sleepwatcher — Homebrew Formulae
sleepwatcherを使うと、スリープ時/スリープ復帰時に任意のスクリプトを実行できる。Homebrewで入れられる。
$ brew install sleepwatcher
plistファイルを作成する
~/Library/LaunchAgents
以下に適当な名前でplistファイルを作る。
今回はsleepwatcher.plist
という名前にした。
sleepwatcher.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>sleepwatcher</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/sleepwatcher</string>
<string>-V</string>
<string>-w /path/to/connect_vpn.sh</string>
<string>-s /path/to/disconnect_vpn.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
-w
がWakeUp時、つまりスリープ復帰時に実行するスクリプト。-s
はSleep時、つまりスリープ時に実行するスクリプト。
先程作成したシェルスクリプトを指定する。
サービスのロード
$ launchctl load ~/Library/LaunchAgents/sleepwatcher.plist
これで、次からのスリープ時にVPNを自動で切断、スリープ復帰時に自動でVPNに接続してくれるようになる。便利ですね。
ググると、一定時間ごとにVPNの接続状況を見て、接続していなかったら自動で再接続してくれるAppleScriptが出てくる。けど、もしかしたら任意でVPNを切断したいときもあるかもなぁと思い、それはやめておいた。
VPNの接続/切断はほんのわずかな手間だけど、それがなくなっただけで体験がとても良くなったので満足。
2022/10/04 追記
新しいMacBook Proで同じことをやろうとしたらエラーでちょっと詰まってしまった。そんな場合は、こちらを見ると解決するかも知れません。