该渲染由 marked 生成,可能存在排版问题,最佳体验请前往:https://xxu.do/posts/geek/PAC
有一个事情困扰了我很久:
我是一个深度的 macOS 用户,得易于 macOS 上优良的软件,例如 surge for mac,我能够很轻易的解决几乎所有网络问题。
但这个事情在 Windows 和 Linux 上就显得比较复杂,但使用 Windows 或 Linux 依然是必要的。
我不希望给每个系统都部署上一个软件,都写上一份配置文件。
因此,最好的做法就是将 surge for mac 作为代理服务器,对其他设备的网络进行接管。
我身处学校大内网,无法将 mac 的 ip 设置为静态,因此我需要不断更新 mac 的 ip 地址以维系这个方案。
在 ChatGPT 的帮助下,写了一段脚本,自动将获取 mac 的 ip 地址并生成 PAC(Proxy Auto-Config) 配置文件,上传到我的网盘中,其他设备只需填写好配置文件的地址即可。
将下面这段代码保存为 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
设置一个定时任务:
crontab -e
然后将这行添加到结尾(每小时的半点运行一次,您可以根据自己的需要来填写):
30 * * * * /Users/jayden/proxy_pac/generate_pac.sh