想在 mac 上写一个脚本,连上有线或 Wi-Fi 时自动执行某些命令

2021-08-30 11:21:14 +08:00
 zitup

目前想的步骤如下:

  1. 获取网络变化状态
  2. 获取连接的网络标识
    • Wi-Fi (已有命令 /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | awk '/ SSID:/ {print $2}'
    • 有线网络标识
  3. 当是相应的网络标识时,执行某些命令

步骤 1 和获取有线网络标识暂时没办法,求教大佬支招

1741 次点击
所在节点    程序员
9 条回复
ToughGuy
2021-08-30 11:32:14 +08:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import subprocess as sp

device = 'en0'
interval = 2
networks = {
'SSID1': 'LOCATION',
'SSID2': 'LOCATION',
}


def send_notify(title, content):
sp.check_output(['osascript', '-e', 'display notification "{}" with title "{}"'.format(title, content)])


def get_ssid():
cmd = ['networksetup', '-getairportnetwork', device]
out = sp.check_output(cmd).decode().strip()

if not out:
return

fields = out.split()
if len(fields) == 4:
return fields[-1]
return None


def get_location():
return sp.check_output(['networksetup', '-getcurrentlocation']).decode().strip()


def set_location(location):
# send_notify('网络位置发生变化', '当前位置: {}'.format(location))
sp.check_output(['networksetup', '-switchtolocation', location])


def main():
while 1:
ssid = get_ssid()
location = networks.get(ssid, 'Automatic')
if get_location() != location:
set_location(location)
time.sleep(interval)


if __name__ == '__main__':
try:
main()
except Exception:
pass
ToughGuy
2021-08-30 11:34:15 +08:00
之前写过一个根据当前所连接 WIFI 自动切换网络区域的脚本, 你可以参考一下

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKaW1wb3J0IHRpbWUKaW1wb3J0IHN1YnByb2Nlc3MgYXMgc3AKCmRldmljZSA9ICdlbjAnCmludGVydmFsID0gMgpuZXR3b3JrcyA9IHsKICAgICdTU0lEMSc6ICdMT0NBVElPTicsCiAgICAnU1NJRDInOiAnTE9DQVRJT04nLAp9CgoKZGVmIHNlbmRfbm90aWZ5KHRpdGxlLCBjb250ZW50KToKICAgIHNwLmNoZWNrX291dHB1dChbJ29zYXNjcmlwdCcsICctZScsICdkaXNwbGF5IG5vdGlmaWNhdGlvbiAie30iIHdpdGggdGl0bGUgInt9IicuZm9ybWF0KHRpdGxlLCBjb250ZW50KV0pCgoKZGVmIGdldF9zc2lkKCk6CiAgICBjbWQgPSBbJ25ldHdvcmtzZXR1cCcsICctZ2V0YWlycG9ydG5ldHdvcmsnLCBkZXZpY2VdCiAgICBvdXQgPSBzcC5jaGVja19vdXRwdXQoY21kKS5kZWNvZGUoKS5zdHJpcCgpCgogICAgaWYgbm90IG91dDoKICAgICAgICByZXR1cm4KCiAgICBmaWVsZHMgPSBvdXQuc3BsaXQoKQogICAgaWYgbGVuKGZpZWxkcykgPT0gNDoKICAgICAgICByZXR1cm4gZmllbGRzWy0xXQogICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2xvY2F0aW9uKCk6CiAgICByZXR1cm4gc3AuY2hlY2tfb3V0cHV0KFsnbmV0d29ya3NldHVwJywgJy1nZXRjdXJyZW50bG9jYXRpb24nXSkuZGVjb2RlKCkuc3RyaXAoKQoKCmRlZiBzZXRfbG9jYXRpb24obG9jYXRpb24pOgogICAgIyBzZW5kX25vdGlmeSgn572R57uc5L2N572u5Y+R55Sf5Y+Y5YyWJywgJ+W9k+WJjeS9jee9rjoge30nLmZvcm1hdChsb2NhdGlvbikpCiAgICBzcC5jaGVja19vdXRwdXQoWyduZXR3b3Jrc2V0dXAnLCAnLXN3aXRjaHRvbG9jYXRpb24nLCBsb2NhdGlvbl0pCgoKZGVmIG1haW4oKToKICAgIHdoaWxlIDE6CiAgICAgICAgc3NpZCA9IGdldF9zc2lkKCkKICAgICAgICBsb2NhdGlvbiA9IG5ldHdvcmtzLmdldChzc2lkLCAnQXV0b21hdGljJykKICAgICAgICBpZiBnZXRfbG9jYXRpb24oKSAhPSBsb2NhdGlvbjoKICAgICAgICAgICAgc2V0X2xvY2F0aW9uKGxvY2F0aW9uKQogICAgICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHRyeToKICAgICAgICBtYWluKCkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwo=
Kobayashi
2021-08-30 11:47:07 +08:00
我选择 hammerspoon
zitup
2021-08-30 13:47:55 +08:00
@ToughGuy 谢谢大佬,我学习一下
zitup
2021-08-30 13:53:29 +08:00
@zitup 看了下,好叼,但是没看到有线网络相关的,可以根据有线网络执行命令吗
hguandl
2021-08-30 16:42:52 +08:00
最好的方法就是用原生的系统 API 。我搜索得到了 NWPathMonitor,试了下有效。无线网络有办法可以获得 SSID ;有线网络似乎没有什么很好的区分方法,顶多就是获取 IP 网关之类的。

Demo 代码在这里:

https://gist.github.com/hguandl/284ae3b032587eda2958e31383e5135b

我不会写 Swift,这是根据文档照猫画虎写出来的,希望没什么问题。
hguandl
2021-08-30 16:48:44 +08:00
在我自己这边的环境下测试应该是可用的:

https://imgur.com/a/Q6P1mOR
zitup
2021-08-30 17:31:18 +08:00
@hguandl 666,大佬就是大佬,学习了。提供了原生 API 的思路,我顺着摸索下,我是想写一个 node 版本的 shell,所以想找一个 node 包,或者 mac 下的命令,监听网络变化,获取当前网络标识
FrankAdler
2021-08-31 15:24:12 +08:00
3 楼提到的 hammerspoon 确实好用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/798793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX