作为一名运维工程师,你最害怕的命令是什么?没错,就是那个传说中的rm -rf /*!今天我要教你几招防护大法,让你的系统对这类"删库跑路"操作彻底免疫!
认识"核弹级"命令:rm -rf /*
这个命令堪称Linux界的"末日武器":
- rm:删除文件
- -r:递归删除(连目录也不放过)
- -f:强制执行(不问你是否确定)
- /*:从根目录开始(全盘清除)
执行后果:系统文件、配置文件、数据库、日志...全部灰飞烟灭!你的职业生涯可能也会跟着一起消失...
# 千万不要尝试!这里只是展示命令结构
rm -rf /*
三级防护体系
(1) 第一层防护:alias防护盾
# 在~/.bashrc中添加
alias rm='rm -i' # 每次删除都要求确认
效果:即使输入rm -rf /*,系统也会对每个文件询问确认,给你足够的时间按下Ctrl+C!
(2) 第二层防护:函数防护墙
# 在~/.bashrc中添加智能防护函数
function rm() {
# 危险模式检测
if [[ $* =~ "-rf /" || $* =~ "-rf /" ]]; then
echo -e "\033[1;31m?? 警报!检测到核弹级删除操作!\033[0m"
echo -e "\033[1;33m?? 你确定要毁掉自己的职业生涯吗?\033[0m"
echo -e "\033[1;36m?? 建议:\033[0m"
echo "1. 先喝杯咖啡冷静一下"
echo "2. 检查命令是否正确"
echo "3. 考虑使用trash-cli代替rm"
return 1
fi
/bin/rm -i "$@"
}
效果:检测到危险操作时直接阻止,并给出人性化提示!
(3) 第三层防护:物理删除限制
# 使用chattr给关键目录上锁
sudo chattr +i /bin /sbin /usr /etc
效果:即使超级用户也无法直接删除系统关键目录!
进阶防护方案
(1) 方案一:使用safe-rm替代
# 安装safe-rm
sudo apt install safe-rm # Debian/Ubuntu
sudo yum install safe-rm # CentOS/RHEL
# 配置保护目录
echo "/" >> /etc/safe-rm.conf
(2) 方案二:带回收站功能的rm替代脚本
该脚本拥有以下基本功能:
- 拦截危险操作(如rm -rf /)
- 将删除的文件移动到回收站(~/.trash)
- 自动清理7天前的回收站文件
- 保留原始rm的基本功能
# 在~/.bashrc中添加以下内容
# 设置回收站目录
TRASH_DIR="${HOME}/.trash"
mkdir -p "${TRASH_DIR}"
# 智能删除函数
function rm() {
# 危险操作检测
if [[ $* =~ "-rf /" || $* =~ "-rf /" ]]; then
echo -e "\033[1;31m?? 警报!检测到核弹级删除操作!\033[0m"
echo -e "\033[1;33m?? 你确定要毁掉自己的职业生涯吗?\033[0m"
echo -e "\033[1;36m?? 建议:\033[0m"
echo "1. 先喝杯咖啡冷静一下"
echo "2. 检查命令是否正确"
echo "3. 考虑使用trash-cli代替rm"
return 1
fi
# 普通删除操作 - 移到回收站
local timestamp=$(date +%Y%m%d%H%M%S)
local trash_dest="${TRASH_DIR}/${timestamp}"
mkdir -p "${trash_dest}"
# 处理每个参数
for arg in "$@"; do
# 跳过选项参数
if [[ "${arg}" == -* ]]; then
continue
fi
# 检查文件/目录是否存在
if [ -e "${arg}" ]; then
# 获取绝对路径
local item_path=$(realpath "${arg}")
# 防止把回收站自己移入回收站
if [[ "${item_path}" != "${TRASH_DIR}"* ]]; then
# 移动文件到带时间戳的回收站目录
mv "${item_path}" "${trash_dest}/"
echo "已移动 '${item_path}' 到回收站: ${trash_dest}/"
fi
fi
done
}
# 查看回收站内容
function trash-list() {
echo -e "\033[1;36m??? 回收站内容:\033[0m"
tree -aC "${TRASH_DIR}"
}
# 清空回收站
function trash-empty() {
echo -e "\033[1;31m?? 即将清空回收站...\033[0m"
read -p "确认要永久删除所有回收站内容吗?(y/N) " confirm
if [[ "${confirm}" =~ ^[Yy]$ ]]; then
/bin/rm -rf "${TRASH_DIR}"/*
echo -e "\033[1;32m回收站已清空\033[0m"
else
echo -e "\033[1;33m操作已取消\033[0m"
fi
}
# 恢复回收站文件
function trash-restore() {
if [ -z "$1" ]; then
echo "用法: trash-restore <时间戳>/<文件名>"
echo "示例: trash-restore 20230801120000/important_file.txt"
return 1
fi
local source_path="${TRASH_DIR}/$1"
local dest_path="./$(basename "$1")"
if [ -e "${source_path}" ]; then
mv -i "${source_path}" "${dest_path}"
echo -e "\033[1;32m已恢复: ${source_path} -> ${dest_path}\033[0m"
else
echo -e "\033[1;31m错误: 未找到 ${source_path}\033[0m"
return 1
fi
}
使用示例:
# 安全删除文件
root@node2:~# rm important.txt
已移动 '/root/important.txt' 到回收站: /root/.trash/20250729073654/
# 查看回收站
root@node2:~# trash-list
?? 回收站内容:
/root/.trash
|-- 20250729065134
| `-- 1.txt
`-- 20250729073654
`-- important.txt
3 directories, 2 files
# 恢复文件
root@node2:~# trash-restore 20250729073654/important.txt
已恢复: /root/.trash/20250729073654/important.txt -> ./important.txt
# 清空回收站
root@node2:~# trash-empty
? 即将清空回收站...
确认要永久删除所有回收站内容吗?(y/N) y
回收站已清空
root@node2:~# trash-list
?? 回收站内容:
/root/.trash
0 directories, 0 files