问题

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