Mac 自动代理切换

Mac 自动代理切换

背景:

工作有时需要用goole搜索,所以会配置一下公司提供的HTTP和HTTPS代理,但是下班之后回到家,只有公司内网才能访问代理,所以还需要把代理关掉。每次都要点呀点,有点麻烦,所以打算弄个脚本来简化这个过程

请添加图片描述

v1.0

mac 上自带了脚本编辑器,使用applescript,参考一些博客写了一个进行开关代理的脚本,源码如下:

tell application "System Events"

    set proxy_dialog to display dialog "Wi-Fi代理:" buttons {"打开代理", "关闭代理"} default button "打开代理" with title "代理快速切换"

    set proxy_interface to button returned of proxy_dialog

end tell


if proxy_interface is "打开代理" then
    # 进行代理的设置 xxx.xxx.xxx.xxx 代理地址,xxxx代理端口
    do shell script "networksetup -setwebproxy 'Wi-Fi' xxx.xxx.xxx.xxx xxxx && networksetup -setsecurewebproxy 'Wi-Fi' xxx.xxx.xxx.xxx xxxx && networksetup -setwebproxystate 'Wi-Fi' on&&networksetup -setsecurewebproxystate 'Wi-Fi' on"

end if


if proxy_interface is "关闭代理" then

    do shell script "networksetup -setwebproxystate 'Wi-Fi' off&&networksetup -setsecurewebproxystate 'Wi-Fi' off"

end if

选择存储为应用程序,运行之后如下,可以快速打开或者关闭代理,基本可以达到目的。

请添加图片描述

主要参考:MAC OS X 下快速切换代理_iteye_7514的博客-CSDN博客

v2.0

虽然1.0已经基本可以达到目的了,但是出于进一步简化的目的,又找了一些资料,写了一个新的脚本。

这次用shell脚本,源码如下

#! /bin/sh
# 获取当前wifi
SSID=$(/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -I  | awk -F' SSID: '  '/ SSID: / {print $2}')

if [ $SSID = 'xxx' ]
then

    networksetup -setwebproxy 'Wi-Fi' xxx.xxx.xxx.xxx xxxx&&networksetup -setsecurewebproxy 'Wi-Fi' xxx.xxx.xxx.xxx xxxx&&networksetup -setwebproxystate 'Wi-Fi' on&&networksetup -setsecurewebproxystate 'Wi-Fi' on

else

        networksetup -setwebproxystate 'Wi-Fi' off&&networksetup -setsecurewebproxystate 'Wi-Fi' off

fi

然后还是采用脚本编辑器, do shell script "/bin/sh xxx/xxx/xxx.sh" 保存为应用程序,运行之后,可以自动判断当前Wi-Fi,进行代理的设置和关闭。比1.0少了在界面选择的过程,我觉得和1.0可以结合来用。

主要参考:Mac 自动设置终端代理IP - 莫名博客

v2.1

上面的shell脚本也可以用mac的「自动操作」应用程序,运行shell脚本,保存应用程序来执行

请添加图片描述

v3.0

为了进一步简化这个过程,最好都不用我去点击运行,在切换后能够自己完成代理的设置,我又找了一些macOS 关于定时任务或者触发任务的内容,最终实现了目的。

在MAC下,我们一般用launchd实现定时任务,以及其他事件触发的任务。

简单介绍下launchd,launchd存在于MAC OX的系统进程中,用户不能直接对该进程进行操作,只能通过launchctl对其进行管理。

launchctl是一个统一的服务管理框架,可以启动、停止和管理守护进程、应用程序、进程和脚本等。launchctl是通过配置文件来指定执行周期和任务的。配置文件一般是plist类型的文件。

属性列表(Property List)文件是一种用来存储序列化后的对象的文件。属性列表文件的文件扩展名为.plist,因此通常被称为plist文件。Plist文件通常用于存储用户设置,也可以用于存储捆绑的信息,plist中主要的字段和它的含义如下:

  • Label用来在launchd中的一个唯一标识,如同每一个程序都有一个identifies一样。

  • UserName指定运行启动项的用户,只有当Launchd 作为 root 用户运行时,此项才适用。

  • GroupName指定运行启动项的组,只有当Launchd 作为 root 用户运行时,此项才适用。

  • KeepAlive这个key值是用来控制可执行文件是持续运行,还是满足具体条件之后再启动。默认值为false,也就是满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。

  • RunAtLoad标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。

  • Program这个值用来指定进程的可执行文件路径。

  • ProgramArguments这个值用来指定可执行文件和运行的参数。

plist脚本一般存放在以下目录:

  • /Library/LaunchDaemons -->只要系统启动了,哪怕用户不登陆系统也会被执行

  • /Library/LaunchAgents -->当用户登陆系统后才会被执行

  • ~/Library/LaunchAgents --> 由用户自己定义的任务项

  • System/Library/LaunchAgents -->由Mac OS X为用户定义的任务项

  • /System/Library/LaunchDaemons -->由Mac OS X定义的守护进程任务项

切换代理实现步骤:

~/Library/LaunchAgents 文件夹下新建xxx.plist文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <!-- Label唯一的标识 -->
  <key>Label</key>
  <string>com.onnetworkchange</string>
  <!-- 指定要运行的脚本 -->
  <key>ProgramArguments</key>
  <array>
    <!-- v2.0中的shell脚本-->
    <string>/xxx/xxx/xxx.sh</string>
  </array>
  <!-- 标准输出文件 -->
  <key>StandardOutPath</key>
  <string>/xxx/xxx/xxx.log</string>
  <!-- 标准错误输出文件,错误日志 -->
  <key>StandardErrorPath</key>
  <string>/xxx/xxx/xxx.err</string>
  <!-- 监控文件变化,触发脚本 -->
  <key>WatchPaths</key>
  <array>
    <!-- 没找到wifi属性的文件,但是这个文件在切换wifi时也会被重置,所以用这个也可以-->
    <string>/Library/Preferences/SystemConfiguration/com.apple.wifi.message-tracer.plist</string>
  </array>
</dict>
</plist>

运行命令 launchctl load -w xxx.plist 加载plist文件。

其他命令:

#查看 launchctl使用手册, man在对mac下大部分命令通用,例如 man ifconfig
$ man launchctl

# 加载任务, -w选项会将plist文件中无效的key覆盖掉,建议加上

$ launchctl load -w zrbdemo.plist

# 删除任务

$ launchctl unload -w zrbdemo.plist

# 查看任务列表

$ launchctl list

# 开始任务

$ launchctl start zrbdemo.plist

# 结束任务

$ launchctl stop zrbdemo.plist

最终可以达到切换wifi,识别当前wifi,并进行代理设置的功能,达到了目的

主要参考:MAC下定时任务设置与网络事件监听并执行相应脚本_瓜而不皮的博客-CSDN博客_launchd 定时任务

回头来看,还挺简单的,但是奈何自己水平有限,中间还是费了些功夫的,如果有什么改进,请指出哈

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值