【问题标题】:change proxy on mac osx programmatically以编程方式更改mac osx上的代理
【发布时间】:2016-07-07 17:43:23
【问题描述】:

如何以编程方式更改 mac osx 上的代理设置。我精通ios,并且由于mac os编程相似,因此应该不会有太大问题。但是,我缺乏以编程方式创建代理更改所需的逻辑。手动调整非常容易。这是我在系统偏好设置中的网络选项卡:

我尝试过的:

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
        }
    }

我的想法不多了。

【问题讨论】:

    标签: macos cocoa proxy ip-address


    【解决方案1】:

    来自this answer,这是一个示例脚本:

    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
    

    最后一条命令给了空的stdout,表示成功。

    另见man networksetup

    How to execute a shell command from a Cocoa app.

    从终端应用程序执行的上述命令要求授权。很抱歉,我不确定您是否可以“按原样”保留它(只需启动您的 NSTask,其余的将由 OS X 完成),或者您需要先通过 SFAuthorization 获取正确的凭据。

    【讨论】:

      【解决方案2】:

      CFDictionaryCreateMutableCopy 可以解决问题,但即使您成功更改了字典,SCDynamicStoreSetMultiple 也不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 2012-04-05
        相关资源
        最近更新 更多