~适配singbox自定义规则
~singbox配置文件修饰方式及执行方式调整
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
152
scripts/start.sh
152
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 <<EOF
|
||||
{
|
||||
"log": {
|
||||
"level": "info",
|
||||
"timestamp": true
|
||||
},
|
||||
cat > ${TMPDIR}/jsons/log.json <<EOF
|
||||
{ "log": { "level": "info", "timestamp": true } }
|
||||
EOF
|
||||
#生成dns.json
|
||||
if [ "$hosts_opt" != "未启用" ];then #本机hosts
|
||||
@@ -541,14 +539,15 @@ EOF
|
||||
else
|
||||
reverse_mapping=false
|
||||
fi
|
||||
[ -z "$(cat ${CRASHDIR}/jsons/user.json 2>/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 <<EOF
|
||||
cat > ${TMPDIR}/jsons/dns.json <<EOF
|
||||
{
|
||||
"dns": {
|
||||
"servers": [{
|
||||
"tag": "dns_proxy",
|
||||
@@ -587,19 +586,22 @@ EOF
|
||||
"final": "dns_direct",
|
||||
"independent_cache": true,
|
||||
"reverse_mapping": true,
|
||||
"fakeip": { "enabled": true, "inet4_range": "198.18.0.0/16", "inet6_range": "fc00::/18" }
|
||||
},
|
||||
"fakeip": { "enabled": true, "inet4_range": "198.18.0.0/16", "inet6_range": "fc00::/16" }
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
#生成ntp.json
|
||||
cat > ${TMPDIR}/ntp.json <<EOF
|
||||
cat > ${TMPDIR}/jsons/ntp.json <<EOF
|
||||
{
|
||||
"ntp": {
|
||||
"enabled": true,
|
||||
"server": "203.107.6.88",
|
||||
"server_port": 123,
|
||||
"interval": "30m0s",
|
||||
"detour": "DIRECT"
|
||||
},
|
||||
}
|
||||
}
|
||||
EOF
|
||||
#生成inbounds.json
|
||||
[ -n "$authentication" ] && {
|
||||
@@ -609,7 +611,8 @@ EOF
|
||||
}
|
||||
[ "$sniffer" = "已启用" ] && sniffer=true || sniffer=false #域名嗅探配置
|
||||
|
||||
cat > ${TMPDIR}/inbounds.json <<EOF
|
||||
cat > ${TMPDIR}/jsons/inbounds.json <<EOF
|
||||
{
|
||||
"inbounds": [
|
||||
{
|
||||
"type": "mixed",
|
||||
@@ -621,9 +624,7 @@ EOF
|
||||
"type": "direct",
|
||||
"tag": "dns-in",
|
||||
"listen": "::",
|
||||
"listen_port": $dns_port,
|
||||
"sniff": true,
|
||||
"sniff_override_destination": false
|
||||
"listen_port": $dns_port
|
||||
}, {
|
||||
"type": "redirect",
|
||||
"tag": "redirect-in",
|
||||
@@ -638,10 +639,15 @@ EOF
|
||||
"listen_port": $tproxy_port,
|
||||
"sniff": true,
|
||||
"sniff_override_destination": $sniffer
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
if [ "$redir_mod" = "混合模式" -o "$redir_mod" = "Tun模式" ];then
|
||||
cat >> ${TMPDIR}/inbounds.json <<EOF
|
||||
}, {
|
||||
cat >> ${TMPDIR}/jsons/tun.json <<EOF
|
||||
{
|
||||
"inbounds": [
|
||||
{
|
||||
"type": "tun",
|
||||
"tag": "tun-in",
|
||||
"interface_name": "utun",
|
||||
@@ -651,16 +657,13 @@ EOF
|
||||
"sniff": true,
|
||||
"sniff_override_destination": $sniffer
|
||||
}
|
||||
],
|
||||
EOF
|
||||
else
|
||||
cat >> ${TMPDIR}/inbounds.json <<EOF
|
||||
}
|
||||
],
|
||||
]
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
#生成experimental.json
|
||||
cat > ${TMPDIR}/experimental.json <<EOF
|
||||
cat > ${TMPDIR}/jsons/experimental.json <<EOF
|
||||
{
|
||||
"experimental": {
|
||||
"clash_api": {
|
||||
"external_controller": "0.0.0.0:$db_port",
|
||||
@@ -671,54 +674,75 @@ EOF
|
||||
}
|
||||
}
|
||||
EOF
|
||||
#分割配置文件获得outbounds.json及route.json
|
||||
[ "$(wc -l < $core_config)" -le 5 ] && {
|
||||
${BINDIR}/CrashCore format -c $core_config > ${TMPDIR}/format.json
|
||||
mv -f ${TMPDIR}/format.json $core_config
|
||||
#生成add_route.json
|
||||
cat > ${TMPDIR}/jsons/add_route.json <<EOF
|
||||
{
|
||||
"route": {
|
||||
"rules": [
|
||||
{ "inbound": "dns-in", "outbound": "dns-out" }
|
||||
]
|
||||
}
|
||||
}
|
||||
EOF
|
||||
#生成自定义规则文件
|
||||
[ -s ${CRASHDIR}/yamls/rules.yaml ] && {
|
||||
cat ${CRASHDIR}/yamls/rules.yaml \
|
||||
| sed '/^#/d' \
|
||||
| sed 's/- DOMAIN-SUFFIX,/{ "domain_suffix": [ "/g' \
|
||||
| sed 's/- DOMAIN-KEYWORD,/{ "domain_keyword": [ "/g' \
|
||||
| sed 's/- IP-CIDR,/{ "ip_cidr": [ "/g' \
|
||||
| sed 's/- SRC-IP-CIDR,/{ "source_ip_cidr": [ "/g' \
|
||||
| sed 's/- DST-PORT,/{ "port": [ "/g' \
|
||||
| sed 's/- SRC-PORT,/{ "source_port": [ "/g' \
|
||||
| sed 's/- GEOIP,/{ "geoip": [ "/g' \
|
||||
| sed 's/- GEOSITE,/{ "geosite": [ "/g' \
|
||||
| sed 's/- IP-CIDR6,/{ "ip_cidr": [ "/g' \
|
||||
| sed 's/- DOMAIN,/{ "domain": [ "/g' \
|
||||
| sed 's/,/" ], "outbound": "/g' \
|
||||
| sed 's/$/" },/g' \
|
||||
| sed '1i\{ "route": { "rules": [ ' \
|
||||
| sed '$s/,$/ ] } }/' > ${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"'
|
||||
|
||||
Reference in New Issue
Block a user