LOG

Category

Macの起動/スリープ復帰時に自動でVPNに接続する

2020/4/22

このご時世ということで、僕の勤務先もほぼ全面リモートワークに切り替わっている。

弊社では社外のネットワークからだと、勤怠システムや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.shdisconnect_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で同じことをやろうとしたらエラーでちょっと詰まってしまった。そんな場合は、こちらを見ると解決するかも知れません。

macOS起動時にスクリプトを実行する – Qiita