当前位置:首页 > Linux > 正文内容

Linux中避免rm -rf 误删操作

Yusoon6个月前 (04-14)Linux173

一、先清理旧方案(如果之前建过 profile.d 的脚本)

# 如果之前建过就删,没建过执行也无害
/bin/rm -f /etc/profile.d/safe_rm.sh

# 清掉当前 shell 里可能残留的 alias / hash
unalias rm 2>/dev/null
hash -r

二、创建方案 C 的 rm 包装脚本

cat > /usr/local/bin/rm <<'EOF'
#!/bin/bash
# 安全 rm 包装:只拦截真正危险的删除操作
# 保留:rm /tmp/xxx、rm /var/log/*.log 等正常绝对路径操作
# 拦截:rm -rf /、rm -rf /*、rm -rf /.*、--no-preserve-root 等

for p in "$@"; do
    # 跳过选项参数(-f, -r, -rf, --preserve-root 等)
    [[ "$p" == -* ]] && continue

    # 1) 根目录本身
    if [[ "$p" == "/" ]]; then
        echo -e "\033[31m[安全拦截] 禁止删除根目录:$p\033[0m" >&2
        exit 1
    fi

    # 2) 根目录下的通配删除,如 /*  /.*  /[a-z]*
    #    特征:以 / 开头,剩余部分不含 / 但含 * 或 ? 或 [
    if [[ "$p" =~ ^/[^/]*[*?\[] ]]; then
        echo -e "\033[31m[安全拦截] 禁止删除根目录通配:$p\033[0m" >&2
        exit 1
    fi
done

# 3) 禁止 --no-preserve-root(rm -rf / 的经典危险写法)
for a in "$@"; do
    if [[ "$a" == "--no-preserve-root" ]]; then
        echo -e "\033[31m[安全拦截] 禁止使用 --no-preserve-root\033[0m" >&2
        exit 1
    fi
done

exec /bin/rm "$@"
EOF

chmod +x /usr/local/bin/rm

三、让当前 shell 立即识别新脚本

hash -r
type rm

期望输出:

rm is /usr/local/bin/rm

四、验证

# 应被拦截
rm -rf /
rm -rf /*
rm -rf /.*
rm -rf --no-preserve-root /

# 应正常执行
mkdir -p /tmp/safetest && touch /tmp/safetest/a.txt
rm -rf /tmp/safetest
rm -f /var/log/dmesg.old 2>/dev/null   # 若存在则删,正常

被拦截时你会看到红色提示,比如:

[安全拦截] 禁止删除根目录:/

五、确认 PATH 顺序(关键)

echo $PATH

你的输出是:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

/usr/local/bin 排在 /usr/bin 前面 ✅,脚本会被优先调用,无需再改 PATH。

六、最终状态检查清单

# 1. 无 alias 干扰
alias | grep rm          # 应无输出

# 2. rm 指向新脚本
type rm                  # 应为 /usr/local/bin/rm

# 3. 脚本存在且可执行
ls -l /usr/local/bin/rm  # 应有 x 权限

# 4. 旧脚本已删
ls /etc/profile.d/safe_rm.sh  # 应显示 No such file

全部符合就完成了。

七、回滚(万一需要)

/bin/rm -f /usr/local/bin/rm
hash -r

扫描二维码推送至手机访问。

版权声明:本文由Yusoon - ZBlog发布,如需转载请注明出处。

本文链接:https://blog.bee1001.com/?id=42

分享给朋友:

“Linux中避免rm -rf 误删操作” 的相关文章

Linux上安装rz、sz

Linux上安装rz、sz

一、rz、sz命令rz、sz是用来在windows和Linux上互转文件的一个命令。 lrzsz 官网 原查看文 二、安装2.1 yum安装yum -y install lrzsz2.2 源码安装wget http://www.ohse.de/uwe/releases/lrzsz-0.12.2...

Linux 系统 /var/log/journal/ 垃圾日志清理

systemd-journald是一个改进型日志管理服务,可以收集来自内核、系统早期启动阶段的日志、系统守护进程在启动和运行中的标准输出和错误信息,还有syslog的日志。 systemd-journal日志服务仅仅把日志集中保存在单一结构的日志文件/run/log中,由于日志是经历过压缩和格式化...

Linux中vim中进行替换/批量替换

˂a name="一:在 Vim 中进行文本替换的操作是通过使用 :s(substitute)命令来实现的。这里是一些基本的替换命令" class="reference-link" href="#"˃一:在 Vim 中进行文本替换的操作是通过使用 :s(substitute)命令来实现的。这里是一些...

Linux安装safe-rm防止误删文件或目录

在Linux系统中安装safe-rm工具可以有效地防止误删除重要文件或目录。以下是安装safe-rm的步骤: 1、下载safe-rm:使用wget命令从官方网站下载safe-rm的压缩包。例如,下载0.12版本的命令为: wget https://launchpad.net/safe-rm/tr...

CentOS上安装FirewallD

安装FirewallD:如果你的系统上还没有安装FirewallD,你可以使用以下命令来安装它: bash sudo yum install firewalld -y启动FirewallD服务:使用以下命令来启动FirewallD服务: bash sudo systemctl start f...

用acme.sh自动签发由阿里云托管域名的泛域名证书

步骤 1:安装 acme.sh(官方一键脚本)# 安装 curl https://get.acme.sh | sh -s email=你的邮箱@example.com # 让当前 shell 立即识别命令 source ~/.bashrc安装完成后,acme.sh 位于 ~/.acme.s...