6

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

 3 years ago
source link: https://www.v2ex.com/t/798793
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  程序员

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

  zitup · 1 天前 · 864 次点击

目前想的步骤如下:

  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

ToughGuy   1 天前

#!/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

ToughGuy   1 天前

之前写过一个根据当前所连接 WIFI 自动切换网络区域的脚本, 你可以参考一下

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKaW1wb3J0IHRpbWUKaW1wb3J0IHN1YnByb2Nlc3MgYXMgc3AKCmRldmljZSA9ICdlbjAnCmludGVydmFsID0gMgpuZXR3b3JrcyA9IHsKICAgICdTU0lEMSc6ICdMT0NBVElPTicsCiAgICAnU1NJRDInOiAnTE9DQVRJT04nLAp9CgoKZGVmIHNlbmRfbm90aWZ5KHRpdGxlLCBjb250ZW50KToKICAgIHNwLmNoZWNrX291dHB1dChbJ29zYXNjcmlwdCcsICctZScsICdkaXNwbGF5IG5vdGlmaWNhdGlvbiAie30iIHdpdGggdGl0bGUgInt9IicuZm9ybWF0KHRpdGxlLCBjb250ZW50KV0pCgoKZGVmIGdldF9zc2lkKCk6CiAgICBjbWQgPSBbJ25ldHdvcmtzZXR1cCcsICctZ2V0YWlycG9ydG5ldHdvcmsnLCBkZXZpY2VdCiAgICBvdXQgPSBzcC5jaGVja19vdXRwdXQoY21kKS5kZWNvZGUoKS5zdHJpcCgpCgogICAgaWYgbm90IG91dDoKICAgICAgICByZXR1cm4KCiAgICBmaWVsZHMgPSBvdXQuc3BsaXQoKQogICAgaWYgbGVuKGZpZWxkcykgPT0gNDoKICAgICAgICByZXR1cm4gZmllbGRzWy0xXQogICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2xvY2F0aW9uKCk6CiAgICByZXR1cm4gc3AuY2hlY2tfb3V0cHV0KFsnbmV0d29ya3NldHVwJywgJy1nZXRjdXJyZW50bG9jYXRpb24nXSkuZGVjb2RlKCkuc3RyaXAoKQoKCmRlZiBzZXRfbG9jYXRpb24obG9jYXRpb24pOgogICAgIyBzZW5kX25vdGlmeSgn572R57uc5L2N572u5Y+R55Sf5Y+Y5YyWJywgJ+W9k+WJjeS9jee9rjoge30nLmZvcm1hdChsb2NhdGlvbikpCiAgICBzcC5jaGVja19vdXRwdXQoWyduZXR3b3Jrc2V0dXAnLCAnLXN3aXRjaHRvbG9jYXRpb24nLCBsb2NhdGlvbl0pCgoKZGVmIG1haW4oKToKICAgIHdoaWxlIDE6CiAgICAgICAgc3NpZCA9IGdldF9zc2lkKCkKICAgICAgICBsb2NhdGlvbiA9IG5ldHdvcmtzLmdldChzc2lkLCAnQXV0b21hdGljJykKICAgICAgICBpZiBnZXRfbG9jYXRpb24oKSAhPSBsb2NhdGlvbjoKICAgICAgICAgICAgc2V0X2xvY2F0aW9uKGxvY2F0aW9uKQogICAgICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHRyeToKICAgICAgICBtYWluKCkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwo=

Kobayashi

Kobayashi   1 天前

我选择 hammerspoon

zitup

zitup   1 天前

@ToughGuy 谢谢大佬,我学习一下

zitup

zitup   1 天前

@zitup 看了下,好叼,但是没看到有线网络相关的,可以根据有线网络执行命令吗

hguandl

hguandl   23 小时 50 分钟前

最好的方法就是用原生的系统 API 。我搜索得到了 NWPathMonitor,试了下有效。无线网络有办法可以获得 SSID ;有线网络似乎没有什么很好的区分方法,顶多就是获取 IP 网关之类的。

Demo 代码在这里:我不会写 Swift,这是根据文档照猫画虎写出来的,希望没什么问题。

zitup

zitup   23 小时 2 分钟前

@hguandl 666,大佬就是大佬,学习了。提供了原生 API 的思路,我顺着摸索下,我是想写一个 node 版本的 shell,所以想找一个 node 包,或者 mac 下的命令,监听网络变化,获取当前网络标识

FrankAdler

FrankAdler   1 小时 9 分钟前   ❤️ 1

3 楼提到的 hammerspoon 确实好用

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK