終極防護:讓你的 Linux 系統(tǒng)對 "rm -rf /*" 免疫!
作為一名運維工程師,你最害怕的命令是什么?沒錯,就是那個傳說中的rm -rf /*!今天我要教你幾招防護大法,讓你的系統(tǒng)對這類"刪庫跑路"操作徹底免疫!

認識"核彈級"命令:rm -rf /*
這個命令堪稱Linux界的"末日武器":
- rm:刪除文件
- -r:遞歸刪除(連目錄也不放過)
- -f:強制執(zhí)行(不問你是否確定)
- /*:從根目錄開始(全盤清除)
執(zhí)行后果:系統(tǒng)文件、配置文件、數(shù)據(jù)庫、日志...全部灰飛煙滅!你的職業(yè)生涯可能也會跟著一起消失...
# 千萬不要嘗試!這里只是展示命令結(jié)構(gòu)
rm -rf /*三級防護體系
(1) 第一層防護:alias防護盾
# 在~/.bashrc中添加
alias rm='rm -i' # 每次刪除都要求確認效果:即使輸入rm -rf /*,系統(tǒng)也會對每個文件詢問確認,給你足夠的時間按下Ctrl+C!
(2) 第二層防護:函數(shù)防護墻
# 在~/.bashrc中添加智能防護函數(shù)
function rm() {
# 危險模式檢測
if [[ $* =~ "-rf /" || $* =~ "-rf /" ]]; then
echo -e "\033[1;31m?? 警報!檢測到核彈級刪除操作!\033[0m"
echo -e "\033[1;33m?? 你確定要毀掉自己的職業(yè)生涯嗎?\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給關(guān)鍵目錄上鎖
sudo chattr +i /bin /sbin /usr /etc效果:即使超級用戶也無法直接刪除系統(tǒng)關(guān)鍵目錄!
進階防護方案
(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中添加以下內(nèi)容
# 設(shè)置回收站目錄
TRASH_DIR="${HOME}/.trash"
mkdir -p "${TRASH_DIR}"
# 智能刪除函數(shù)
function rm() {
# 危險操作檢測
if [[ $* =~ "-rf /" || $* =~ "-rf /" ]]; then
echo -e "\033[1;31m?? 警報!檢測到核彈級刪除操作!\033[0m"
echo -e "\033[1;33m?? 你確定要毀掉自己的職業(yè)生涯嗎?\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}"
# 處理每個參數(shù)
for arg in "$@"; do
# 跳過選項參數(shù)
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
}
# 查看回收站內(nèi)容
function trash-list() {
echo -e "\033[1;36m??? 回收站內(nèi)容:\033[0m"
tree -aC "${TRASH_DIR}"
}
# 清空回收站
function trash-empty() {
echo -e "\033[1;31m?? 即將清空回收站...\033[0m"
read -p "確認要永久刪除所有回收站內(nèi)容嗎?(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
}
# 恢復(fù)回收站文件
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已恢復(fù): ${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
?? 回收站內(nèi)容:
/root/.trash
|-- 20250729065134
| `-- 1.txt
`-- 20250729073654
`-- important.txt
3 directories, 2 files
# 恢復(fù)文件
root@node2:~# trash-restore 20250729073654/important.txt
已恢復(fù): /root/.trash/20250729073654/important.txt -> ./important.txt
# 清空回收站
root@node2:~# trash-empty
? 即將清空回收站...
確認要永久刪除所有回收站內(nèi)容嗎?(y/N) y
回收站已清空
root@node2:~# trash-list
?? 回收站內(nèi)容:
/root/.trash
0 directories, 0 files























