Merge pull request #1134 from sofia-riese/patch-4

fix(5_task): add double quote to prevent word splitting
This commit is contained in:
juewuy
2026-01-16 22:25:41 +08:00
committed by GitHub

View File

@@ -4,212 +4,224 @@
[ -n "$__IS_MODULE_5_TASK_LOADED" ] && return
__IS_MODULE_5_TASK_LOADED=1
#通用工具
# 通用工具
. "$CRASHDIR"/libs/set_config.sh
. "$CRASHDIR"/libs/set_cron.sh
#任务工具
set_cron(){
[ -z "$week" ] && week=*
[ -z "$hour" ] && hour=*
[ -z "$min" ] && min=0
echo "-----------------------------------------------"
echo -e "\033[33m$cron_time\033[0m执行任务:\033[36m$task_name\033[0m"
read -p "是否确认添加定时任务?(1/0) > " res
if [ "$res" = '1' ]; then
task_txt="$min $hour * * $week $CRASHDIR/task/task.sh $task_id $cron_time$task_name"
cronset "$cron_time$task_name" "$task_txt"
echo -e "任务【$cron_time$task_name】\033[32m已添加\033[0m"
fi
unset week hour min
sleep 1
}
set_service(){
# 参数1代表要任务类型,参数2代表任务ID,参数3代表任务描述,参数4代表running任务cron时间
task_file="$CRASHDIR"/task/$1
[ -s "$task_file" ] && sed -i "/$3/d" "$task_file"
#运行时每分钟执行的任务特殊处理
if [ "$1" = "running" ];then
task_txt="$4 $CRASHDIR/task/task.sh $2 $3"
echo "$task_txt" >> "$task_file"
[ -n "$(pidof CrashCore)" ] && cronset "$3" "$task_txt"
else
echo "$CRASHDIR/task/task.sh $2 $3" >> "$task_file"
fi
echo -e "任务【$3】\033[32m添加成功\033[0m"
sleep 1
}
#任务界面
task_user_add(){ #自定义命令添加
echo "-----------------------------------------------"
echo -e "\033[33m命令可包含空格请确保命令可执行\033[0m"
echo -e "\033[36m此处不要添加执行条件请在添加完成后返回添加具体执行条件\033[0m"
echo -e "也可以手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m添加"
read -p "请输入命令语句 > " script
if [ -n "$script" ];then
task_command=$script
echo -e "请检查输入:\033[32m$task_command\033[0m"
#获取本任务ID
task_max_id=$(awk -F '#' '{print $1}' "$CRASHDIR"/task/task.user 2>/dev/null | sort -n | tail -n 1)
[ -z "$task_max_id" ] && task_max_id=200
task_id=$((task_max_id + 1))
read -p "请输入任务备注 > " txt
[ -n "$txt" ] && task_name=$txt || task_name=自定义任务$task_id
echo "$task_id#$task_command#$task_name" >> "$CRASHDIR"/task/task.user
echo -e "\033[32m自定义任务已添加\033[0m"
sleep 1
else
echo -e "\033[31m输入错误请重新输入\033[0m"
sleep 1
fi
}
task_user_del(){ #自定义命令删除
echo "-----------------------------------------------"
echo -e "请输入对应ID移除对应自定义任务(不会影响内置任务)"
echo -e "也可以手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m"
echo "-----------------------------------------------"
cat "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^#' | awk -F '#' '{print $1" "$3}'
echo "-----------------------------------------------"
echo "0 返回上级菜单"
echo "-----------------------------------------------"
read -p "请输入对应数字 > " num
if [ -n "$num" ];then
sed -i "/^$num#/d" "$CRASHDIR"/task/task.user 2>/dev/null
[ "$num" != 0 ] && task_user_del
else
echo -e "\033[31m输入错误请重新输入\033[0m"
sleep 1
fi
}
task_add(){ #任务添加
echo "-----------------------------------------------"
echo -e "\033[36m请选择需要添加的任务\033[0m"
echo "-----------------------------------------------"
#输出任务列表
cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print " "NR" "$3}'
echo "-----------------------------------------------"
echo -e " 0 返回上级菜单"
read -p "请输入对应数字 > " num
case "$num" in
0)
;;
[1-9]|[1-9][0-9])
if [ "$num" -le "$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | wc -l)" ];then
task_id=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $1}')
task_name=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $3}')
task_type
else
errornum
fi
;;
*)
errornum
;;
esac
}
task_del(){ #任务删除
#删除定时任务
croncmd -l > "$TMPDIR"/cron
sed -i "/$1/d" "$TMPDIR"/cron && croncmd "$TMPDIR"/cron
rm -f "$TMPDIR"/cron
#删除条件任务
sed -i "/$1/d" "$CRASHDIR"/task/cron 2>/dev/null
sed -i "/$1/d" "$CRASHDIR"/task/bfstart 2>/dev/null
sed -i "/$1/d" "$CRASHDIR"/task/afstart 2>/dev/null
sed -i "/$1/d" "$CRASHDIR"/task/running 2>/dev/null
sed -i "/$1/d" "$CRASHDIR"/task/affirewall 2>/dev/null
}
task_type(){ #任务条件选择菜单
echo "-----------------------------------------------"
echo -e "请选择任务\033[36m【$task_name】\033[0m执行条件"
echo "-----------------------------------------------"
echo -e " 1 定时任务\033[32m每周执行\033[0m"
echo -e " 2 定时任务\033[32m每日执行\033[0m"
echo -e " 3 定时任务\033[32m每小时执行\033[0m"
echo -e " 4 定时任务\033[32m每分钟执行\033[0m"
echo "-----------------------------------------------"
echo -e "\033[31m注意\033[0m逻辑水平不及格的请勿使用下方触发条件"
echo "-----------------------------------------------"
echo -e " 5 服务\033[33m启动前执行\033[0m"
echo -e " 6 服务\033[33m启动后执行\033[0m"
echo -e " 7 服务\033[33m运行时每分钟执行\033[0m"
echo -e " 8 防火墙服务\033[33m重启后执行\033[0m"
echo "-----------------------------------------------"
echo -e " 0 返回上级菜单"
read -p "请输入对应数字 > " num
case "$num" in
0)
return 1
;;
1)
echo "-----------------------------------------------"
echo -e " 输入 1-7 对应\033[33m每周的指定某天\033[0m运行(7=周日)"
echo -e " 输入 1,4,0 代表\033[36m每周一、周四、周日\033[0m运行"
echo -e " 输入 1-5 代表\033[36m周一至周五\033[0m运行"
read -p "在每周哪天执行? > " week
week=`echo ${week/7/0}` #把7换成0
echo "-----------------------------------------------"
read -p "想在该日的具体哪个小时执行0-23 > " hour
cron_time="在每周$week的$hour点整"
cron_time=`echo ${cron_time/周0/周日}` #把0换成日
[ -n "$week" ] && [ -n "$hour" ] && set_cron
;;
2)
echo "-----------------------------------------------"
echo -e " 输入 1,7,15 代表\033[36m每到1,7,15点\033[0m运行"
echo -e " 输入 6-18 代表\033[36m早6点至晚18点间每小时\033[0m运行"
read -p "想在每日的具体哪个小时执行0-23 > " hour
echo "-----------------------------------------------"
read -p "想在具体哪分钟执行0-59的整数 > " min
cron_time="在每日的$hour点$min分"
[ -n "$min" ] && [ -n "$hour" ] && set_cron
;;
3)
echo "-----------------------------------------------"
read -p "想每隔多少小时执行一次1-23的整数 > " num
hour="*/$num"
cron_time="每隔$num小时"
[ -n "$hour" ] && set_cron
;;
4)
echo "-----------------------------------------------"
read -p "想每隔多少分钟执行一次1-59的整数 > " num
min="*/$num"
cron_time="每隔$num分钟"
[ -n "$min" ] && set_cron
;;
5)
set_service bfstart "$task_id" "服务启动前$task_name"
;;
6)
set_service afstart "$task_id" "服务启动后$task_name"
;;
7)
echo "-----------------------------------------------"
echo -e " 输入10即每隔10分钟运行一次1440即每隔24小时运行一次"
echo -e " 大于60分钟的数值将按小时取整,且按当前时区记时"
read -p "想每隔多少分钟执行一次1-1440的整数 > " num
if [ "$num" -lt 60 ];then
min="$num"
cron_time="*/$min * * * *"
time_des="$min分钟"
else
hour="$((num / 60))"
cron_time="0 */$hour * * *"
time_des="$hour小时"
fi
[ -n "$cron_time" ] && set_service running "$task_id" "运行时每$time_des$task_name" "$cron_time"
;;
8)
echo -e "该功能会将相关启动代码注入到/etc/init.d/firewall中"
read -p "是否继续?(1/0) > " res
[ "$res" = 1 ] && set_service affirewall "$task_id" "防火墙重启后$task_name"
;;
*)
errornum
return 1
;;
esac
# 任务工具
set_cron() {
[ -z "$week" ] && week=*
[ -z "$hour" ] && hour=*
[ -z "$min" ] && min=0
echo "-----------------------------------------------"
echo -e "\033[33m$cron_time\033[0m执行任务:\033[36m$task_name\033[0m"
read -p "是否确认添加定时任务?(1/0) > " res
if [ "$res" = '1' ]; then
task_txt="$min $hour * * $week $CRASHDIR/task/task.sh $task_id $cron_time$task_name"
cronset "$cron_time$task_name" "$task_txt"
echo -e "任务【$cron_time$task_name】\033[32m已添加\033[0m"
fi
unset week hour min
sleep 1
}
set_service() {
# 参数1代表要任务类型,参数2代表任务ID,参数3代表任务描述,参数4代表running任务cron时间
task_file="$CRASHDIR"/task/$1
[ -s "$task_file" ] && sed -i "/$3/d" "$task_file"
# 运行时每分钟执行的任务特殊处理
if [ "$1" = "running" ]; then
task_txt="$4 $CRASHDIR/task/task.sh $2 $3"
echo "$task_txt" >>"$task_file"
[ -n "$(pidof CrashCore)" ] && cronset "$3" "$task_txt"
else
echo "$CRASHDIR/task/task.sh $2 $3" >>"$task_file"
fi
echo -e "任务【$3】\033[32m添加成功\033[0m"
sleep 1
}
# 任务界面
#
# 自定义命令添加
task_user_add() {
echo "-----------------------------------------------"
echo -e "\033[33m命令可包含空格请确保命令可执行\033[0m"
echo -e "\033[36m此处不要添加执行条件请在添加完成后返回添加具体执行条件\033[0m"
echo -e "也可以手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m添加"
read -p "请输入命令语句 > " script
if [ -n "$script" ]; then
task_command=$script
echo -e "请检查输入:\033[32m$task_command\033[0m"
#获取本任务ID
task_max_id=$(awk -F '#' '{print $1}' "$CRASHDIR"/task/task.user 2>/dev/null | sort -n | tail -n 1)
[ -z "$task_max_id" ] && task_max_id=200
task_id=$((task_max_id + 1))
read -p "请输入任务备注 > " txt
[ -n "$txt" ] && task_name=$txt || task_name=自定义任务$task_id
echo "$task_id#$task_command#$task_name" >>"$CRASHDIR"/task/task.user
echo -e "\033[32m自定义任务已添加\033[0m"
sleep 1
else
echo -e "\033[31m输入错误请重新输入\033[0m"
sleep 1
fi
}
# 自定义命令删除
task_user_del() {
echo "-----------------------------------------------"
echo -e "请输入对应ID移除对应自定义任务(不会影响内置任务)"
echo -e "也可以手动编辑\033[32m${CRASHDIR}/task/task.user\033[0m"
echo "-----------------------------------------------"
cat "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^#' | awk -F '#' '{print $1" "$3}'
echo "-----------------------------------------------"
echo "0 返回上级菜单"
echo "-----------------------------------------------"
read -p "请输入对应数字 > " num
if [ -n "$num" ]; then
sed -i "/^$num#/d" "$CRASHDIR"/task/task.user 2>/dev/null
[ "$num" != 0 ] && task_user_del
else
echo -e "\033[31m输入错误请重新输入\033[0m"
sleep 1
fi
}
# 任务添加
task_add() {
echo "-----------------------------------------------"
echo -e "\033[36m请选择需要添加的任务\033[0m"
echo "-----------------------------------------------"
# 输出任务列表
cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print " "NR" "$3}'
echo "-----------------------------------------------"
echo -e " 0 返回上级菜单"
read -p "请输入对应数字 > " num
case "$num" in
0) ;;
[1-9] | [1-9][0-9])
if [ "$num" -le "$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | wc -l)" ]; then
task_id=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $1}')
task_name=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $3}')
task_type
else
errornum
fi
;;
*)
errornum
;;
esac
}
# 任务删除
task_del() {
# 删除定时任务
croncmd -l >"$TMPDIR"/cron
sed -i "/$1/d" "$TMPDIR"/cron && croncmd "$TMPDIR"/cron
rm -f "$TMPDIR"/cron
# 删除条件任务
sed -i "/$1/d" "$CRASHDIR"/task/cron 2>/dev/null
sed -i "/$1/d" "$CRASHDIR"/task/bfstart 2>/dev/null
sed -i "/$1/d" "$CRASHDIR"/task/afstart 2>/dev/null
sed -i "/$1/d" "$CRASHDIR"/task/running 2>/dev/null
sed -i "/$1/d" "$CRASHDIR"/task/affirewall 2>/dev/null
}
# 任务条件选择菜单
task_type() {
echo "-----------------------------------------------"
echo -e "请选择任务\033[36m【$task_name】\033[0m执行条件"
echo "-----------------------------------------------"
echo -e " 1 定时任务\033[32m每周执行\033[0m"
echo -e " 2 定时任务\033[32m每日执行\033[0m"
echo -e " 3 定时任务\033[32m每小时执行\033[0m"
echo -e " 4 定时任务\033[32m每分钟执行\033[0m"
echo "-----------------------------------------------"
echo -e "\033[31m注意\033[0m逻辑水平不及格的请勿使用下方触发条件"
echo "-----------------------------------------------"
echo -e " 5 服务\033[33m启动前执行\033[0m"
echo -e " 6 服务\033[33m启动后执行\033[0m"
echo -e " 7 服务\033[33m运行时每分钟执行\033[0m"
echo -e " 8 防火墙服务\033[33m重启后执行\033[0m"
echo "-----------------------------------------------"
echo -e " 0 返回上级菜单"
read -p "请输入对应数字 > " num
case "$num" in
0)
return 1
;;
1)
echo "-----------------------------------------------"
echo -e " 输入 1-7 对应\033[33m每周的指定某天\033[0m运行(7=周日)"
echo -e " 输入 1,4,0 代表\033[36m每周一、周四、周日\033[0m运行"
echo -e " 输入 1-5 代表\033[36m周一至周五\033[0m运行"
read -p "在每周哪天执行? > " week
week=`echo ${week/7/0}` # 把7换成0
echo "-----------------------------------------------"
read -p "想在该日的具体哪个小时执行0-23 > " hour
cron_time="在每周$week的$hour点整"
cron_time=`echo ${cron_time/周0/周日}` # 把0换成日
[ -n "$week" ] && [ -n "$hour" ] && set_cron
;;
2)
echo "-----------------------------------------------"
echo -e " 输入 1,7,15 代表\033[36m每到1,7,15点\033[0m运行"
echo -e " 输入 6-18 代表\033[36m早6点至晚18点间每小时\033[0m运行"
read -p "想在每日的具体哪个小时执行0-23 > " hour
echo "-----------------------------------------------"
read -p "想在具体哪分钟执行0-59的整数 > " min
cron_time="在每日的$hour点$min分"
[ -n "$min" ] && [ -n "$hour" ] && set_cron
;;
3)
echo "-----------------------------------------------"
read -p "想每隔多少小时执行一次1-23的整数 > " num
hour="*/$num"
cron_time="每隔$num小时"
[ -n "$hour" ] && set_cron
;;
4)
echo "-----------------------------------------------"
read -p "想每隔多少分钟执行一次1-59的整数 > " num
min="*/$num"
cron_time="每隔$num分钟"
[ -n "$min" ] && set_cron
;;
5)
set_service bfstart "$task_id" "服务启动前$task_name"
;;
6)
set_service afstart "$task_id" "服务启动后$task_name"
;;
7)
echo "-----------------------------------------------"
echo -e " 输入10即每隔10分钟运行一次1440即每隔24小时运行一次"
echo -e " 大于60分钟的数值将按小时取整,且按当前时区记时"
read -p "想每隔多少分钟执行一次1-1440的整数 > " num
if [ "$num" -lt 60 ]; then
min="$num"
cron_time="*/$min * * * *"
time_des="$min分钟"
else
hour="$((num / 60))"
cron_time="0 */$hour * * *"
time_des="$hour小时"
fi
[ -n "$cron_time" ] && set_service running "$task_id" "运行时每$time_des$task_name" "$cron_time"
;;
8)
echo -e "该功能会将相关启动代码注入到/etc/init.d/firewall中"
read -p "是否继续?(1/0) > " res
[ "$res" = 1 ] && set_service affirewall "$task_id" "防火墙重启后$task_name"
;;
*)
errornum
return 1
;;
esac
}
# 任务管理列表
@@ -255,12 +267,12 @@ task_manager() {
;;
[1-9] | [1-9][0-9])
task_txt=$(sed -n "$num p" "$TMPDIR"/task_list)
task_id=$(echo $task_txt | awk '{print $1}')
task_id=$(echo "$task_txt" | awk '{print $1}')
if [ "$task_id" = 0 ]; then
read -p "旧版任务不支持管理,是否移除?(1/0) > " res
[ "$res" = 1 ] && {
cronname=$(echo "$task_txt" | awk -F '-' '{print $2}')
croncmd -l >"$TMPDIR"/conf && sed -i "/$cronname/d" "$TMPDIR"/conf && croncmd $TMPDIR/conf
croncmd -l >"$TMPDIR"/conf && sed -i "/$cronname/d" "$TMPDIR"/conf && croncmd "$TMPDIR"/conf
sed -i "/$cronname/d" $clashdir/tools/cron 2>/dev/null
rm -f "$TMPDIR"/conf
}
@@ -319,27 +331,28 @@ task_manager() {
done
}
task_recom(){ #任务推荐
echo "-----------------------------------------------"
echo -e "\033[32m启用推荐的自动任务配置这包括\033[0m"
echo "-----------------------------------------------"
echo -e "每隔10分钟自动保存面板配置"
echo -e "服务启动后自动同步ntp时间"
echo -e "在每日的3点0分重启服务"
echo "-----------------------------------------------"
read -p "是否启用?(1/0) > " res
[ "$res" = 1 ] && {
set_service running "106" "运行时每10分钟自动保存面板配置" "*/10 * * * *"
set_service afstart "107" "服务启动后自动同步ntp时间"
cronset "在每日的3点0分重启服务" "0 3 * * * ${CRASHDIR}/task/task.sh 103 在每日的3点0分重启服务" && \
echo -e "任务【在每日的3点0分重启服务】\033[32m添加成功\033[0m"
}
# 任务推荐
task_recom() {
echo "-----------------------------------------------"
echo -e "\033[32m启用推荐的自动任务配置这包括\033[0m"
echo "-----------------------------------------------"
echo -e "每隔10分钟自动保存面板配置"
echo -e "服务启动后自动同步ntp时间"
echo -e "在每日的3点0分重启服务"
echo "-----------------------------------------------"
read -p "是否启用?(1/0) > " res
[ "$res" = 1 ] && {
set_service running "106" "运行时每10分钟自动保存面板配置" "*/10 * * * *"
set_service afstart "107" "服务启动后自动同步ntp时间"
cronset "在每日的3点0分重启服务" "0 3 * * * ${CRASHDIR}/task/task.sh 103 在每日的3点0分重启服务" &&
echo -e "任务【在每日的3点0分重启服务】\033[32m添加成功\033[0m"
}
}
# 任务菜单
task_menu() {
while true; do
#检测并创建自定义任务文件
# 检测并创建自定义任务文件
[ -f "$CRASHDIR"/task/task.user ] || echo '#任务ID(必须>200并顺序排列)#任务命令#任务说明(#号隔开,任务命令和说明中都不允许包含#号)' >"$CRASHDIR"/task/task.user
echo "-----------------------------------------------"
echo -e "\033[30;47m欢迎使用自动任务功能\033[0m"