如何在命令行中打开和关闭OS X的Web代理

38
在OS X中,您可以通过从“系统偏好设置”>“网络”>“代理服务器”中选中“Web代理(HTTP)”并指定Web代理服务器等,然后单击“确定”,再单击“应用程序”来打开或关闭Web代理。这个过程步骤太多了。是否有一种方法可以通过命令行和shell脚本完成所有操作?
7个回答

44

对于未经身份验证的代理(并且假设您要配置以太网服务):

networksetup -setwebproxy Ethernet proxy.example.net 80 off

对于已认证用户:

networksetup -setwebproxy Ethernet proxy.example.net 80 on proxyuser "p4ssw0rd"

并将其关闭:

networksetup -setwebproxystate Ethernet off

如果网络服务名称不是"Ethernet",你可能需要解析networksetup -listallnetworkservices-listnetworkserviceorder来获取正确的名称。


第一条命令不应该以“off”而不是“on”结尾吗? - unpossible
1
@mejpark "off"和"on"关键字指的是身份验证,而不是代理设置本身是否开启或关闭。 - Gordon Davisson
@AkinHwan 可能有一种使用 scutil 的方法,但这很可能会很混乱。为什么不想使用 networksetup - Gordon Davisson
@GordonDavisson 在我没有管理员权限的情况下,因为它会提示我输入用户名和密码。 - Akin Hwan
@AkinHwan 更改网络设置(包括代理配置)本质上需要管理员权限。您可能能够在特定应用程序(浏览器等)中覆盖网络设置,但这取决于应用程序。 - Gordon Davisson

13

为在OSX Mavericks中仅切换我的代理,我设置了这个脚本。请注意,此示例仅影响我的Wi-Fi适配器。我是同时切换Web、流媒体和SOCKS代理的开/关。你可以像Gordon的例子那样设置代理地址,但我已经通过系统偏好设置 > 网络 > 代理GUI将其保存。

BASH脚本,保存为prox.sh:

#!/bin/bash

e=$(networksetup -getwebproxy wi-fi | grep "No")

if [ -n "$e" ]; then
  echo "Turning on proxy"
  sudo networksetup -setstreamingproxystate wi-fi on
  sudo networksetup -setsocksfirewallproxystate wi-fi on
  sudo networksetup -setwebproxystate wi-fi on
else
  echo "Turning off proxy"
  sudo networksetup -setstreamingproxystate wi-fi off
  sudo networksetup -setsocksfirewallproxystate wi-fi off
  sudo networksetup -setwebproxystate wi-fi off
fi

然后在命令行上创建脚本的符号链接:

ln -s /Script/Location/prox.sh prox-toggle

现在您可以在命令行上切换代理开/关:

bash prox-toggle

@potato-eat-apple写道:Eric,感谢你的脚本,我有一个问题:它总是让我弹出输入我的机器密码。如何避免这种情况发生? - Filnor
我测试过了,它完美无缺地运行。谢谢! - nicbou

4

我准备了一个名为 proxy 的脚本,可以帮助你。

#!/bin/bash
#
#
#   Author: Md. Sazzad Hissain Khan
#   Date:   8 July, 2017
#
#

NETWORK_SERVICE_NAME="Ethernet"

if [ "$#" -ne 1 ]; then
    echo "Argument missing [on/off]"
    exit 0
fi

if [ $1 == "on" ]; then
    echo "Enabling secure proxy for $NETWORK_SERVICE_NAME"
    networksetup -setsecurewebproxystate "$NETWORK_SERVICE_NAME" on
elif [ $1 == "off" ]; then
    echo "Disabling secure proxy for $NETWORK_SERVICE_NAME"
    networksetup -setsecurewebproxystate "$NETWORK_SERVICE_NAME" off
else
    echo "Argument invalid [permitted:on/off]"
fi

