如果你需要每天携带着笔记本往返于家与公司之间,而其中某些的网络参数都需要手动设置,虽然手动设置IP和DNS地址,切换不同的科学上网工具并不困难,但是每天频繁重复这些无聊的操作真的让人很烦燥。在Windows下可以使用NetSetMan,实现一键切换预先设置好的网络配置。但是如果能通过监控电脑的某些状态实现自动切换,就更加锦上添花,所以在OSX,我就找到了ContorlPanel 利器来自动切换网络配置,同时切换不同的科学上网工具。
ContorlPanel在状态栏(鱼儿icon)
我的笔记本常用的网络分成3类:

网络 蓝灯 影梭 VPN 需求
家里WiFi × × YouTube
公司WiFi × × Google
公司有线 × × 公司内部
  • 蓝灯Lantern专业版看视频稳定。
  • OSX有线网络需买个USB百兆网卡。

所以我几乎每天都重复着以下操作:

使用场景 枯燥但必须的重复操作
家里 关SS,开Lantern
公司查资料 连WiFi,关Lantern,开SS
公司拉代码 关Lantern和SS,接网线,VPN代理

每一次切换都让我备受折磨。

在尝试了使用系统自带的网络位置+Alfred来切换后,感觉还不是很理想,急切需要一个完全自动切换的方案。于是我找到了ControlPlane | Context Sensitive Computing,可以监控自定义的状态(Network,USB,Bluetooth等)自动判断处于什么场景,然后根据场景来配置系统。有点类似IFTTTWorkflow

接下来详细介绍如何使用ControlPanel把上面的所有切换步骤都自动化。

下载安装

直接在ControlPlane 官网下载最新版本。上面也提供源码自编安装。

基本概念及设置

ControlPanelFlow

General设置

  • 在状态栏上只显示icon,后面会通过不同的icon颜色来区分不同的场景(Context)。
  • 可信度(Confidence),每次触发的事件(Evidence Socurce)都可以自定义可信度,只要可信度的总和达到上面设置的要求,就会自动切换到对应的场景中。

Contexts与Evidence Source设置

Context&Evidence Source
可选择的监控来源(Evidence Sources)非常丰富,比如:

  • USB设备插入事件(Attached USB Device)。
  • 附近的WiFi(Nearby WiFi Network)。
  • 接放外来显示器(Attached Monitor)。
  • 开关笔记本盖子(Laptop Lid Open/Closed State)。

后续的Rules会根据你打勾的Source来提供可添加的Rules,建议关闭掉那些你不需要的Evidence Sources。

Rules与Actions设置

Rules&Actions
Rules:规定了满足事件来源(Evidence Source)状态时,会给对应的Context增加指定的可信度(Confidence)。比如:
我在上图设置为只要是USB插入就认定是公司有线,然后把公司(有线)的可信度设置为100%。
Actions:可信度达到General里规定的百分比时就会发生Context切换(离开旧Context,加入新Context)。
Actions也非常丰富,可以打开/关闭指定的应用,执行脚本,设置网络等等,留着自己去探索。
上图,我设置了我的3种Context切换时应该做的事:

  • 进入Work(有线),关闭SS及Lantern,执行设置网络代理脚本。
  • 离开Work(有线),执行取消设置的网络代理脚本。
  • 进入Work(翻墙),关闭Lantern,打开SS。
  • 进入WiFi(翻墙),关闭SS,打开Lantern。

附带: 切换网络代理的脚本

#!/bin/bash
networkservice=$(networksetup -listallnetworkservices | head -n 2 | tail -n 1) #获取Mac当前使用的网络名称
echo Open web proxy for networkservice: $networkservice
sudo networksetup -setdhcp $networkservice 0 #设置DHCP获取IP
sudo networksetup -setwebproxy $networkservice 173.21.3.2 8086 #设置Web HTTP代理
sudo networksetup -setsecurewebproxy $networkservice 173.21.3.2 8086 #设置Web HTTPS代理
sudo networksetup -setwebproxystate $networkservice on #打开Web HTTP代理
sudo networksetup -setsecurewebproxystate $networkservice on #打开Web HTTPS代理
echo Done

调试

当你设计了多种复杂的Rules时,不能直观得到当前状态各个Context的Confidence,这时你可以查看设置(Preferences) -> 高级(Advanced) 里面的实时的计算结果。

总结

根据场景切换网络只是ContorlPanel的一个小应用场景,你可以细读一下设置中的Evidence Source,结合自身需要,尝试把重复的操作自动化,实现一些非常酷的事(欢迎在评论里分享你的实践)。不过美中不足的是它无法像IFTTT那样实现监听某事件然后直接执行具体的Actions上(跳过Context)。比如蓝牙连接到airpods就直接打开网易云音乐。你必须间接使用Context来控制。

参考的资料

一位真正的老师,一位真正的授武者,从来就不应是一位真理的施舍者,他应该是一位领路人,一位通向真理之路的引导者,而真理则必须由学生们自己来发现。–李小龙