xChar
·6 months ago

有一个事情困扰了我很久:

  • 我是一个深度的 macOS 用户,得易于 macOS 上优良的软件,例如 surge for mac,我能够很轻易的解决几乎所有网络问题。

  • 但这个事情在 Windows 和 Linux 上就显得比较复杂,但使用 Windows 或 Linux 依然是必要的。

  • 我不希望给每个系统都部署上一个软件,都写上一份配置文件。

因此,最好的做法就是将 surge for mac 作为代理服务器,对其他设备的网络进行接管。

我身处学校大内网,无法将 mac 的 ip 设置为静态,因此我需要不断更新 mac 的 ip 地址以维系这个方案。

在 ChatGPT 的帮助下,写了一段脚本,自动将获取 mac 的 ip 地址并生成 PAC(Proxy Auto-Config) 配置文件,上传到我的网盘中,其他设备只需填写好配置文件的地址即可。


  1. 将下面这段代码保存为 generate_pac.sh,这个脚本会在同一目录下生成 proxy.pac 文件,并利用 alist 的 webdav 特性上传至云盘当中。

    #!/bin/zsh
    
    cd /Users/jayden/proxy_pac
    # 保证环境变量的一致以成功获取到 ip 地址。
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    
    rm -f proxy.pac
    
    # Get the local IP address from interface en0 (commonly used for Wi-Fi)
    LOCAL_IP=$(ipconfig getifaddr en0)
    
    # Proxy ports
    HTTP_PROXY_PORT=6152
    SOCKS_PROXY_PORT=6153
    
    # PAC file path
    PAC_FILE="proxy.pac"
    
    # Generate the PAC file
    cat <<EOL > $PAC_FILE
    function FindProxyForURL(url, host) {
        var http_proxy = "PROXY $LOCAL_IP:$HTTP_PROXY_PORT";
        var socks_proxy = "SOCKS5 $LOCAL_IP:$SOCKS_PROXY_PORT";
    
        // Add your proxy rules here
        if (shExpMatch(host, "*.example.com")) {
            return "DIRECT"; // Direct connection
        }
    
        // Default to using HTTP proxy
        return http_proxy + "; " + socks_proxy;
    }
    EOL
    
    echo "PAC file generated at $PAC_FILE" >> proxy_pac.log
    
    # Upload the PAC file to Alist via WebDAV
    curl -X DELETE https://pan.xxu.do/dav/path/to/proxy.pac -u username:password
    curl -T $PAC_FILE https://pan.xxu.do/dav/path/to/proxy.pac -u username:password
    
    echo "PAC file generated and uploaded to Alist" >> proxy_pac.log
    
    date >> proxy_pac.log
    
  2. 设置一个定时任务:

    crontab -e
    

    然后将这行添加到结尾(每小时的半点运行一次,您可以根据自己的需要来填写):

    30 * * * * /Users/jayden/proxy_pac/generate_pac.sh
    

此文由 Mix Space 同步更新至 xLog
原始链接为 https://xxu.do/posts/geek/PAC


Loading comments...