特定Wifiの時に自動でVPN接続
僕が通っている大学にeduroamが導入されて、VPNのプロトコルが普通に通るようになりました。 VPNを併用して常時こっちを使いたいなーと思ったのですが、どうせなら自動でVPN接続したいと考えますよね。 しかも、特定のWifiの時のみ自動接続したいですよね。
ということで、Mac専用になりますが、いくらかサイトを参考にしたり、コードをお借りしながらAppleScriptを書いてみました。
# http://www.showwin.asia/2014/07/30/mac%E3%81%A7vpn%E3%82%92%E7%B9%8B%E3%81%8E%E3%81%A3%E3%81%B1%E3%81%AA%E3%81%97%E3%81%AB%E3%81%99%E3%82%8Bapplescript/ on idle tell application "System Events" tell current location of network preferences set myConnection to the service "VPN" set targetWifi to {"eduroam"} if myConnection is not null then if current configuration of myConnection is not connected then set wifiName to getAirportNetworkName() of me if wifiName is in targetWifi then display notification "Connecting VPN..." connect myConnection end if end if end if end tell return 30 end tell end idle # http://piyocast.com/as/archives/2050 # 無線LANで接続中のネットワーク名称を取得 on getAirportNetworkName() set v2 to system attribute "sys2" if v2 ≤ 6 then set hardWareName to "AirPort" set aMesStr to "Current AirPort Network: " else if v2 ≥ 7 then set hardWareName to "Wi-Fi" set aMesStr to "Current Wi-Fi Network: " end if set dName to getHardwareDeviceName(hardWareName) of me set sText to "/usr/sbin/networksetup -getairportnetwork " & dName set sRes to do shell script sText if sRes does not start with "You are not associated with " then set sRes2 to repChar(sRes, aMesStr, "") of me else set sRes2 to "" end if return sRes2 end getAirportNetworkName # 指定ハードウェアポートのデバイス名を取得する on getHardwareDeviceName(targName) set sRes to do shell script "/usr/sbin/networksetup -listallhardwareports" set sList to paragraphs of sRes set s1List to items 2 thru -1 of sList set s2List to {} repeat with i in s1List set j to contents of i if j is equal to "VLAN Configurations" then exit repeat end if set the end of s2List to j end repeat # ネットワークポート関連のレコードを作成 set s3List to {} set aLen to length of s2List repeat with i from 1 to aLen by 4 set a1Item to contents of item i of s2List set a1Item to repChar(a1Item, "Hardware Port: ", "") of me set a2Item to contents of item (i + 1) of s2List set a2Item to repChar(a2Item, "Device: ", "") of me set a3Item to contents of item (i + 2) of s2List set a3Item to repChar(a3Item, "Ethernet Address: ", "") of me set the end of s3List to {hardwarePort:a1Item, device:a2Item, ethernetAddress:a3Item} end repeat repeat with i in s3List set j1 to hardwarePort of i set j2 to device of i if j1 is equal to targName then return j2 end if end repeat return "" end getHardwareDeviceName # 文字置換ルーチン on repChar(origText, targStr, repStr) set {txdl, AppleScript's text item delimiters} to {AppleScript's text item delimiters, targStr} set temp to text items of origText set AppleScript's text item delimiters to repStr set res to temp as text set AppleScript's text item delimiters to txdl return res end repChar
5行目の"VPN"
を接続先のVPNの名前、{"eduroam"}
は対象のSSIDをリスト形式で指定しています。
処理としては、「VPNが未接続かつ接続中のWifiが対象だったら自動接続」を30秒おきに実行しています。
コードをお借りしたサイト
- MacでVPNを繋ぎっぱなしにするAppleScript | しょ〜うぃん広場
- AS Hole(AppleScriptの穴) By Piyomaru Software » 無線LANネットワーク名称を取得する v1.1 » Blog Archive
- 作者: こばやしゆたか,AppleScriptリファレンス制作委員会
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 1999/12
- メディア: 単行本
- クリック: 10回
- この商品を含むブログ (4件) を見る