每天上下班都要在公司与家里的 WiFi 来回切换,并且我们公司需要固定 IP、网关与 DNS。这意味着,每次上下班都要变更网络设置。macOS 自带的位置选择可以轻松地切换不同的网络环境,至少这个设定可以节省每天用来填固定 IP 花费的一分钟。
但是我是不满足于此的。
用Alfred实现位置一键切换
后来我找到了 Alfred 的一个 WorkFlow,唤出 Alfred 输入loc
即可「一键」切换网络位置。
这个方式更为便捷,毕竟能用键盘就不要用鼠标了,这也是我一直在使用的一种方式。
Hammerspoon 介绍
直到昨天,我发现了 Hammerspoon 这款神器。关于 Hammerspoon 的简介,可以阅读一下 v2ex 上的安利帖子:https://www.v2ex.com/t/553241,这里只截取一小段:
Hammerspoon 是 MacOS 上的自动化工具,许多介绍 Hammerspoon 的文章都主要介绍了它是一个窗口管理工具,但是 Hammerspoon 能做到的远远不仅如此。 Hammerspoon 开源、免费和支持插件,将大多数系统层面的接口封装成了 Lua API,这就让这把小锤子在 MacOS 上近乎无所不能,可玩性极高。
Hammerspoon 提供了很多开放 API,用户可以随心所欲地使用 Lua 编写脚本实现某些具体需求的自动化,其中就包括 WiFi 切换监控,这也就为「网络位置自动切换」提供了可能:识别不同的 WiFi SSID 以作出不同的指令。
当然,Hammerspoon 能做的还有很多,感兴趣的可以直接去看看它的 GitHub。
用 Hammerspoon 实现位置自动切换
监控 WiFi 切换并执行相关指令,编写以下 Lua 脚本:
function ssidChangedCallback() -- 回调
ssid = hs.wifi.currentNetwork() -- 获取当前 WiFi ssid
if (ssid ~= nil) then
if (ssid == 'Company') then
uid = "C4A43BA2-1DDE-4C22-BECB-1D3DA2719CBA" -- 公司的位置 uid,后面会讲
hs.notify.new({title="位置", informativeText="位置切换到公司"}):send() -- 发出通知
else
uid = "7500A4F7-72BD-4ABB-9D31-3934BBE13F39"
hs.notify.new({title="位置", informativeText="位置切换到家里"}):send()
end
os.execute("scselect " ..uid .." > /dev/null") -- 切换网络位置
end
end
wifiWatcher = hs.wifi.watcher.new(ssidChangedCallback)
wifiWatcher:start() -- 开始监控
代码里可以看出,网络位置的切换是用 scselect
命令完成的,然后此命令的参数需要一个 uid
,uid
的获取很简单,在终端里执行 scselect
就能拿到了。
当然,一切需要在 WiFi 切换后执行的指令都可以在脚本中完成,比如开关虚拟机、自动 PUSH/PULL 代码,前提是懂一点点 Lua。
每天又为自己节省了两秒钟的时间,真开心。
ssidChangedCallback()好像每次都会重复执行一次,显示两次通知
这个我倒是没遇到过。。
你好 麻烦问一下,每次通知都会重复一次正常吗
公司的网络设置确实烦人
workflow 是哪个。。。
https://github.com/gyk001/alfred-switch-network-location
可以加友链么?我已经加你很久了!
已添加。
https://manman.qian.lu/bokeshu 在这个页面也增加了你的推荐
这个软件我看到过。对于家里蹲的人没用。
还不错。
哇,技术大牛,这都能解决,厉害
Windows有没有类似的软件呢?
Win平台目前还没发现…
高手。。
就是随便折腾啦