v1.7.9
~自定义节点功能重写,现在支持在脚本中快捷添加节点以及指定节点对应的策略组 ~自定义策略组功能重写,现在支持在脚本中快捷添加自定义策略组 ~内置DNS服务功能重新移回7-6 ~优化了配置文件生成逻辑,现在对各种自定义配置及功能有更好兼容性 ~优化了部分文件结构
This commit is contained in:
BIN
bin/Country.mmdb
BIN
bin/Country.mmdb
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
BIN
bin/cn_mini.mmdb
BIN
bin/cn_mini.mmdb
Binary file not shown.
|
Before Width: | Height: | Size: 115 KiB |
1536
bin/config.yaml
1536
bin/config.yaml
File diff suppressed because it is too large
Load Diff
32759
bin/geosite.dat
32759
bin/geosite.dat
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
BIN
bin/yacd.tar.gz
BIN
bin/yacd.tar.gz
Binary file not shown.
@@ -23,7 +23,7 @@ ckstatus(){
|
||||
#检查时间戳
|
||||
touch /tmp/clash_start_time
|
||||
#使用source加载配置文件
|
||||
source $CFG_PATH
|
||||
source $CFG_PATH > /dev/null
|
||||
versionsh=$(cat $clashdir/init.sh | grep -E ^version= | head -n 1 | sed 's/version=//')
|
||||
[ -n "$versionsh" ] && versionsh_l=$versionsh
|
||||
#设置默认核心资源目录
|
||||
@@ -361,7 +361,7 @@ log_pusher(){
|
||||
esac
|
||||
}
|
||||
setport(){
|
||||
source $CFG_PATH
|
||||
source $CFG_PATH > /dev/null
|
||||
[ -z "$secret" ] && secret=未设置
|
||||
[ -z "$authentication" ] && auth=未设置 || auth=******
|
||||
inputport(){
|
||||
@@ -738,7 +738,7 @@ checkport(){
|
||||
echo -e "\033[0m-----------------------------------------------"
|
||||
echo -e "\033[36m请修改默认端口配置!\033[0m"
|
||||
setport
|
||||
source $CFG_PATH
|
||||
source $CFG_PATH > /dev/null
|
||||
checkport
|
||||
fi
|
||||
done
|
||||
@@ -1390,6 +1390,7 @@ clashadv(){
|
||||
[ "$disoverride" != "1" ] && {
|
||||
echo -e " 4 启用域名嗅探: \033[36m$sniffer\033[0m ————用于流媒体及防DNS污染"
|
||||
echo -e " 5 启用节点绕过: \033[36m$proxies_bypass\033[0m ————用于防止多设备多重流量"
|
||||
echo -e " 6 配置内置DNS服务 \033[36m$dns_no\033[0m"
|
||||
}
|
||||
echo -----------------------------------------------
|
||||
echo -e " 9 \033[31m重置/备份/还原\033[0m脚本设置"
|
||||
@@ -1443,6 +1444,10 @@ clashadv(){
|
||||
sleep 1
|
||||
clashadv
|
||||
;;
|
||||
6)
|
||||
setdns
|
||||
clashadv
|
||||
;;
|
||||
9)
|
||||
echo -e " 1 备份脚本设置"
|
||||
echo -e " 2 还原脚本设置"
|
||||
|
||||
@@ -275,43 +275,244 @@ setrules(){
|
||||
;;
|
||||
esac
|
||||
}
|
||||
del_rule_type(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "输入对应数字即可移除相应规则:"
|
||||
cat $clashdir/rules.yaml | grep -Ev '^#' | awk -F "#" '{print " "NR" "$1$2$3}'
|
||||
echo -----------------------------------------------
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case $num in
|
||||
0) ;;
|
||||
'') ;;
|
||||
*)
|
||||
if [ $num -le $(cat $clashdir/rules.yaml | grep -Ev '^#' | wc -l) ];then
|
||||
sed -i "$num{/^\s*[^#]/d}" $clashdir/rules.yaml
|
||||
del_rule_type
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
echo -----------------------------------------------
|
||||
echo -e "当前已添加的自定义规则为:"
|
||||
cat $clashdir/rules.yaml | grep -Ev '^#' | awk '{print " "NR" "$2" "$3}'
|
||||
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m输入规则对应数字可以移除对应规则\033[0m"
|
||||
echo -e " a 新建自定义规则"
|
||||
echo -e " b 清空自定义规则"
|
||||
echo -e "\033[33m你可以在这里快捷管理自定义规则\033[0m"
|
||||
echo -e "\033[36m如需批量操作,请手动编辑:$clashdir/rules.yaml\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 新增自定义规则"
|
||||
echo -e " 2 管理自定义规则"
|
||||
echo -e " 3 清空规则列表"
|
||||
echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应字母或数字 > " char
|
||||
case $char in
|
||||
a)
|
||||
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_group="DIRECT#REJECT$(grep -o '\- name:.*' $clashdir/config.yaml | sed 's/- name: /#/g' | tr -d '\n')"
|
||||
rule_group="DIRECT#REJECT$(cat $clashdir/proxy-groups.yaml $clashdir/config.yaml | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/- name: /#/g' | tr -d '\n')"
|
||||
set_rule_type
|
||||
setrules
|
||||
;;
|
||||
b)
|
||||
sed -i '/^\s*[^#]/d' $clashdir/rules.yaml
|
||||
2)
|
||||
del_rule_type
|
||||
setrules
|
||||
;;
|
||||
0)
|
||||
3)
|
||||
read -p "确认清空全部自定义规则?(1/0) > " res
|
||||
[ "$res" = "1" ] && sed -i '/^\s*[^#]/d' $clashdir/rules.yaml
|
||||
setrules
|
||||
;;
|
||||
"")
|
||||
errornum
|
||||
4)
|
||||
echo -----------------------------------------------
|
||||
if [ "$proxies_bypass" = "未启用" ];then
|
||||
echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m"
|
||||
echo -e "\033[33m请确保下游设备使用的节点与ShellClash中使用的节点相同,否则无法生效!\033[0m"
|
||||
read -p "启用节点绕过?(1/0) > " res
|
||||
[ "$res" = "1" ] && proxies_bypass=已启用
|
||||
else
|
||||
proxies_bypass=未启用
|
||||
fi
|
||||
setconfig proxies_bypass $proxies_bypass
|
||||
sleep 1
|
||||
setrules
|
||||
;;
|
||||
*)
|
||||
if [ $char -le $(cat $clashdir/rules.yaml | grep -Ev '^#' | wc -l) ];then
|
||||
sed -i "$char{/^\s*[^#]/d}" $clashdir/rules.yaml
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
sleep 1
|
||||
setrules
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
setgroups(){
|
||||
set_group_type(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m注意策略组名称必须和【自定义规则】或【自定义节点】功能中指定的策略组一致!\033[0m"
|
||||
echo -e "\033[33m建议先创建策略组,之后可在【自定义规则】或【自定义节点】功能中自动指定\033[0m"
|
||||
echo -e "\033[33m如需在当前策略组下添加节点,请手动编辑$clashdir/proxy-groups.yaml\033[0m"
|
||||
read -p "请输入自定义策略组名称 > " new_group_name
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m请选择策略组【$new_group_name】的类型!\033[0m"
|
||||
echo $group_type_cn | awk '{for(i=1;i<=NF;i++){print i" "$i}}'
|
||||
read -p "请输入对应数字 > " num
|
||||
new_group_type=$(echo $group_type | awk '{print $'"$num"'}')
|
||||
if [ "$num" = "1" ];then
|
||||
unset new_group_url interval
|
||||
else
|
||||
read -p "请输入测速地址,回车则默认使用https://www.gstatic.com/generate_204 > " new_group_url
|
||||
[ -z "$new_group_url" ] && new_group_url=https://www.gstatic.com/generate_204
|
||||
new_group_url="url: '$new_group_url'"
|
||||
interval="interval: 300"
|
||||
fi
|
||||
set_group_add
|
||||
#添加自定义策略组
|
||||
cat >> $clashdir/proxy-groups.yaml <<EOF
|
||||
- name: $new_group_name
|
||||
type: $new_group_type
|
||||
$new_group_url
|
||||
$interval
|
||||
proxies:
|
||||
- DIRECT
|
||||
EOF
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m添加成功!\033[0m"
|
||||
|
||||
}
|
||||
set_group_add(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m请选择想要将本策略添加到的策略组\033[0m"
|
||||
echo -e "\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m"
|
||||
echo $proxy_group | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}'
|
||||
echo -e " 0 跳过添加"
|
||||
read -p "请输入对应数字(多个用空格隔开) > " char
|
||||
case $char in
|
||||
0) ;;
|
||||
*)
|
||||
for num in $char;do
|
||||
rule_group_set=$(echo $proxy_group|cut -d'#' -f$num)
|
||||
rule_group_add="${rule_group_add}#${rule_group_set}"
|
||||
done
|
||||
if [ -n "$rule_group_add" ];then
|
||||
new_group_name="$new_group_name$rule_group_add"
|
||||
unset rule_group_add
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m你可以在这里快捷管理自定义策略组\033[0m"
|
||||
echo -e "\033[36m如需修改或批量操作,请手动编辑:$clashdir/proxy-groups.yaml\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 添加自定义策略组"
|
||||
echo -e " 2 清空自定义策略组"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case $num in
|
||||
1)
|
||||
group_type="select url-test fallback load-balance"
|
||||
group_type_cn="手动选择 自动选择 故障转移 负载均衡"
|
||||
proxy_group="$(cat $clashdir/proxy-groups.yaml $clashdir/config.yaml | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/- name: /#/g' | tr -d '\n' | sed 's/#//')"
|
||||
set_group_type
|
||||
setgroups
|
||||
;;
|
||||
2)
|
||||
read -p "确认清空全部自定义策略组?(1/0) > " res
|
||||
[ "$res" = "1" ] && sed -i '/^\s*[^#]/d' $clashdir/proxy-groups.yaml
|
||||
setgroups
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
setproxies(){
|
||||
set_proxy_type(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m注意节点格式必须是单行,不包括括号,name:必须写在最前,例如:\033[0m"
|
||||
echo -e "\033[36m【name: \"test\", server: 192.168.1.1, port: 12345, type: socks5, udp: true】\033[0m"
|
||||
echo -e "更多写法请参考:\033[32m https://juewuy.github.io/ \033[0m"
|
||||
read -p "请输入节点 > " proxy_state_set
|
||||
[ -n "$(echo $proxy_state_set | grep -E "^name:")" ] && set_group_add || errornum
|
||||
}
|
||||
set_group_add(){
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[36m请选择想要将节点添加到的策略组\033[0m"
|
||||
echo -e "\033[32m如需添加到多个策略组,请一次性输入多个数字并用空格隔开\033[0m"
|
||||
echo -e "\033[33m如需自定义策略组,请先使用【管理自定义策略组功能】添加\033[0m"
|
||||
echo $proxy_group | awk -F '#' '{for(i=1;i<=NF;i++){print i" "$i}}'
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字(多个用空格隔开) > " char
|
||||
case $char in
|
||||
0) ;;
|
||||
*)
|
||||
for num in $char;do
|
||||
rule_group_set=$(echo $proxy_group|cut -d'#' -f$num)
|
||||
rule_group_add="${rule_group_add}#${rule_group_set}"
|
||||
done
|
||||
if [ -n "$rule_group_add" ];then
|
||||
echo "- {$proxy_state_set}$rule_group_add" >> $clashdir/proxies.yaml
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[32m添加成功!\033[0m"
|
||||
unset rule_group_add
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m你可以在这里快捷管理自定义节点\033[0m"
|
||||
echo -e "\033[36m如需批量操作,请手动编辑:$clashdir/proxies.yaml\033[0m"
|
||||
echo -----------------------------------------------
|
||||
echo -e " 1 添加自定义节点"
|
||||
echo -e " 2 管理自定义节点"
|
||||
echo -e " 3 清空自定义节点"
|
||||
echo -e " 4 配置节点绕过: \033[36m$proxies_bypass\033[0m"
|
||||
echo -e " 0 返回上级菜单"
|
||||
read -p "请输入对应数字 > " num
|
||||
case $num in
|
||||
1)
|
||||
proxy_type="DOMAIN-SUFFIX DOMAIN-KEYWORD IP-CIDR SRC-IP-CIDR DST-PORT SRC-PORT GEOIP GEOSITE IP-CIDR6 DOMAIN MATCH"
|
||||
proxy_group="$(cat $clashdir/proxy-groups.yaml $clashdir/config.yaml | grep -Ev '^#' | grep -o '\- name:.*' | sed 's/- name: /#/g' | tr -d '\n' | sed 's/#//')"
|
||||
set_proxy_type
|
||||
setproxies
|
||||
;;
|
||||
2)
|
||||
echo -e "当前已添加的自定义节点为:"
|
||||
cat $clashdir/proxies.yaml | grep -Ev '^#' | awk -F '[,,}]' '{print NR, $1, $NF}' | sed 's/- {//g'
|
||||
echo -----------------------------------------------
|
||||
echo -e "\033[33m输入节点对应数字可以移除对应节点\033[0m"
|
||||
read -p "请输入对应数字 > " num
|
||||
if [ $num -le $(cat $clashdir/proxies.yaml | grep -Ev '^#' | wc -l) ];then
|
||||
sed -i "$num{/^\s*[^#]/d}" $clashdir/proxies.yaml
|
||||
else
|
||||
errornum
|
||||
fi
|
||||
setproxies
|
||||
;;
|
||||
3)
|
||||
read -p "确认清空全部自定义节点?(1/0) > " res
|
||||
[ "$res" = "1" ] && sed -i '/^\s*[^#]/d' $clashdir/proxies.yaml
|
||||
setproxies
|
||||
;;
|
||||
4)
|
||||
echo -----------------------------------------------
|
||||
if [ "$proxies_bypass" = "未启用" ];then
|
||||
echo -e "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量!\033[0m"
|
||||
echo -e "\033[33m请确保下游设备使用的节点与ShellClash中使用的节点相同,否则无法生效!\033[0m"
|
||||
read -p "启用节点绕过?(1/0) > " res
|
||||
[ "$res" = "1" ] && proxies_bypass=已启用
|
||||
else
|
||||
proxies_bypass=未启用
|
||||
fi
|
||||
setconfig proxies_bypass $proxies_bypass
|
||||
sleep 1
|
||||
setrules
|
||||
;;
|
||||
*)
|
||||
errornum
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
override(){
|
||||
[ -z "$rule_link" ] && rule_link=1
|
||||
[ -z "$server_link" ] && server_link=1
|
||||
@@ -321,9 +522,9 @@ override(){
|
||||
echo -e " 1 自定义\033[32m端口及秘钥\033[0m"
|
||||
echo -e " 2 配置\033[33m内置DNS服务\033[0m"
|
||||
echo -e " 3 \033[36m管理\033[0m自定义规则"
|
||||
#echo -e " 4 \033[36m管理\033[0m自定义节点"
|
||||
#echo -e " 5 \033[36m管理\033[0m自定义代理链"
|
||||
echo -e " 6 \033[32m自定义\033[0m其他功能"
|
||||
echo -e " 4 \033[36m管理\033[0m自定义节点"
|
||||
echo -e " 5 \033[36m管理\033[0m自定义策略组"
|
||||
echo -e " 7 \033[32m自定义\033[0m其他功能"
|
||||
[ "$disoverride" != 1 ] && echo -e " 9 \033[33m禁用\033[0m配置文件覆写"
|
||||
echo -----------------------------------------------
|
||||
[ "$inuserguide" = 1 ] || echo -e " 0 返回上级菜单"
|
||||
@@ -345,16 +546,7 @@ override(){
|
||||
override
|
||||
;;
|
||||
2)
|
||||
source $CFG_PATH
|
||||
if [ "$dns_no" = "已禁用" ];then
|
||||
read -p "检测到内置DNS已被禁用,是否启用内置DNS?(1/0) > " res
|
||||
if [ "$res" = "1" ];then
|
||||
setconfig dns_no
|
||||
setdns
|
||||
fi
|
||||
else
|
||||
setdns
|
||||
fi
|
||||
setdns
|
||||
override
|
||||
;;
|
||||
3)
|
||||
@@ -386,7 +578,8 @@ EOF
|
||||
#script:
|
||||
#listeners:
|
||||
EOF
|
||||
echo -e "\033[32m已经创建自定义功能文件:$clashdir/user.yaml !\033[0m"
|
||||
echo -e "\033[32m已经创建自定义设定文件:$clashdir/user.yaml !\033[0m"
|
||||
echo -e "\033[32m已经创建自定义功能文件:$clashdir/others.yaml !\033[0m"
|
||||
echo -e "\033[33m可用于编写自定义的锚点、入站、proxy-providers、sub-rules、rule-set、script等功能\033[0m"
|
||||
echo -e "Windows下请\n使用\033[33mWinSCP软件\033[0m进行编辑!\033[0m"
|
||||
echo -e "MacOS下请\n使用\033[33mSecureFX软件\033[0m进行编辑!\033[0m"
|
||||
|
||||
138
scripts/start.sh
138
scripts/start.sh
@@ -8,8 +8,7 @@ getconfig(){
|
||||
[ -d "/jffs/clash" ] && clashdir=/jffs/clash
|
||||
[ -z "$clashdir" ] && clashdir=$(cat /etc/profile | grep clashdir | awk -F "\"" '{print $2}')
|
||||
[ -z "$clashdir" ] && clashdir=$(cat ~/.bashrc | grep clashdir | awk -F "\"" '{print $2}')
|
||||
ccfg=$clashdir/mark
|
||||
[ -f $ccfg ] && source $ccfg
|
||||
source $clashdir/mark &> /dev/null
|
||||
#默认设置
|
||||
[ -z "$bindir" ] && bindir=$clashdir
|
||||
[ -z "$redir_mod" ] && [ "$USER" = "root" -o "$USER" = "admin" ] && redir_mod=Redir模式
|
||||
@@ -222,7 +221,6 @@ EOF`
|
||||
logger "配置文件获取失败!" 31
|
||||
echo -e "\033[32m尝试使用其他服务器获取配置!\033[0m"
|
||||
logger "正在重试第$retry次/共4次!" 33
|
||||
sed -i '/server_link=*/'d $ccfg
|
||||
if [ "$server_link" -ge 5 ]; then
|
||||
server_link=0
|
||||
fi
|
||||
@@ -340,33 +338,72 @@ modify_yaml(){
|
||||
[ -z "$mode" ] && mode='Rule'
|
||||
#分割配置文件
|
||||
mkdir -p $tmpdir > /dev/null
|
||||
yaml_p=$(grep -n "^prox" $yaml | head -1 | cut -d ":" -f 1) #获取节点起始行号
|
||||
yaml_r=$(grep -n "^rules:" $yaml | head -1 | cut -d ":" -f 1) #获取规则起始行号
|
||||
if [ "$yaml_p" -lt "$yaml_r" ];then
|
||||
sed -n "${yaml_p},${yaml_r}p" $yaml > $tmpdir/proxy.yaml
|
||||
cat $yaml | sed -n "${yaml_r},\$p" | sed '1d' | sed 's/^ *-/ -/g' > $tmpdir/rule.yaml #切割rule并对齐
|
||||
else
|
||||
cat $yaml | sed -n "${yaml_r},${yaml_p}p" | sed '1d' | sed '$d' | sed 's/^ *-/ -/g' > $tmpdir/rule.yaml #切割rule并对齐
|
||||
sed -n "${yaml_p},\$p" $yaml > $tmpdir/proxy.yaml
|
||||
sed -n "${yaml_r}p" $yaml >> $tmpdir/proxy.yaml #将rule字段附在末尾
|
||||
fi
|
||||
yaml_char='proxies proxy-groups proxy-providers rules rule-providers'
|
||||
for char in $yaml_char;do
|
||||
sed -n "/^$char:/,/^[a-z]/ { /^[a-z]/d; p; }" $yaml > $tmpdir/${char}.yaml
|
||||
done
|
||||
#跳过本地tls证书验证
|
||||
[ "$skip_cert" = "已开启" ] && sed -i 's/skip-cert-verify: false/skip-cert-verify: true/' $tmpdir/proxy.yaml || \
|
||||
sed -i 's/skip-cert-verify: true/skip-cert-verify: false/' $tmpdir/proxy.yaml
|
||||
[ "$skip_cert" = "已开启" ] && sed -i 's/skip-cert-verify: false/skip-cert-verify: true/' $tmpdir/proxies.yaml || \
|
||||
sed -i 's/skip-cert-verify: true/skip-cert-verify: false/' $tmpdir/proxies.yaml
|
||||
#插入自定义策略组
|
||||
sed -i "/#自定义策略组开始/,/#自定义策略组结束/d" $tmpdir/proxy-groups.yaml
|
||||
[ -f $clashdir/proxy-groups.yaml ] && {
|
||||
#获取空格数
|
||||
space_name=$(grep -E '^ *- name: ' $tmpdir/proxy-groups.yaml | head -n 1 | grep -oE '^ *')
|
||||
space_proxy=$(grep -A 1 'proxies:$' $tmpdir/proxy-groups.yaml | grep -E '^ *- ' | head -n 1 | grep -oE '^ *')
|
||||
#合并自定义策略组到proxy-groups.yaml
|
||||
cat $clashdir/proxy-groups.yaml | sed "/^#/d" | sed '1i\ #自定义策略组开始' | sed '$a\ #自定义策略组结束' | sed "s/^ */${space_name} /g" | sed "s/^ *- /${space_proxy}- /g" | sed "s/^ *- name: /${space_name}- name: /g" > $tmpdir/proxy-groups_add.yaml
|
||||
cat $tmpdir/proxy-groups.yaml >> $tmpdir/proxy-groups_add.yaml
|
||||
mv -f $tmpdir/proxy-groups_add.yaml $tmpdir/proxy-groups.yaml
|
||||
oldIFS="$IFS"
|
||||
while read line;do #将自定义策略组插入现有的proxy-group
|
||||
new_group=$(echo $line | grep -Eo '^ *- name:.*#' | cut -d'#' -f1 | sed 's/.*name: //g')
|
||||
proxy_groups=$(echo $line | grep -Eo '#.*' | sed "s/#//" )
|
||||
IFS="#"
|
||||
for name in $proxy_groups; do
|
||||
line_a=$(grep -n "\- name: $name" $tmpdir/proxy-groups.yaml | awk -F: '{print $1}') #获取group行号
|
||||
line_b=$(grep -A 8 "\- name: $name" $tmpdir/proxy-groups.yaml | grep -n "proxies:$" | awk -F: '{print $1}') #获取proxies行号
|
||||
line_c=$((line_a + line_b - 1)) #计算需要插入的行号
|
||||
space=$(sed -n "$((line_c + 1))p" $tmpdir/proxy-groups.yaml | grep -oE '^ *') #获取空格数
|
||||
sed -i "${line_c}a\\${space}- ${new_group}#自定义策略组" $tmpdir/proxy-groups.yaml
|
||||
done
|
||||
IFS="$oldIFS"
|
||||
done <<< $(grep "\- name: " $clashdir/proxy-groups.yaml)
|
||||
}
|
||||
#插入自定义代理
|
||||
sed -i "/#自定义代理/d" $tmpdir/proxies.yaml
|
||||
[ -f $clashdir/proxies.yaml ] && {
|
||||
space_proxy=$(cat $tmpdir/proxies.yaml | grep -E '^ *- ' | head -n 1 | grep -oE '^ *') #获取空格数
|
||||
cat $clashdir/proxies.yaml | sed "s/^ *- /${space_proxy}- /g" | sed "/^#/d" | sed '$a\' | sed 's/#.*/ #自定义代理/g' >> $tmpdir/proxies.yaml #插入节点
|
||||
oldIFS="$IFS"
|
||||
while read line;do #将节点插入proxy-group
|
||||
proxy_name=$(echo $line | grep -Eo 'name: .+, ' | cut -d',' -f1 | sed 's/name: //g')
|
||||
proxy_groups=$(echo $line | grep -Eo '#.*' | sed "s/#//" )
|
||||
IFS="#"
|
||||
for name in $proxy_groups; do
|
||||
line_a=$(grep -n "\- name: $name" $tmpdir/proxy-groups.yaml | awk -F: '{print $1}') #获取group行号
|
||||
line_b=$(grep -A 8 "\- name: $name" $tmpdir/proxy-groups.yaml | grep -n "proxies:$" | awk -F: '{print $1}') #获取proxies行号
|
||||
line_c=$((line_a + line_b - 1)) #计算需要插入的行号
|
||||
space=$(sed -n "$((line_c + 1))p" $tmpdir/proxy-groups.yaml | grep -oE '^ *') #获取空格数
|
||||
sed -i "${line_c}a\\${space}- ${proxy_name}#自定义代理" $tmpdir/proxy-groups.yaml
|
||||
done
|
||||
IFS="$oldIFS"
|
||||
done <<< $(sed "/^#/d" $clashdir/proxies.yaml)
|
||||
}
|
||||
#节点绕过功能支持
|
||||
sed -i "/#节点绕过/d" $tmpdir/rule.yaml
|
||||
sed -i "/#节点绕过/d" $tmpdir/rules.yaml
|
||||
[ "$proxies_bypass" = "已启用" ] && {
|
||||
cat /tmp/clash_$USER/proxy.yaml | sed '/^proxy-/,$d' | sed '/^rule-/,$d' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '!a[$0]++' | sed 's/^/\ -\ IP-CIDR,/g' | sed 's|$|/32,DIRECT #节点绕过|g' >> $tmpdir/proxies_bypass
|
||||
cat /tmp/clash_$USER/proxy.yaml | sed '/^proxy-/,$d' | sed '/^rule-/,$d' | grep -vE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -oE '[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?'| awk '!a[$0]++' | sed 's/^/\ -\ DOMAIN,/g' | sed 's/$/,DIRECT #节点绕过/g' >> $tmpdir/proxies_bypass
|
||||
cat $tmpdir/rule.yaml >> $tmpdir/proxies_bypass
|
||||
mv -f $tmpdir/proxies_bypass $tmpdir/rule.yaml
|
||||
cat /tmp/clash_$USER/proxies.yaml | sed '/^proxy-/,$d' | sed '/^rule-/,$d' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '!a[$0]++' | sed 's/^/\ -\ IP-CIDR,/g' | sed 's|$|/32,DIRECT #节点绕过|g' >> $tmpdir/proxies_bypass
|
||||
cat /tmp/clash_$USER/proxies.yaml | sed '/^proxy-/,$d' | sed '/^rule-/,$d' | grep -vE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -oE '[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?'| awk '!a[$0]++' | sed 's/^/\ -\ DOMAIN,/g' | sed 's/$/,DIRECT #节点绕过/g' >> $tmpdir/proxies_bypass
|
||||
cat $tmpdir/rules.yaml >> $tmpdir/proxies_bypass
|
||||
mv -f $tmpdir/proxies_bypass $tmpdir/rules.yaml
|
||||
}
|
||||
#插入自定义规则
|
||||
sed -i "/#自定义规则/d" $tmpdir/rule.yaml
|
||||
sed -i "/#自定义规则/d" $tmpdir/rules.yaml
|
||||
[ -f $clashdir/rules.yaml ] && {
|
||||
cat $clashdir/rules.yaml | sed 's/^ *-/ -/g' | sed "/^#/d" | sed '$a\' | sed 's/$/ #自定义规则/g' > $tmpdir/rules.yaml
|
||||
cat $tmpdir/rule.yaml >> $tmpdir/rules.yaml
|
||||
mv -f $tmpdir/rules.yaml $tmpdir/rule.yaml
|
||||
cat $clashdir/rules.yaml | sed 's/^ *-/ -/g' | 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
|
||||
}
|
||||
#添加配置
|
||||
###################################
|
||||
@@ -411,46 +448,21 @@ EOF
|
||||
done < $sys_hosts
|
||||
fi
|
||||
#合并文件
|
||||
[ -f $clashdir/user.yaml ] && yaml_user=$clashdir/user.yaml
|
||||
[ -f $tmpdir/hosts.yaml ] && yaml_hosts=$tmpdir/hosts.yaml
|
||||
[ -f $tmpdir/proxy.yaml ] && yaml_proxy=$tmpdir/proxy.yaml
|
||||
[ -f $tmpdir/rule.yaml ] && yaml_rule=$tmpdir/rule.yaml
|
||||
cut -c 1- $tmpdir/set.yaml $yaml_hosts $yaml_user $yaml_proxy $yaml_rule > $tmpdir/config.yaml
|
||||
[ -s $clashdir/user.yaml ] && yaml_user=$clashdir/user.yaml
|
||||
for char in $yaml_char;do
|
||||
[ -s $tmpdir/${char}.yaml ] && {
|
||||
sed -i "1i\\${char}:" $tmpdir/${char}.yaml
|
||||
yaml_add="$yaml_add $tmpdir/${char}.yaml"
|
||||
}
|
||||
done
|
||||
cut -c 1- $tmpdir/set.yaml $yaml_hosts $yaml_user $yaml_add > $tmpdir/config.yaml
|
||||
#测试自定义配置文件
|
||||
$bindir/clash -t -d $bindir -f $tmpdir/config.yaml >/dev/null
|
||||
if [ "$?" != 0 ];then
|
||||
logger "$($bindir/clash -t -d $bindir -f $tmpdir/config.yaml | grep -Eo 'error.*=.*')" 31
|
||||
logger "自定义配置文件校验失败!将使用基础配置文件启动!" 33
|
||||
sed -i "/#自定义/d" $tmpdir/config.yaml
|
||||
fi
|
||||
#插入自定义代理
|
||||
sed -i "/#自定义代理/d" $tmpdir/config.yaml
|
||||
space=$(sed -n '/^proxies:/{n;p}' $tmpdir/config.yaml | grep -oE '^ *') #获取空格数
|
||||
if [ -f $clashdir/proxies.yaml ];then
|
||||
sed -i '/^$/d' $clashdir/proxies.yaml && echo >> $clashdir/proxies.yaml #处理换行
|
||||
while read line;do
|
||||
[ -z "$(echo "$line" | grep '^proxies:')" ] && \
|
||||
[ -z "$(echo "$line" | grep '#')" ] && \
|
||||
[ -n "$(echo "$line" | grep '\- ')" ] && \
|
||||
line=$(echo "$line" | sed 's#/#\\/#') && \
|
||||
sed -i "/^proxies:/a\\$space$line #自定义代理" $tmpdir/config.yaml
|
||||
done < $clashdir/proxies.yaml
|
||||
fi
|
||||
|
||||
#插入自定义策略组
|
||||
sed -i "/#自定义策略组/d" $tmpdir/config.yaml
|
||||
space=$(sed -n '/^proxy-groups:/{n;p}' $tmpdir/config.yaml | grep -oE '^ *') #获取原始配置空格数
|
||||
if [ -f $clashdir/proxy-groups.yaml ];then
|
||||
c_space=$(sed -n '/^proxy-groups:/{n;p}' $clashdir/proxy-groups.yaml | grep -oE '^ *') #获取自定义配置空格数
|
||||
[ -n "$c_space" ] && sed -i "s/$c_space/$space/g" $clashdir/proxy-groups.yaml && echo >> $clashdir/proxy-groups.yaml #处理缩进空格数
|
||||
sed -i '/^$/d' $clashdir/proxy-groups.yaml && echo >> $clashdir/proxy-groups.yaml #处理换行
|
||||
cat $clashdir/proxy-groups.yaml | awk '{array[NR]=$0} END { for(i=NR;i>0;i--){print array[i];} }' | while IFS= read line;do
|
||||
[ -z "$(echo "$line" | grep '^proxy-groups:')" ] && \
|
||||
[ -n "${line// /}" ] && \
|
||||
[ -z "$(echo "$line" | grep '#')" ] && \
|
||||
line=$(echo "$line" | sed 's#/#\\/#') && \
|
||||
sed -i "/^proxy-groups:/a\\$line #自定义策略组" $tmpdir/config.yaml
|
||||
done
|
||||
sed -i "/#自定义策略组开始/,/#自定义策略组结束/d" $tmpdir/config.yaml
|
||||
sed -i "/#自定义/d" $tmpdir/config.yaml
|
||||
fi
|
||||
#存档
|
||||
if [ "$clashdir" = "$bindir" ];then
|
||||
@@ -459,10 +471,10 @@ EOF
|
||||
elif [ "$tmpdir" != "$bindir" ];then
|
||||
mv -f $tmpdir/config.yaml $bindir/config.yaml
|
||||
fi
|
||||
rm -f $tmpdir/set.yaml
|
||||
rm -f $tmpdir/proxy.yaml
|
||||
rm -f $tmpdir/hosts.yaml
|
||||
rm -f $tmpdir/rule.yaml
|
||||
#清理缓存
|
||||
for char in $yaml_char set hosts;do
|
||||
rm -f $tmpdir/${char}.yaml
|
||||
done
|
||||
}
|
||||
#设置路由规则
|
||||
cn_ip_route(){
|
||||
|
||||
Reference in New Issue
Block a user