Mac 自动代理切换
背景:
工作有时需要用goole搜索,所以会配置一下公司提供的HTTP和HTTPS代理,但是下班之后回到家,只有公司内网才能访问代理,所以还需要把代理关掉。每次都要点呀点,有点麻烦,所以打算弄个脚本来简化这个过程
![请添加图片描述](https://img-blog.csdnimg.cn/13b7063939554c0bbb8b5ed2dbec51a7.png)
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
选择存储为应用程序,运行之后如下,可以快速打开或者关闭代理,基本可以达到目的。
![请添加图片描述](https://img-blog.csdnimg.cn/aa393abe2d4f4776b24e10bb004c64fb.png)
主要参考:MAC OS X 下快速切换代理_iteye_7514的博客-CSDN博客
v2.0
虽然1.0已经基本可以达到目的了,但是出于进一步简化的目的,又找了一些资料,写了一个新的脚本。
这次用shell脚本,源码如下
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脚本,保存应用程序来执行
![请添加图片描述](https://img-blog.csdnimg.cn/ac494d8b39e540ada8f2d419adc0db04.png)
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>
<key>Label</key>
<string>com.onnetworkchange</string>
<key>ProgramArguments</key>
<array>
<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>
<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
$ 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 定时任务
回头来看,还挺简单的,但是奈何自己水平有限,中间还是费了些功夫的,如果有什么改进,请指出哈
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)