我们在MACOSX中设置Web代理时,通常的做法是在控制面板中进行操作,系统偏好设置 -> 网络 -> 高级 -> 代理

这种配置方式的缺点就是操作比较繁琐,特别是在需要频繁切换的情况下,效率极其低下,越用越烦。

基于该痛点,我们希望能避免重复操作,实现快速切换配置。

在终端Termina中实现网络代理配置

要避免在GUI进行重复的配置操作,比较好的简化方式是在Terminal中通过命令实现同样的功能。事实上,在MACOS系统中的确是存在配置网络代理的命令,该命令即是networksetup。

获取系统已有的网络服务

首先需要明确的是,MACOS系统中针对不同网络服务(networkservice)的配置是独立的,因此在配置Web代理时需要进行指定。

而要获取系统中存在哪些网络服务,可以通过如下命令查看:

$ networksetup -listallnetworkservices

An asterisk (*) denotes that a network service is disabled.
Wi-Fi
iPhone USB
Bluetooth PAN
Thunderbolt Bridge

如果计算机是通过Wi-Fi上网的,那么我们设置网络代理时就需要对Wi-Fi进行设置。

开启Web代理

通过networksetup命令对HTTP接口设置代理时,可以采用如下命令:
$ sudo networksetup -setwebproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
# e.g. sudo networksetup -setwebproxy "Wi-Fi" 127.0.0.1 8080

执行该命令时,会开启系统的Web HTTP Proxy,并将Proxy设置为127.0.0.1:8080。

如果是对HTTPS接口设置代理时,命令为:

$ networksetup -setsecurewebproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
# e.g. sudo networksetup -setsecurewebproxy "Wi-Fi" 127.0.0.1 8080

关闭Web代理

对应地,关闭HTTP和HTTPS代理的命令为:

$ sudo networksetup -setwebproxystate <networkservice> <on off>
# e.g. sudo networksetup -setwebproxystate "Wi-Fi" off
$ networksetup -setsecurewebproxystate <networkservice> <on off>
# e.g. sudo networksetup -setsecurewebproxystate "Wi-Fi" off

利用Mac自带的AppleScript实现一键配置

现在我们已经知道如何通过networksetup命令在Terminal中进行Web代理切换了,但如果每次都要重新输入命令和密码,还是会很麻烦,并没有真正地解决我们的痛点。

而且在实际场景中,我们通常需要同时开启或关闭HTTP、HTTPS两种协议的网络代理,这类操作如此高频,要是还能通过点击一个按钮就实现切换,那就优雅多了。

幸运的是,这种优雅的方式还真能实现,利用AppleScript切换的思路(我使用的是GoAgent,代理地址是127.0.0.1:8087,可以根据实际情况作相应更改。),建立 AppleScript 然后导出为应用程序放到 Dock 上就很方便启动 GoAgent 同时切换代理。

启动后出现如下窗口,选 ON 运行 GoAgent 并设代理地址为 127.0.0.1:8087,选 OFF 关闭终端取消代理,选 Cancel 不作相应。
代码中***为用户名及用户密码。
tell application "Finder"
set dialog to display dialog "GoAgent switch. Please select:" buttons {"ON", "OFF", "Cancel"} default button "ON" with title "GoAgent"
set interface to button returned of dialog
end tell

if interface is "Cancel" then
return
end if

if interface is "ON" then
tell application "Terminal"
do script "Python goagent/local/proxy.py"
end tell

do shell script "networksetup -setwebproxy Wi-Fi 127.0.0.1 8087" user name "***" password "***" with administrator privileges
do shell script "networksetup -setsecurewebproxy Wi-Fi 127.0.0.1 8087" user name "***" password "***" with administrator privileges
do shell script "networksetup -setwebproxystate Wi-Fi on" user name "***" password "***" with administrator privileges
do shell script "networksetup -setsecurewebproxystate Wi-Fi on" user name "***" password "***" with administrator privileges
end if
if interface is "OFF" then
tell application "Terminal"
do script "killall Terminal"
end tell
do shell script "networksetup -setwebproxystate Wi-Fi off" user name "***" password "***" with administrator privileges
do shell script "networksetup -setsecurewebproxystate Wi-Fi off" user name "***" password "***" with administrator privileges
end if