小编Max*_*Max的帖子

shell脚本中的安全rm -rf函数

这个问题类似于在*nix中清空目录最安全的方法什么?

我正在编写bash脚本,它定义了几个路径常量,并将它们用于文件和目录操作(复制,重命名和删除).通常有必要做以下事情:

rm -rf "/${PATH1}"
rm -rf "${PATH2}/"*
Run Code Online (Sandbox Code Playgroud)

在开发这个脚本的过程中,我想保护自己免受类似PATH1和PATH2等名称的错误输入,并避免将它们扩展为空字符串,从而导致擦除整个磁盘.我决定创建特殊的包装器:

rmrf() {
    if [[ $1 =~ "regex" ]]; then
        echo "Ignoring possibly unsafe path ${1}"
        exit 1
    fi

    shopt -s dotglob
    rm -rf -- $1
    shopt -u dotglob
}
Run Code Online (Sandbox Code Playgroud)

这将被称为:

rmrf "/${PATH1}"
rmrf "${PATH2}/"*
Run Code Online (Sandbox Code Playgroud)

正则表达式(或sed表达式)应该捕获像"*","/*","/**/","///*"等路径,但允许路径,如"dir","/ dir","/ dir1/dir2 /","/ dir1/dir2/*".另外我不知道如何在"/ dir with space/*"的情况下启用shell globbing.有任何想法吗?

编辑:这是我到目前为止提出的:

rmrf() {
    local RES
    local RMPATH="${1}"
    SAFE=$(echo "${RMPATH}" | sed -r 's:^((\.?\*+/+)+.*|(/+\.?\*+)+.*|[\.\*/]+|.*/\.\*+)$::g')
    if [ -z "${SAFE}" ]; then
        echo "ERROR! Unsafe deletion of ${RMPATH}" …
Run Code Online (Sandbox Code Playgroud)

regex bash sed

7
推荐指数
3
解决办法
8326
查看次数

标签 统计

bash ×1

regex ×1

sed ×1