diff --git a/scripts/getdate.sh b/scripts/getdate.sh index 552d52c..46122c7 100644 --- a/scripts/getdate.sh +++ b/scripts/getdate.sh @@ -12,7 +12,7 @@ dir_avail(){ } #导入订阅、配置文件相关 -setrules(){ #自定义clash规则 +setrules(){ #自定义规则 set_rule_type(){ echo ----------------------------------------------- echo -e "\033[33m请选择规则类型\033[0m" @@ -88,16 +88,18 @@ setrules(){ #自定义clash规则 echo ----------------------------------------------- echo -e "\033[33m你可以在这里快捷管理自定义规则\033[0m" echo -e "\033[36m如需批量操作,请手动编辑:$YAMLSDIR/rules.yaml\033[0m" + echo -e "\033[33msingbox和clash共用此处规则,可无缝切换!\033[0m" + echo -e "\033[36m大量规则请尽量使用rule-set功能添加,此处过量添加可能导致启动卡顿!\033[0m" echo ----------------------------------------------- echo -e " 1 新增自定义规则" echo -e " 2 移除自定义规则" echo -e " 3 清空规则列表" - echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m" + [ "$crashcore" = singbox ] || echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m" echo -e " 0 返回上级菜单" read -p "请输入对应数字 > " num case $num in 1) - rule_type="DOMAIN-SUFFIX DOMAIN-KEYWORD IP-CIDR SRC-IP-CIDR DST-PORT SRC-PORT GEOIP GEOSITE IP-CIDR6 DOMAIN MATCH" + rule_type="DOMAIN-SUFFIX DOMAIN-KEYWORD IP-CIDR SRC-IP-CIDR DST-PORT SRC-PORT GEOIP GEOSITE IP-CIDR6 DOMAIN" rule_group="DIRECT#REJECT$(cat $YAMLSDIR/proxy-groups.yaml $YAMLSDIR/config.yaml 2>/dev/null | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/- name: /#/g' | tr -d '\n')" set_rule_type setrules @@ -369,12 +371,8 @@ set_singbox_adv(){ #自定义singbox配置文件 echo -e "\033[31m自定义的内容不会追加,而是完整替换原配置文件相应模块,请谨慎使用!\033[0m" echo -e "singbox官方文档:\033[36mhttps://sing-box.sagernet.org/zh/\033[0m" echo ----------------------------------------------- - echo -e "\033[33m本工具使用cat命令合并,所以请完整遵循json格式!\033[0m" - echo -e "\033[33m每个模块结尾需要有逗号连接下一个模块!!!\033[0m" - echo ----------------------------------------------- echo -e "Windows下请\n使用\033[33mWinSCP软件\033[0m进行编辑!\033[0m" - echo -e "MacOS下请\n使用\033[33mSecureFX软件\033[0m进行编辑!\033[0m" - echo -e "Linux本机可\n使用\033[33mvim\033[0m进行编辑(路由设备可能不显示中文请勿使用)!\033[0m" + echo -e "MacOS下请\n使用\033[33mSecureFX软件\033[0m进行编辑!\033[0m"\ } override(){ #配置文件覆写 [ -z "$rule_link" ] && rule_link=1 @@ -383,8 +381,8 @@ override(){ #配置文件覆写 echo -e "\033[30;47m 欢迎使用配置文件覆写功能!\033[0m" echo ----------------------------------------------- echo -e " 1 自定义\033[32m端口及秘钥\033[0m" + echo -e " 2 管理\033[36m自定义规则\033[0m" [ "$crashcore" = singbox ] || { - echo -e " 2 管理\033[36m自定义规则\033[0m" echo -e " 3 管理\033[33m自定义节点\033[0m" echo -e " 4 管理\033[36m自定义策略组\033[0m" } @@ -875,7 +873,7 @@ switch_core(){ [ "$res" = '0' ] && [ "$core_old" = "singbox" ] && rm -rf ${CRASHDIR}/jsons/* } if [ "$crashcore" = singbox ];then - COMMAND='"$BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json"' + COMMAND='"$BINDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"' else COMMAND='"$BINDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"' fi @@ -1874,7 +1872,7 @@ debug(){ 1) $CRASHDIR/start.sh stop if [ "$crashcore" = singbox ] ;then - $BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json & + $BINDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons & { sleep 4 ; kill $! &>/dev/null & } wait else diff --git a/scripts/init.sh b/scripts/init.sh index ee1443b..ad9e708 100644 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -193,7 +193,7 @@ setconfig versionsh_l $version setconfig TMPDIR ${TMPDIR} ${CRASHDIR}/configs/command.env setconfig BINDIR ${BINDIR} ${CRASHDIR}/configs/command.env if [ -x ${CRASHDIR}/CrashCore ] && [ -n "$(grep 'crashcore=singbox' ${CRASHDIR}/configs/ShellCrash.cfg)" ];then - COMMAND='"$BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json"' + COMMAND='"$BINDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"' else COMMAND='"$BINDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"' fi diff --git a/scripts/shellcrash.service b/scripts/shellcrash.service index 259b1f6..e2fadd6 100644 --- a/scripts/shellcrash.service +++ b/scripts/shellcrash.service @@ -6,7 +6,7 @@ After=network.target Type=simple User=shellcrash ExecStartPre=/etc/ShellCrash/start.sh bfstart -ExecStart=/etc/ShellCrash/CrashCore run -D /etc/ShellCrash -c /tmp/ShellCrash/config.json +ExecStart=/etc/ShellCrash/CrashCore run -D /etc/ShellCrash -C /tmp/ShellCrash/jsons ExecStartPost=/etc/ShellCrash/start.sh afstart >/dev/null & ExecStopPost=/etc/ShellCrash/start.sh stop_firewall ; /etc/ShellCrash/start.sh unset_proxy Restart=on-abnormal diff --git a/scripts/start.sh b/scripts/start.sh index 6199a6f..f9a2003 100644 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -468,7 +468,7 @@ EOF } #插入自定义规则 sed -i "/#自定义规则/d" ${TMPDIR}/rules.yaml - [ -f ${CRASHDIR}/yamls/rules.yaml ] && { + [ -s ${CRASHDIR}/yamls/rules.yaml ] && { cat ${CRASHDIR}/yamls/rules.yaml | sed "/^#/d" | sed '$a\' | sed 's/$/ #自定义规则/g' > ${TMPDIR}/rules.add cat ${TMPDIR}/rules.yaml >> ${TMPDIR}/rules.add mv -f ${TMPDIR}/rules.add ${TMPDIR}/rules.yaml @@ -517,13 +517,11 @@ EOF done } modify_json(){ #修饰singbox配置文件 + #准备目录 + [ -d ${TMPDIR}/jsons ] && rm -rf ${TMPDIR}/jsons/* || mkdir -p ${TMPDIR}/jsons #生成log.json - cat > ${TMPDIR}/log.json < ${TMPDIR}/jsons/log.json </dev/null | grep '^dns:')" ] && { + [ -z "$(cat ${CRASHDIR}/jsons/dns.json 2>/dev/null | grep '"dns":')" ] && { [ -z "$dns_nameserver" ] && dns_nameserver='223.5.5.5' || dns_nameserver=$(echo $dns_nameserver | awk -F ',' '{print $1}') [ -z "$dns_fallback" ] && dns_fallback='1.0.0.1' || dns_fallback=$(echo $dns_fallback | awk -F ',' '{print $1}') [ "$ipv6_dns" = "已开启" ] && strategy='prefer_ipv4' || strategy='ipv4_only' [ "$dns_mod" = "redir_host" ] && proxy_dns=dns_proxy && direct_dns=dns_direct [ "$dns_mod" = "fake-ip" ] && proxy_dns=dns_fakeip && direct_dns=dns_direct [ "$dns_mod" = "mix" ] && proxy_dns=dns_fakeip && direct_dns=dns_direct - cat > ${TMPDIR}/dns.json < ${TMPDIR}/jsons/dns.json < ${TMPDIR}/ntp.json < ${TMPDIR}/jsons/ntp.json < ${TMPDIR}/inbounds.json < ${TMPDIR}/jsons/inbounds.json <> ${TMPDIR}/inbounds.json <> ${TMPDIR}/jsons/tun.json <> ${TMPDIR}/inbounds.json < ${TMPDIR}/experimental.json < ${TMPDIR}/jsons/experimental.json < ${TMPDIR}/format.json - mv -f ${TMPDIR}/format.json $core_config + #生成add_route.json + cat > ${TMPDIR}/jsons/add_route.json < ${TMPDIR}/jsons/cust_add_rules.json } - cat $core_config | sed -n '/"outbounds":/,/"route":/{/"route":/d; p}' > ${TMPDIR}/outbounds.json - cat $core_config | sed -n '/"route":/,/"experimental":/{/"experimental":/d; p}' > ${TMPDIR}/route.json + #提取配置文件以获得outbounds.json及route.json + ${BINDIR}/CrashCore format -c $core_config > ${TMPDIR}/format.json + echo '{' > ${TMPDIR}/jsons/outbounds.json + echo '{' > ${TMPDIR}/jsons/route.json + cat ${TMPDIR}/format.json | sed -n '/"outbounds":/,/"route":/{/"route":/d; p}' >> ${TMPDIR}/jsons/outbounds.json + cat ${TMPDIR}/format.json | sed -n '/"route":/,/"experimental":/{/"experimental":/d; p}' >> ${TMPDIR}/jsons/route.json #清理route.json中的process_name规则以及"auto_detect_interface" - sed -i '/"process_name": \[/,/],$/d' ${TMPDIR}/route.json - sed -i '/"process_name": "[^"]*",/d' ${TMPDIR}/route.json - sed -i 's/"auto_detect_interface": true/"auto_detect_interface": false/g' ${TMPDIR}/route.json - #修饰route.json结尾 - sed -i '/^ }$/s/ }/ },/' ${TMPDIR}/route.json - sed -i '/^}$/d' ${TMPDIR}/route.json + sed -i '/"process_name": \[/,/],$/d' ${TMPDIR}/jsons/route.json + sed -i '/"process_name": "[^"]*",/d' ${TMPDIR}/jsons/route.json + sed -i 's/"auto_detect_interface": true/"auto_detect_interface": false/g' ${TMPDIR}/jsons/route.json #跳过本地tls证书验证 if [ -z "$skip_cert" -o "$skip_cert" = "已开启" ];then - sed -i 's/"insecure": false/"insecure": true/' ${TMPDIR}/outbounds.json + sed -i 's/"insecure": false/"insecure": true/' ${TMPDIR}/jsons/outbounds.json else - sed -i 's/"insecure": true/"insecure": false/' ${TMPDIR}/outbounds.json + sed -i 's/"insecure": true/"insecure": false/' ${TMPDIR}/jsons/outbounds.json fi - #合并文件 - json_all= + #修饰outbounds&route.json结尾 + sed -i 's/^ ],$/ ] }/' ${TMPDIR}/jsons/outbounds.json + sed -i 's/^ },$/ } }/' ${TMPDIR}/jsons/route.json + #加载自定义配置文件 + mkdir -p ${TMPDIR}/jsons_base for char in log dns ntp inbounds outbounds route experimental;do - [ -s ${TMPDIR}/$char.json ] && json_add=${TMPDIR}/$char.json - [ -s ${CRASHDIR}/jsons/$char.json ] && json_add=${CRASHDIR}/jsons/$char.json #如果有自定义配置文件则使用 - json_all="$json_all $json_add" - json_add='' + [ -s ${CRASHDIR}/jsons/${char}.json ] && { + ln -s ${CRASHDIR}/jsons/${char}.json ${TMPDIR}/jsons/cust_${char}.json + mv -f ${TMPDIR}/jsons/${char}.json ${TMPDIR}/jsons_base #如果重复则临时备份 + } done - cut -c 1- $json_all > ${TMPDIR}/config.json #测试自定义配置文件 - ${BINDIR}/CrashCore check -D ${BINDIR} -c ${TMPDIR}/config.json >/dev/null - if [ "$?" != 0 ];then - logger "$(${BINDIR}/CrashCore check -D ${BINDIR} -c ${TMPDIR}/config.json | grep -Eo 'error.*=.*')" 31 - logger "自定义配置文件校验失败!将使用基础配置文件启动!" 33 - logger "错误详情请参考 ${TMPDIR}/error.json 文件!" 33 - mv -f ${TMPDIR}/config.json ${TMPDIR}/error.json &>/dev/null - #合并基础配置文件 - json_all='' - for char in log dns ntp inbounds outbounds route experimental;do - [ -s ${TMPDIR}/$char.json ] && json_add=${TMPDIR}/$char.json - json_all="$json_all $json_add" - done - cut -c 1- $json_all > ${TMPDIR}/config.json + error=$(${BINDIR}/CrashCore check -D ${BINDIR} -C ${TMPDIR}/jsons 2>&1 | grep -Eo 'cust.*\.json' | sed 's/cust_//g' ) + if [ -n "$error" ];then + [ "$error" = 'rules.json' ] && error=${CRASHDIR}/yamls/rules.yaml || error=${CRASHDIR}/jsons/$error + logger "自定义配置文件校验失败,请检查 $error 文件!" 31 + logger "尝试使用基础配置文件启动~" 33 + #清理自定义配置文件并还原基础配置 + rm -rf ${TMPDIR}/jsons/cust_* + mv -f ${TMPDIR}/jsons_base/* ${TMPDIR}/jsons fi #清理缓存 - for char in all log dns ntp inbounds outbounds route experimental;do - rm -f ${TMPDIR}/${char}.json - done + rm -rf ${TMPDIR}/*.json + rm -rf ${TMPDIR}/jsons_base } #设置路由规则 @@ -1411,7 +1435,7 @@ core_check(){ chmod +x ${TMPDIR}/core.new 2>/dev/null if [ "$crashcore" = singbox ];then core_v=$(${TMPDIR}/core.new version 2>/dev/null | grep version | awk '{print $3}') - COMMAND='"$BINDIR/CrashCore run -D $BINDIR -c $TMPDIR/config.json"' + COMMAND='"$BINDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"' else core_v=$(${TMPDIR}/core.new -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //') COMMAND='"$BINDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'