问题
Surge作为现在苹果平台最强大好用的网络工具,在配置文件管理上还有一定的优化空间。个人这几年使用,感觉最大的问题就是不支持将代理服务器列表与规则配置分离,这样像共享自己的或者使用他人的配置就很不方便,并且如果Mac/iOS不共用一份规则配置的话也很麻烦。
在开发者刘亚晨给出解决方案之前,先自己用脚本简单的做下合并吧。
简单粗暴的workaround
准备工作
- 代理服务器配置文件
proxy.conf
用来存储自己的服务器信息,格式:
1
2
3
4
5
6
7
| [Proxy]
🇭🇰HK = custom,hk.freeworld.com,1234,chacha20-ietf-poly1305,pASSWORD,https://freeworld.io/SSEncrypt.module
🇯🇵JP = custom,jp.freeworld.com,1234,chacha20-ietf-poly1305,pASSWORD,https://freeworld.io/SSEncrypt.module
🇺🇸US = custom,us.freeworld.com,1234,chacha20-ietf-poly1305,pASSWORD,https://freeworld.io/SSEncrypt.module
[Proxy Group]
Auto = url-test,🇭🇰HK,🇯🇵JP,🇺🇸US,url = http://www.gstatic.com/generate_204,interval = 600,timeout = 5,tolerance = 200
|
- 规则配置文件
surge-cn.conf
除了服务器信息,其他的配置统一保存于此,可以方便的分发出去。我这里用 #placeholder
作为服务器列表属性的占位符方便脚本替换:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [General]
loglevel = notify
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, localhost, *.local, ::ffff:0:0/96
#placeholder
[Rule]
# LAN
DOMAIN-SUFFIX,dev,DIRECT
DOMAIN-SUFFIX,local,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT
IP-CIDR,10.0.0.0/8,DIRECT
IP-CIDR,172.16.0.0/12,DIRECT
IP-CIDR,127.0.0.0/8,DIRECT
IP-CIDR,100.64.0.0/10,DIRECT
# GeoIP CN
GEOIP,CN,DIRECT
FINAL,Proxy,dns-failed
|
iOS版Surge的话也可以使用应用自带的 Download Profile from URL
订阅我建立的gist范例(也就是本文的初心),地址。
使用脚本生成合并
1
2
3
4
5
6
7
8
| #!/bin/sh
set -ex
proxy=$(<proxy.conf)
rule=$(<surge-cn.conf)
placeholder='\#placeholder'
echo "${rule/$placeholder/$proxy}" > surge.conf
|
这样就生成了可供Surge使用的完整配置surge.conf
了。
解析代理服务商提供的配置文件
很多人除了使用VPS自建Shadowsocks服务以外,还会购买第三方的翻墙服务以备不时之需。这些服务一般都会提供现成的Surge配置下载,但直接使用的话并不灵活,所以还是需要自己定义规则合适。这里以我正在使用的rixCloud为例做下说明。
rixCloud也是提供了订阅方式更新,可以得到rixCloud.conf
这么个配置文件,我们只需要把里面的代理列表扒出来替换上面surge-cn.conf
里的占位符即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| #!/bin/sh
set -ex
IFS=" "
proxies=$(grep "中继" rixCloud.conf | grep -v "select")
proxy_rixcloud="[Proxy]\n"${proxies}"\n\n[Proxy Group]\n"
proxy_group=$(grep "select" rixCloud.conf)
proxy_rixcloud=${proxy_rixcloud}${proxy_group}
proxy=$(<proxy_rixcloud.conf)
rule=$(<surge-cn.conf)
placeholder='\#placeholder'
echo "${rule/$placeholder/$proxy_rixcloud}" > surge.conf
|
更进一步,根据配置更新日期来判断是否重新生成
rixCloud提供订阅的配置文件自带了更新日期,格式如 #Version 20180223 ,通过记录它我们可以检查是否需要重新生成,更加智能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| #!/bin/sh
set -ex
update_log=update_date_rixcloud.log
# 先判断时间戳文件是否存在,没有则生成一个
if [ ! -f "$update_log" ]; then
echo "creating $update_log"
touch "$update_log"
fi
last_date=$(<$update_log)
update_date=$(awk '/Version/ {print $2}' rixCloud.conf)
if [[ -n $last_date && $update_date = $last_date ]]
then
echo "config is already updated, skip generating"
exit 0
fi
# 记录下最新的配置更新日期
echo $update_date > $update_log
IFS=" "
proxies=$(grep "中继" rixCloud.conf | grep -v "select")
proxy_rixcloud="[Proxy]\n"${proxies}"\n\n[Proxy Group]\n"
proxy_group=$(grep "select" rixCloud.conf)
proxy_rixcloud=${proxy_rixcloud}${proxy_group}
rule=$(<surge-cn.conf)
placeholder='\#placeholder'
echo "${rule/$placeholder/$proxy_rixcloud}" > surge_rixcloud.conf
echo "rixCloud config updated"
|
再后面就不用我说了,加个crontab任务定期执行脚本静默更新就好。
update 20180224
相关文件已经放在了GitHub项目。
History
Version | Action | Time |
---|
1.0 | Initial commit | Feb 23, 2017 |
1.1 | Add GitHub repository | Feb 24, 2018 |