juewuy / ShellCrash

Run sing-box/mihomo as client in shell
8.73k stars 1.46k forks source link

订阅配置与预定义配置合并失败及tun模式相关 #24

Closed Orokapei closed 3 years ago

Orokapei commented 3 years ago

起初是因为我的订阅链接中仅有以下字段的内容

proxy-providers: xxx
proxy-groups: xxx
rule-providers: xxx
rules: xxx

启动后配置文件中仅有程序预定义的内容,订阅配置中的内容未成功合并

mixed-port: 7890
redir-port: 7892
authentication: [""]
.......
store-selected: false

反复测试后发现只要在订阅配置前面加一行(空行也可以)就可以成功合并

mixed-port: 7890
.......
store-selected: false

proxy-providers: xxx
proxy-groups: xxx
rule-providers: xxx
rules: xxx

不知道这个问题能否解决= = 另外不知tun模式需要什么依赖,除了kmod-tun还需要其他的吗,仅有kmod-tun的情况下似乎ip类的非域名连接无法转发到clash(例如telegram的连接),下面的是个人openwrt master分支编译用的config

CONFIG_TARGET_ramips=y
CONFIG_TARGET_ramips_mt7621=y
CONFIG_TARGET_ramips_mt7621_DEVICE_phicomm_k2p=y
CONFIG_LUCI_LANG_zh_Hans=y
CONFIG_PACKAGE_bash=y
CONFIG_PACKAGE_ca-certificates=y
CONFIG_PACKAGE_curl=y
CONFIG_PACKAGE_luci=y
CONFIG_PACKAGE_kmod-tun=y
CONFIG_PACKAGE_openssh-sftp-server=y
juewuy commented 3 years ago

第一个问题,代码会在生成配置文件时先移除原有的包含port的首行与首个包含proxy的行之间的所有行 如果是加空行才能生成,可能是回车编码或者类似的Linux不兼容的文件格式导致的。 请检查格式或尝试使用在线or本地的订阅转换功能。 第二个问题,纯tun模式不会转发非域名链接,非域名连接请使用http/sock代理或者使用混合模式

Orokapei commented 3 years ago

第一个问题,代码会在生成配置文件时先移除原有的包含port的首行与首个包含proxy的行之间的所有行 如果是加空行才能生成,可能是回车编码或者类似的Linux不兼容的文件格式导致的。 请检查格式或尝试使用在线or本地的订阅转换功能。 第二个问题,纯tun模式不会转发非域名链接,非域名连接请使用http/sock代理或者使用混合模式

非常感谢您的解答OvO,对于第一个问题我又试了一下获得了以下内容

++ grep -n port: /etc/clash/config.yaml
++ ++ cut -d : -f 1
head -1
+ a=
++ grep -n '^prox' /etc/clash/config.yaml
++ head -1
++ cut -d : -f 1
+ b=1
+ b=0
+ mkdir -p /tmp/clash_root
+ sed ,0d /etc/clash/config.yaml

因为订阅中不含portproxy-providers位于第一行导致执行了sed ,0d,但是这个语法我的认知中是错误的(本地linux测试确实,报错了) 随意建了个文本,测试发现sed ,0d openwrt自带的sed似乎执行了删除所有行,sed ,1d执行后未对文本做任何处理于是导致了以上加一行合并成功的问题,不知有没有可能调整下配置的处理逻辑= =

juewuy commented 3 years ago

https://github.com/juewuy/ShellClash/commit/282d0aa161263811199d1f850cf33b1ed78da7d4

Orokapei commented 3 years ago

282d0aa

-[ "$b" != "0" ] && sed "${a},${b}d" $yaml > $tmpdir/proxy.yaml
+[ "$b" != "0" ] && sed "${a},${b}d" $yaml > $tmpdir/proxy.yaml || cat $yaml >> $tmpdir/proxy.yaml

判断false应该直接将config写入proxy OvO