在Mac OSX上如何编程更改代理设置

3
如何在Mac OSX上以编程方式更改代理设置。我熟悉iOS,由于Mac OS编程类似,因此不应该有太多问题。但是,我缺乏创建代理更改的逻辑。手动调整非常容易。我需要的是“系统偏好设置”中的网络选项卡:

enter image description here

我尝试过的内容:
let dynamicStore: SCDynamicStoreRef = SCDynamicStoreCreate(nil, "setProxy" as CFString, nil, nil)!
let updated = SCDynamicStoreSetValue(dynamicStore, "HTTPProxy" as CFStringRef, "111.222.333.1") // updated is false, indicating unsuccessful operation 

我也尝试了这个,但返回的字典是只读的。

let dynamicStore: SCDynamicStoreRef = SCDynamicStoreCreate(nil, "myFunc" as 

    CFString, nil, nil)!

    let proxyDict = SCDynamicStoreCopyProxies(dynamicStore)

    if let proxyDict = SCDynamicStoreCopyProxies(dynamicStore) as NSDictionary? {
        if let port = proxyDict["HTTPPort"] as? Int {
            print("HTTPPort:", port)
            proxyDict["HTTPPort"] = 8088; // can't do that
        }
    }

我已经没有更多的想法了。

2个回答

11

这个答案中,这是一个示例脚本:

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

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

它可以为用户的Wi-Fi连接开启/关闭SOCKS代理。

您可以使用此想法根据自己的需求制作脚本。您可以在bash脚本或Cocoa中实现所需的逻辑。

  • 使用networksetup -listallnetworkservices列出所有连接。
  • 使用networksetup -setwebproxy为特定连接设置代理。

例如,这是我的终端输出:

$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
MBBEthernet
Wi-Fi
Wi-Fi Modem Yota 4G LTE
Bluetooth PAN
Thunderbolt Bridge
iPhone

$ networksetup -setwebproxy some bad args
** Error: The parameters were not valid.

$ networksetup -setwebproxy Wi-Fi 1.2.3.4 8080

上一个命令的输出为空,这意味着成功。
另请参阅man networksetup如何从Cocoa应用程序执行Shell命令
以上命令在Terminal应用程序中执行时需要授权。很抱歉我不确定您是否可以将其“原样”保留(只需启动您的NSTask,OS X会完成其余工作),还是需要通过SFAuthorization获取适当的凭据才能这样做。

0

CFDictionaryCreateMutableCopy可以解决问题,但即使您成功更改了字典,SCDynamicStoreSetMultiple仍然没有效果。


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