V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zitup
V2EX  ›  程序员

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

  •  
  •   zitup ·
    zitup · 2021-08-30 11:21:14 +08:00 · 1923 次点击
    这是一个创建于 1178 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前想的步骤如下:

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

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

    9 条回复    2021-08-31 15:24:12 +08:00
    ToughGuy
        1
    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
        2
    ToughGuy  
       2021-08-30 11:34:15 +08:00
    之前写过一个根据当前所连接 WIFI 自动切换网络区域的脚本, 你可以参考一下

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

    Demo 代码在这里:

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

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

    https://imgur.com/a/Q6P1mOR
    zitup
        8
    zitup  
    OP
       2021-08-30 17:31:18 +08:00
    @hguandl 666,大佬就是大佬,学习了。提供了原生 API 的思路,我顺着摸索下,我是想写一个 node 版本的 shell,所以想找一个 node 包,或者 mac 下的命令,监听网络变化,获取当前网络标识
    FrankAdler
        9
    FrankAdler  
       2021-08-31 15:24:12 +08:00   ❤️ 1
    3 楼提到的 hammerspoon 确实好用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3913 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:24 · PVG 18:24 · LAX 02:24 · JFK 05:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.