NETWORK_SERVICE_NAME 是您需要配置的活动网络的名称。

  1. /usr/local/bin 目录下创建 proxy 文件。
  2. 将上述脚本复制到 proxy 文件中。
  3. 使用 sudo chmod 777 proxy 为该文件设置可执行权限。

如何使用:

proxy on
proxy off

1
太棒了。我已经添加了networksetup -setwebproxystate "$NETWORK_SERVICE_NAME"用于HTTP代理 :) - Qadir Hussain

3
只需切换开关 :)
networksetup -setwebproxystate <networkservice> <on off>
networksetup -setsecurewebproxystate <networkservice> <on off>

示例:

networksetup -setwebproxystate  Wi-Fi on
networksetup -setsecurewebproxystate  Wi-Fi on

为了处理修改警报:在前缀sudo中使用
sudo networksetup -setwebproxystate  Wi-Fi on
sudo networksetup -setsecurewebproxystate  Wi-Fi on

2

2

使用快捷键启用和禁用代理

在终端中,您可以使用以下命令打开或关闭wifi代理

networksetup -setwebproxystate Wi-Fi <on | off>
networksetup -setsecurewebproxystate Wi-Fi <on | off>

最初的回答:并且以太网
networksetup -setwebproxystate Ethernet <on | off>
networksetup -setsecurewebproxystate Ethernet <on | off>

这是一个可以在开启和关闭之间切换的一行代码(以Wi-Fi为例)。最初的回答:
e=$(networksetup -getwebproxy wi-fi | grep "No")

if [ -n "$e" ]; then
  networksetup -setwebproxystate  Wi-Fi on
  networksetup -setsecurewebproxystate  Wi-Fi on
else
  networksetup -setwebproxystate  Wi-Fi off
  networksetup -setsecurewebproxystate  Wi-Fi off
fi

创建一个运行shell命令的键盘快捷方式
1. 打开Automator,创建一个新服务。 2. 在“任何应用程序”中将“服务接收所选项”设置为“无输入”。 3. 添加一个名为“Run Shell Script”的操作。它在“动作库”的“实用程序”部分中。 4. 将您想要的bash命令插入文本框,并使用“运行”按钮(右上角)进行测试运行。它应该执行脚本所做的任何操作(关闭、打开或切换),并且操作下方应该有绿色的勾号。 5. 保存它,给它一个你能记住的服务名称。 6. 转到“系统偏好设置”->“键盘”,并转到“快捷键”选项卡。 7. 转到“服务”部分,向下滚动到“常规” - 您应该在那里找到您的服务。如果选择该行,则可以单击“添加快捷方式”并为其分配一个键盘快捷方式。

0

由于我需要一个简单的脚本,可以同时切换HTTP和HTTPS代理开/关状态,因此在这里提供:

#!/usr/bin/env bash
# Toggles *both* HTTP and HTTP proxy for a preconfigured service name ("Wi-Fi" or "Ethernet").

NETWORK_SERVICE_NAME="Wi-Fi" # Wi-Fi | Ethernet

IS_PROXY_ENABLED=$(networksetup -getwebproxy "$NETWORK_SERVICE_NAME" | head -n 1 | grep Yes)

if [ -z "$IS_PROXY_ENABLED" ]; then
    echo "Enabling HTTP and HTTPs proxy for $NETWORK_SERVICE_NAME"
    networksetup -setstreamingproxystate "$NETWORK_SERVICE_NAME" on
    networksetup -setwebproxystate "$NETWORK_SERVICE_NAME" on
    networksetup -setsecurewebproxystate "$NETWORK_SERVICE_NAME" on
else
    echo "Disabling HTTP and HTTPs proxy for $NETWORK_SERVICE_NAME"
    networksetup -setstreamingproxystate "$NETWORK_SERVICE_NAME" off
    networksetup -setwebproxystate "$NETWORK_SERVICE_NAME" off
    networksetup -setsecurewebproxystate "$NETWORK_SERVICE_NAME" off
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接