Hammerspoon 实现 macOS 位置自动切换

in 折腾 with 10 comments

每天上下班都要在公司与家里的 WiFi 来回切换,并且我们公司需要固定 IP、网关与 DNS。这意味着,每次上下班都要变更网络设置。macOS 自带的位置选择可以轻松地切换不同的网络环境,至少这个设定可以节省每天用来填固定 IP 花费的一分钟。

但是追求效率的怪物是不满足于此的。

用Alfred实现位置一键切换

后来我找到了 Alfred 的一个 WorkFlow,唤出 Alfred 输入loc即可「一键」切换网络位置。
WX20190410-114746.png
这个方式更为便捷,毕竟能用键盘就不要用鼠标了,这也是我一直在使用的一种方式。

关于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 命令完成的,然后此命令的参数需要一个 uiduid 的获取很简单,在终端里执行 scselect 就能拿到了。
1554867403815.jpg

当然,一切需要在 WiFi 切换后执行的指令都可以在脚本中完成,比如开关虚拟机、自动 PUSH/PULL 代码,前提是懂一点点 Lua。

每天又为自己节省了两秒钟的时间,真开心。

Responses
选择表情选择表情
  1. 可以加友链么?我已经加你很久了!

    Reply
    1. @www.qian.lu

      已添加。

      Reply
      1. @大袋鼠

        https://manman.qian.lu/bokeshu 在这个页面也增加了你的推荐

        Reply
  2. 这个软件我看到过。对于家里蹲的人没用。

    Reply
  3. 还不错。

    Reply
  4. 哇,技术大牛,这都能解决,厉害

    Reply
  5. Windows有没有类似的软件呢?

    Reply
    1. @antior

      Win平台目前还没发现…

      Reply
  6. 高手。。

    Reply
    1. @老虎

      就是随便折腾啦 icon_redface.gif

      Reply