6
想在 mac 上写一个脚本,连上有线或 Wi-Fi 时自动执行某些命令
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.
目前想的步骤如下:
- 获取网络变化状态
-
获取连接的网络标识
- Wi-Fi (已有命令
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | awk '/ SSID:/ {print $2}'
) - 有线网络标识
- Wi-Fi (已有命令
- 当是相应的网络标识时,执行某些命令
步骤 1 和获取有线网络标识暂时没办法,求教大佬支招
9 条回复 • 2021-08-31 15:24:12 +08:00
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
# -*- 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 1 天前
之前写过一个根据当前所连接 WIFI 自动切换网络区域的脚本, 你可以参考一下
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKaW1wb3J0IHRpbWUKaW1wb3J0IHN1YnByb2Nlc3MgYXMgc3AKCmRldmljZSA9ICdlbjAnCmludGVydmFsID0gMgpuZXR3b3JrcyA9IHsKICAgICdTU0lEMSc6ICdMT0NBVElPTicsCiAgICAnU1NJRDInOiAnTE9DQVRJT04nLAp9CgoKZGVmIHNlbmRfbm90aWZ5KHRpdGxlLCBjb250ZW50KToKICAgIHNwLmNoZWNrX291dHB1dChbJ29zYXNjcmlwdCcsICctZScsICdkaXNwbGF5IG5vdGlmaWNhdGlvbiAie30iIHdpdGggdGl0bGUgInt9IicuZm9ybWF0KHRpdGxlLCBjb250ZW50KV0pCgoKZGVmIGdldF9zc2lkKCk6CiAgICBjbWQgPSBbJ25ldHdvcmtzZXR1cCcsICctZ2V0YWlycG9ydG5ldHdvcmsnLCBkZXZpY2VdCiAgICBvdXQgPSBzcC5jaGVja19vdXRwdXQoY21kKS5kZWNvZGUoKS5zdHJpcCgpCgogICAgaWYgbm90IG91dDoKICAgICAgICByZXR1cm4KCiAgICBmaWVsZHMgPSBvdXQuc3BsaXQoKQogICAgaWYgbGVuKGZpZWxkcykgPT0gNDoKICAgICAgICByZXR1cm4gZmllbGRzWy0xXQogICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2xvY2F0aW9uKCk6CiAgICByZXR1cm4gc3AuY2hlY2tfb3V0cHV0KFsnbmV0d29ya3NldHVwJywgJy1nZXRjdXJyZW50bG9jYXRpb24nXSkuZGVjb2RlKCkuc3RyaXAoKQoKCmRlZiBzZXRfbG9jYXRpb24obG9jYXRpb24pOgogICAgIyBzZW5kX25vdGlmeSgn572R57uc5L2N572u5Y+R55Sf5Y+Y5YyWJywgJ+W9k+WJjeS9jee9rjoge30nLmZvcm1hdChsb2NhdGlvbikpCiAgICBzcC5jaGVja19vdXRwdXQoWyduZXR3b3Jrc2V0dXAnLCAnLXN3aXRjaHRvbG9jYXRpb24nLCBsb2NhdGlvbl0pCgoKZGVmIG1haW4oKToKICAgIHdoaWxlIDE6CiAgICAgICAgc3NpZCA9IGdldF9zc2lkKCkKICAgICAgICBsb2NhdGlvbiA9IG5ldHdvcmtzLmdldChzc2lkLCAnQXV0b21hdGljJykKICAgICAgICBpZiBnZXRfbG9jYXRpb24oKSAhPSBsb2NhdGlvbjoKICAgICAgICAgICAgc2V0X2xvY2F0aW9uKGxvY2F0aW9uKQogICAgICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHRyeToKICAgICAgICBtYWluKCkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwo=
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKaW1wb3J0IHRpbWUKaW1wb3J0IHN1YnByb2Nlc3MgYXMgc3AKCmRldmljZSA9ICdlbjAnCmludGVydmFsID0gMgpuZXR3b3JrcyA9IHsKICAgICdTU0lEMSc6ICdMT0NBVElPTicsCiAgICAnU1NJRDInOiAnTE9DQVRJT04nLAp9CgoKZGVmIHNlbmRfbm90aWZ5KHRpdGxlLCBjb250ZW50KToKICAgIHNwLmNoZWNrX291dHB1dChbJ29zYXNjcmlwdCcsICctZScsICdkaXNwbGF5IG5vdGlmaWNhdGlvbiAie30iIHdpdGggdGl0bGUgInt9IicuZm9ybWF0KHRpdGxlLCBjb250ZW50KV0pCgoKZGVmIGdldF9zc2lkKCk6CiAgICBjbWQgPSBbJ25ldHdvcmtzZXR1cCcsICctZ2V0YWlycG9ydG5ldHdvcmsnLCBkZXZpY2VdCiAgICBvdXQgPSBzcC5jaGVja19vdXRwdXQoY21kKS5kZWNvZGUoKS5zdHJpcCgpCgogICAgaWYgbm90IG91dDoKICAgICAgICByZXR1cm4KCiAgICBmaWVsZHMgPSBvdXQuc3BsaXQoKQogICAgaWYgbGVuKGZpZWxkcykgPT0gNDoKICAgICAgICByZXR1cm4gZmllbGRzWy0xXQogICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2xvY2F0aW9uKCk6CiAgICByZXR1cm4gc3AuY2hlY2tfb3V0cHV0KFsnbmV0d29ya3NldHVwJywgJy1nZXRjdXJyZW50bG9jYXRpb24nXSkuZGVjb2RlKCkuc3RyaXAoKQoKCmRlZiBzZXRfbG9jYXRpb24obG9jYXRpb24pOgogICAgIyBzZW5kX25vdGlmeSgn572R57uc5L2N572u5Y+R55Sf5Y+Y5YyWJywgJ+W9k+WJjeS9jee9rjoge30nLmZvcm1hdChsb2NhdGlvbikpCiAgICBzcC5jaGVja19vdXRwdXQoWyduZXR3b3Jrc2V0dXAnLCAnLXN3aXRjaHRvbG9jYXRpb24nLCBsb2NhdGlvbl0pCgoKZGVmIG1haW4oKToKICAgIHdoaWxlIDE6CiAgICAgICAgc3NpZCA9IGdldF9zc2lkKCkKICAgICAgICBsb2NhdGlvbiA9IG5ldHdvcmtzLmdldChzc2lkLCAnQXV0b21hdGljJykKICAgICAgICBpZiBnZXRfbG9jYXRpb24oKSAhPSBsb2NhdGlvbjoKICAgICAgICAgICAgc2V0X2xvY2F0aW9uKGxvY2F0aW9uKQogICAgICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHRyeToKICAgICAgICBtYWluKCkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwo=
hguandl 23 小时 50 分钟前
最好的方法就是用原生的系统 API 。我搜索得到了 NWPathMonitor,试了下有效。无线网络有办法可以获得 SSID ;有线网络似乎没有什么很好的区分方法,顶多就是获取 IP 网关之类的。
Demo 代码在这里:我不会写 Swift,这是根据文档照猫画虎写出来的,希望没什么问题。
Demo 代码在这里:我不会写 Swift,这是根据文档照猫画虎写出来的,希望没什么问题。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK