V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
akring
V2EX  ›  MacBook Pro

Mac 上如何自如的切换网络代理?

  •  
  •   akring · 2015-09-02 10:02:10 +08:00 · 19166 次点击
    这是一个创建于 3369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为公司的扯淡网络,想访问外网就必须设置 http 和 https 代理,每次都需要到“设置-网络-高级-代理”中设置,而如果回家用过 ShdowSocks 之后所有代理都会被清空,同时第二天还得自己重新设置并开启代理,非常麻烦,想问下有没有什么方便快捷的方式切换 Mac 下的代理(HTTP 和 HPPTS )呢?

    40 条回复    2023-12-14 15:16:31 +08:00
    XerWandeRer
        1
    XerWandeRer  
       2015-09-02 10:04:45 +08:00 via Android
    AppleScript or Shell Script. 配合 Keyboard Maestro 或者 Alfred 。我就是这么做的。
    boywang004
        2
    boywang004  
       2015-09-02 10:06:04 +08:00
    Network 里面有一个 Location ,添加之后,可以专门干这个事情,切换只要从左上角苹果 Apple Icon 就能搞定。缺点是切换时会断网。
    loveis0
        3
    loveis0  
       2015-09-02 10:09:09 +08:00
    直接在公司开着 SS 不行吗?
    crayhuang
        4
    crayhuang  
       2015-09-02 10:10:58 +08:00
    我是切换浏览器, 2333 ,公司用 Chrome ,家里用 Safari
    sakeven
        5
    sakeven  
       2015-09-02 10:25:42 +08:00
    mac 可以设置位置。。然后切换位置就可以了。
    akring
        6
    akring  
    OP
       2015-09-02 10:33:47 +08:00
    @loveis0 小白不太懂, SS 可以设置 http 代理吗?
    loveis0
        7
    loveis0  
       2015-09-02 10:37:24 +08:00
    @akring 我挂着 SS 都是自动走 HTTPS 代理的
    akring
        8
    akring  
    OP
       2015-09-02 10:41:03 +08:00
    @loveis0 哦,这样啊,我现在 http 代理是公司提供的一个地址+端口,然后 ss 用的是购买的账号,这两者可以同时开启吗?
    williamx
        9
    williamx  
       2015-09-02 10:42:27 +08:00
    location !
    loveis0
        10
    loveis0  
       2015-09-02 10:46:27 +08:00
    @akring 试试不就知道了吗?
    honeycomb
        11
    honeycomb  
       2015-09-02 10:54:34 +08:00
    @akring
    可能不行

    公司提供的 HTTP/HTTPS proxy 无法承载 ss 协议的数据
    而 ss 在里,公司 proxy 在外,所以更不能用 ss 承载公司 proxy 包装过的数据

    还有一种可能性,公司的防火墙没有关掉 ss 协议(无论是端口,还是深度包检测)
    这种情况相当于绕过了"想访问外网就必须设置 http 和 https 代理"的策略
    akring
        12
    akring  
    OP
       2015-09-02 11:30:02 +08:00
    @honeycomb 好的,非常感谢大家的帮助!
    IgniteWhite
        13
    IgniteWhite  
       2015-09-02 11:44:40 +08:00   ❤️ 1
    我看了楼主上面追问的问题,主要是不会使用 location 。公司和家里分别设置 location ,比如我在大学里面寝室内网、寝室外网、图书馆代理和自习室 wifi 就要设置 4 个 location 。

    图书馆代理的时候,我就不开 SS ,因为 SS 会加载自动的 profile 。我在寝室外网、自习室 wifi 这两个 location 使用 SS 。澄清一下你的说法,你在公司使用代理是 HTTP 或者 HTTPS 的话,使用 SS 之后并不会清空你的代理。你使用的是自动代理配置文件的话,才会“清空”你的代理,因为 SS 使用自己的 profile 了嘛。比如我们图书馆代理就提供自动配置文件和用户名密码( HTTP/HTTPS )两种,你不用自动配置文件就好了, SS 改过去之后进设置选项卡里面勾回 Web Proxy 就好了。

    楼主又问“我现在 http 代理是公司提供的一个地址+端口,然后 ss 用的是购买的账号,这两者可以同时开启吗?”这个应该是不行的。你们公司代理可以过 SS 协议的话,为何不直接翻墙?一般来说除了少数搞外贸的公司之外,是不会允许翻墙协议的。阿里巴巴也得用“服上面管教”而且处于“外贸目的”的阿里云不是?

    我具体控制使用 Alfred ,我用的是一个控制 GoAgentX 的 workflow ,开关 SS 。
    输入 goa r ,开 SS ;输入 goa c ,关 SS 。

    切换 network location 也有专门的 workflow 。
    输入 nl ,切换 network location 。

    牛人可以自己捣鼓一下 AppleScript 或者 Shell ,类 Unix 系统都是一个思路啊。
    cattyhouse
        14
    cattyhouse  
       2015-09-02 11:59:02 +08:00 via iPhone
    networksetup 命令。
    FrankFang128
        15
    FrankFang128  
       2015-09-02 12:00:55 +08:00 via Android
    只用 Chrome 插件。
    paradoxs
        16
    paradoxs  
       2015-09-02 12:03:36 +08:00
    有木有人知道 SS 之后会在哪里更新
    jeffma
        17
    jeffma  
       2015-09-02 12:08:15 +08:00   ❤️ 3
    IgniteWhite
        18
    IgniteWhite  
       2015-09-02 12:10:11 +08:00
    @jeffma 楼主,牛人在此!
    cattyhouse
        19
    cattyhouse  
       2015-09-02 12:14:29 +08:00 via iPhone   ❤️ 1
    给楼主一个思路, bash 脚本:

    If 检测到公司的网络; then
    stop shadowsocks
    networksetup -set 清空所有代理
    networksetup -set 公司 http 代理
    else
    networksetup -set 清空所有代理
    start shadowsocks
    fi
    至于“检测到公司网络” 这个怎么判断?如果你连的 Wi-Fi ,可以通过 ssid 判断。实在不行可以用公司网络的 ip 地址段判断,具体就是 netstat -nr |grep 公司网关地址。

    其余的请 man networksetup

    以后只需要在终端敲一次这个命令,就全自动化了。

    另外如果你完全不想敲,还可以用 launchd 来监控网络变化执行这个脚本。

    要是有你的一些基本信息,比如公司 Wi-Fi 的名字,比如公司获取的内网 ip 段,我可以把这个给你完善下。
    cattyhouse
        20
    cattyhouse  
       2015-09-02 12:17:24 +08:00 via iPhone
    接上,我有个项目是实现 chnroute 全自动加载,虽然跟你这个无关,但是其中“监控网络变化来执行命令”可以用在你的这个需求上:

    https://github.com/cattyhouse/chnroute-automation-mac
    jsfaint
        21
    jsfaint  
       2015-09-02 12:38:05 +08:00
    zander
        22
    zander  
       2015-09-02 12:51:40 +08:00
    location
    OscarUsingChen
        23
    OscarUsingChen  
       2015-09-02 14:00:11 +08:00
    有个软件, ControlPlane ,能根据条件判断,自动设置情景。针对不同的情景,能修改系统位置,执行脚本,运行程序。基本能够解决楼主问题。
    cattyhouse
        24
    cattyhouse  
       2015-09-02 14:00:18 +08:00
    @jeffma 你这个真心搞复杂了,不需要用 location 的,你的只有两种情况 1 , 在公司 2 ,在其他地方。可以通过判断 ssid 来修改代理参数,比如你的公司的 Wi-Fi ssid 为 “ office ”,可以用下面的 shell 来做:

    if [ "$(networksetup -getairportnetwork en0 | awk '{print $4}')" = "office" ]; then #在公司
    # 先关闭 Wi-Fi 的所有代理设置
    networksetup -setwebproxystate Wi-Fi off
    networksetup -setsocksfirewallproxystate Wi-Fi off
    networksetup -setautoproxystate Wi-Fi off

    #打开代理的 autoproxy ,设置为公司的 pac
    networksetup -setautoproxystate Wi-Fi on
    networksetup -setautoproxyurl Wi-Fi http://公司 pac 地址

    else # 不在公司
    # 先关闭 Wi-Fi 的所有代理设置
    networksetup -setwebproxystate Wi-Fi off
    networksetup -setsocksfirewallproxystate Wi-Fi off
    networksetup -setautoproxystate Wi-Fi off

    #打开代理的 autoproxy ,设置为电脑本地的 pac
    networksetup -setautoproxystate Wi-Fi on
    networksetup -setautoproxyurl Wi-Fi http://你本地的 pac 地址

    fi

    就搞定了,效果一样, shadowsocks app 不需要动它,让它一直在后台运行。
    cattyhouse
        25
    cattyhouse  
       2015-09-02 14:14:12 +08:00
    获取 ssid 这样似乎更准确 ( awk 语法变化一下)

    networksetup -getairportnetwork en0 | awk -F": " '{print $2}'
    jeffma
        26
    jeffma  
       2015-09-02 15:22:22 +08:00
    @cattyhouse 感谢,回去按照这个思路改进下
    ptyfork
        27
    ptyfork  
       2015-09-02 17:51:56 +08:00
    mac 下代理相关的设置居然不是和 ios 一样跟 ssid 相关的, 不知道咋想的。
    cattyhouse
        28
    cattyhouse  
       2015-09-02 18:07:55 +08:00
    @ptyfork 其实各有利弊, SSID 跟 Proxy 设置区分开来还是很方便的。
    megabits
        29
    megabits  
       2015-09-02 19:01:02 +08:00
    @XerWandeRer 我也是+ 1
    scola
        30
    scola  
       2015-09-02 20:45:05 +08:00 via Android
    foxproxy
    paicha
        31
    paicha  
       2015-09-02 21:18:05 +08:00
    我是直接改 shadowsocks 的 pac 脚本
    hzlzh
        32
    hzlzh  
       2015-09-02 22:12:50 +08:00
    Hodor
        33
    Hodor  
       2015-09-03 02:30:17 +08:00
    Location
    ichou
        34
    ichou  
       2015-09-03 15:49:27 +08:00
    Alfred + AppleScript
    longquanwo
        35
    longquanwo  
       2015-09-03 23:33:51 +08:00 via iPhone
    弄那么复杂干嘛。一个软件全搞定: shimo
    Layne
        36
    Layne  
       2015-09-04 00:11:36 +08:00
    我在 GitHub 上找到了一个小工具,可以根据 WiFi 的名称切换到对应的 Location ,然后自己给不同的 Location 设置不同的代理方式。
    https://github.com/rimar/wifi-location-changer
    leohxj
        37
    leohxj  
       2015-09-06 10:37:46 +08:00
    proxifier
    zhuziyi
        38
    zhuziyi  
       2016-05-07 11:36:46 +08:00
    https://github.com/zvving/Alfred-Workflows/blob/master/README.md

    困扰很久之后,我的最终解决方案,希望有帮助~
    dawnc
        39
    dawnc  
       2016-12-01 23:30:35 +08:00
    我感觉你们都复杂了。
    Automator 里,新建个 APP ,使用 AppleScript :

    tell application "Finder"
    set dialog to display dialog "切换代理. 请选择:" buttons {"Home", "Office", "Cancel"} default button "Home" with title "切换代理"
    set interface to button returned of dialog
    end tell

    if interface is "Cancel" then
    return
    end if

    if interface is "Home" then
    do shell script "sudo -S networksetup -setsocksfirewallproxystate Wi-Fi on"
    do shell script "echo '1234'|sudo -S networksetup -setsocksfirewallproxy Wi-Fi 127.0.0.1 7070"
    end if

    if interface is "Office" then
    do shell script "sudo -S networksetup -setsocksfirewallproxystate Wi-Fi on"
    do shell script "sudo -S networksetup -setsocksfirewallproxy Wi-Fi 10.10.10.10 7070"
    end if
    zhuziyi
        40
    zhuziyi  
       344 天前
    @zhuziyi #32 😆😆😆 7 年后我又搜到这个答案,发现自己还回答过....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2790 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:54 · PVG 21:54 · LAX 05:54 · JFK 08:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.