如何修复带参数删除文件夹的Shell脚本以防范用户误操作删除风险
解决方案
核心思路是先对路径做标准化解析,校验目标路径必须为脚本所在目录的子目录,校验通过后再执行删除操作,示例实现如下:
#!/bin/bash # 获取脚本所在目录的绝对路径,自动解析软链接、相对路径 SCRIPT_DIR=$(realpath "$(dirname "${BASH_SOURCE[0]}")") # 入参非空校验 if [ $# -ne 1 ] || [ -z "$1" ]; then echo "错误:请传入要删除的子目录名称,仅允许删除脚本目录下的内容" exit 1 fi # 解析用户输入的路径得到标准化绝对路径 TARGET_DIR=$(realpath -m -- "${SCRIPT_DIR}/${1}") # 路径合法性校验:必须是脚本目录的子目录,且不能等于脚本根目录 if [[ "${TARGET_DIR}" != "${SCRIPT_DIR}"/* ]] || [[ "${TARGET_DIR}" == "${SCRIPT_DIR}" ]]; then echo "错误:禁止删除脚本目录层级以上的内容,也不允许直接删除脚本根目录" exit 1 fi # 可选:新增目标目录存在性校验 # if [ ! -d "${TARGET_DIR}" ]; then # echo "错误:目标目录 ${TARGET_DIR} 不存在" # exit 1 # fi # 校验通过执行删除 rm -rf -- "${TARGET_DIR}"/*
关键说明
- 用
realpath对所有路径做标准化处理,自动消除..、.、多余斜杠、软链接等带来的路径歧义,从根源避免路径穿越问题 - 前缀匹配规则严格限制删除范围,哪怕传入
/、../..等非法路径都会直接拦截 - 所有变量用双引号包裹、命令添加
--前缀,兼容带空格、特殊字符、以-开头的路径 - 如果运行环境没有
realpath,可直接替换为readlink -f,逻辑完全兼容
内容的提问来源于stack exchange,提问作者Nir
相关产品推荐
相关产品推荐

