vernesong / OpenClash

A Clash Client For OpenWrt
MIT License
16.79k stars 3.09k forks source link

trojan 订阅时,生成的 clash 配置文件不正确 #873

Closed zhengcan closed 3 years ago

zhengcan commented 3 years ago

我有一个 trojan 订阅,里面有如下部分

proxies:
    - {type: trojan, name: 'xxxxxxx', server: 'xxx.xxx.xxx.xxx', port: 443, password: 'xxxx', sni: 'xxx.xxx.xxx', skip-cert-verify: true}

在导入之后,生成的 clash 如下:

Proxy:
  - name: "xxxxxxx"
    type: trojan
    server: xxx.xxx.xxx.xxx
    port: 443
    password: "xxxx"
    sni: xxx.xxx.xxx
    alpn:
      - {type:
      - trojan
    skip-cert-verify: true

其中有一个 alpn: - {type: 导致 clash 加载失败 还请看一下这是怎么回事

zhengcan commented 3 years ago

我读了一下代码,应该是 luci-app-openclash/files/usr/share/openclash/yml_proxys_get.sh 里面的 cfg_get_alpn 函数未能正确识别 alpn 导致的:

cfg_get_alpn()
{
    echo "$(grep "$1" "$2" 2>/dev/null |grep -v "^ \{0,\}- name:" |awk -v tag=$1 'BEGIN{FS=tag} {print $2}' 2>/dev/null |sed 's/,.*//' 2>/dev/null |sed 's/\}.*//' 2>/dev/null |sed 's/^ \{0,\}//g' 2>/dev/null |sed 's/ \{0,\}$//g' 2>/dev/null)"
}

猜测上诉代码仅支持 name 在 type 前面的情况,但我不会改

作为规避方法,我只会修改 yml_proxys_set.sh 里面的 set_alpn,如下:

set_alpn()
{
   if [ -z "$1" ]; then
      return
   fi
   if [ "$1" == "{type:" ]; then
      return
   fi
cat >> "$SERVER_FILE" <<-EOF
      - $1
EOF
}