不知在看本文的你是否正处于如下情形:自带的Mac 设备(特指MacBook/Air/Pro 等苹果笔记本)在公司跟家里,因为使用的网络环境不同常常需要来回修改。就Jeff 本身来说,在公司的时候我会连接到公司的办公WiFi,打开内部通讯工具,Proxifier 等工作专用APP,甚至要将设备调成静音;而当我回到家连上家里的Wi-Fi,为了翻墙需要另外设置PAC 路径,同时关闭工作专用APP。第二天的上班下班再次重复同样的流程。
需要说明下,本文标题中的“网络环境”并不单单是指WiFi 的切换,更涵盖了切换网络环境前后的附属动作(即上文所说的开关某些APP 等动作)的范畴。从另外一个角度是指包括你从打开电脑前盖开始到能正常进入工作或娱乐状态前的所有操作。
基于一种理想的惰性思维(凡是重复性的动作皆可自动化),先评估下是否可以采用自动化的方式完成上述的所有操作。之前Jeff 在公司内做了一个Alfred workflow 来解决公司内三大Wi-Fi(因为涉及到公司内部信息,所以代码不便公开)的频繁切换问题,也一直用得很爽,但这种实现方式属于半自动化操作,因为最开始的触发的源头还是要靠自己手动输入关键词开启。如果要实现全自动化,则需要一个触发器(trigger)作为动作(action)的激活源头。根据上一段所言的需求,自然而然可以想到采用Wi-Fi 名(专业点的名称为SSID)——通过连接到不同的SSID 作为触发器来进行不同的动作。
能够实现这个需求的方式还蛮不少,接下来就根据Jeff 的使用经历推荐三种实现方式。前两种是借助第三方应用来实现,第三种则是调用系统原生服务来实现(也是目前Jeff 正在用的)。在介绍完每种实现方式并给出符合以上需求的例子后,会从优劣的角度来分析该种方式并提供个人建议供参考。在进入正文之前将这三种方式先罗列出来作为索引,如果你有需要,完全可以跳着来阅读接下来的内容。
目录索引
方式一:(Mac 应用)Keyboard Maestro 实现连接到指定SSID 激活自定义动作
方式二:(Mac 应用)ControlPlane 建立连接指定SSID 自动触发动作的场景
方式三:(纯代码)借助 launchd 实现Mac 系统中网络变化时自动触发并运行指定脚本
Keyboard Maestro 实现连接到指定SSID 激活自定义动作
简介
Keyboard Maestro 是Mac 上一款比较出名的应用,应用名直译为“键盘大师”,但其实其能做的东西远远超出“键盘”的范畴。Keyboard Maestro 自带了数量非常丰富的触发器(trigger)及相应的动作(action)(如下图)。本文需求的实现则是利用了其中的“Wi-Fi Network Trigger”。
实现
以在我司内的办公WiFi 为例,要实现我们的需求:首先是进入应用的Keyboard Maestro Editor,新建一个Mocros(可以理解为一个使用场景)命名为Office,添加“触发器”为指定连接到指定SSID。添加“动作”分别如下:
1、延迟5s 运行(为防止过于场景的触发过于频繁);2、运行指定applescript 脚本(包括设置PAC 等Keyboard Maestro 本身没有提供的Action);3、设备静音;4、依次打开内部通讯工具、Proxifier 并隐藏;5、提供个Notification 告诉我任务已经执行完毕了。
回到家里的场景也按照来如法炮制。基本上通过上面的方式就可以很容易的实现我们的需求。
评价
优势:应用本身提供了非常多的触发器及动作,操作便捷,流程清晰明了。
劣势:收费应用($36),功能强大的同时必然占据些系统性能,对单一需求有点大材小用
建议:适合不具备编程经验+不介意价格的用户
ControlPlane 建立连接指定SSID 自动触发动作的场景
简介
ControlPlane 是一个根据用户不同使用场景(context)而执行相应系统设置适配的应用。提供的触发器及动作也基本能满足不少使用需求。
实现
以在公司的场景为例,进入到偏好设置:
1、在“context”一栏新建名为“Work”的场景;2、点击到“Evidence Sources”栏,选择触发器为“Nearby WiFi NetWork”; ControlPlane
3、点击到“Rules”栏,左下角新建将与“Nearby WiFi NetWork”选择为“WiFi SSID”,选择需要的公司的办公WiFi。注意Conifidence 要调到尽可能大(过小后续会无法触发,尚不知原因)。4、最后在“Action” 根据需求添加需要的动作即可。
在家里的“Home”的场景也类似,这里就不再累述。
评价
优势:免费应用,使用对象明确。
劣势:图标丑陋(个人看法),设置时候的交互不那么人性化。有时候定义场景(context)的触发会过于敏感。
建议:适合不具备编程经验的用户 + 免费首选
借助launchd 实现Mac 系统中网络变化时自动触发并运行指定脚本
简介
launchd是在Mac 上自带的一个执行定时任务的服务(相当于Linux 上的crontab),其通过plist 文件进行配置。launchd支持的属性有定时任务(StartCalendarInterval),启动运行程序(Startup Process),监控文件变动(WatchPaths)等。
在Mac 上,当网络有变化的时候(如关闭/开启WiFi,连接到不同SSID 等),/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist这个文件就会有变化。因此借助launchd 服务中的WatchPaths特征,就可以实现监控到该文件变化的时候执行指定的脚本文件。
实现
launchd 的常规配置步骤比较繁琐,包括编辑plist 文件,放置文件到指定文件夹,通过命令行启用等等。Jeff 在深入了解其步骤后将这个过程用Python 写了个方便配置的“一键生成”小工具。
Github 地址:https://github.com/Jeff2Ma/launchd-with-networkchange (欢迎给个star 哦!)
使用方法见Github 上的README。囿于篇幅,在这里恕不再重复。你可以在Repo 中的example.sh 的基础上复制一份,重命名为dynamic.sh并根据个人具体需求改写代码。example.sh与dynamic.sh在同一个目录的时候,dynamic.sh会被优先执行。
配置好后,自动运行成功则会静静在右上角提醒:
评价
优势:轻量级,直接系统服务,兼容性好,对系统性能负担小。能实现的action 几乎无限(与你需求及能力相关)
劣势:虽然Jeff 弄了个小工具方便配置,但依然需要使用者本身具备一定的编程能力
建议:推荐够极客范的用户上手尝试 :)
结语
当你用上述三种方式的任一种实现了属于你的工作/家庭间网络环境切换的自动化,你就能享受到这其中的乐趣:来到公司上班打开 MacBook 前盖,输入用户密码后即可立刻上手工作;下班直接盖上就走,回到家也是能打开即用。工作生活场景的切换是无缝的且互不影响,该工作就工作,该下班娱乐就娱乐,思绪灵感不受阻。这是一种多么美妙的事情!
本文首发于我司内网知识平台,略有修改。版权受相关法律保护,转载请提供原始来源为本页URL http://devework.com/mac-automatic-network.html。