Linux防止「rm -rf /」誤操做的方法

Linux防止「rm -rf /」誤操做的方法html

  • 2014年06月07日linux

  •  

--preserve-root 選項

像freebsd, GNU/Linux 這樣的系統都有文件系統根目錄保護機制,若是沒有指定--no-preserve-root參數,GNU rm 將拒絕執行shell

rm -rf / 這樣致命的指令(嗯,其實我沒有驗證過其效果啦),但只應用於文件名嚴格爲 '/' 的情形,不能阻止vim

rm -rf /*安全

避免使用 ./ 前綴

要刪除一個目錄下的全部內容,不要使用bash

rm -rf ./* ,更進一步地,不要使用 ./* 來引用當前目錄下的全部文件,直接使用 * 便可,這樣能夠避免寫成 /* 或者 / * 這樣的悲劇發生。app

chattr 設置擴展屬性

在須要保護的目錄下建立一個文件名比較靠前的文件 0,設置其不可刪除ide

touch /0
chattr +i /0
 這種作法對 -f 選項的rm 命令行無效,其它文件仍然會被刪除。工具

使用 -i 文件賦予命令行中 rm -i 選項

在重要目錄下建立 -i 文件post

touch -- /-i /usr/-i /bin/-i /sbin/-i /etc/-i /lib/-i /lib64/-i \
/boot/-i /dev/-i /var/-i
 -i 文件並不能阻止

rm -rf /etc/*
rm -rf ./*
 這樣的事情發生,由於此時 -i 文件的路徑是 /-i, ./-i, 不會被解釋成 rm 的選項。 因此前面講的避免使用 ./ 前綴對於 -i 文件起到做用很重要。

alias rm='rm -I' 並避免使用 -f 選項

由於缺省的 alias 是 rm='rm -i', 因此爲了不刪除每一個文件都要確認,得使用 -f 選項(若是沒有 alias rm='rm -i', 刪除多個文件、遞歸刪除都不須要使用 -f 選項)。

rm 的 -I 選項的做用是

prompt once before removing more than three files, or when removing recursively. Less intrusive than -i, while still giving protection against most mistakes

此方法不能避免一次誤刪除數量少於或等於3個的文件。

此方法能夠和上面的建立不能具備 i 擴展屬性的文件結合使用。

將 -r -f 選項放在命令行的最後面

這樣能夠避免路徑還沒有敲完整時誤按 enter 鍵形成的錯誤操做。

此方法在使用 GNU coreutils 的系統上可用,在某些unix系統上可能不支持將選項放到命令行的最後。。

使用 safe-rm 替代 rm

Safe-rm is a safety tool intended to prevent the accidental deletion of important files by replacing /bin/rm with a wrapper, which checks the given arguments against a configurable blacklist of files and directories that should never be removed.

Users who attempt to delete one of these protected files or directories will not be able to do so and will be shown a warning message instead:

$ rm -rf /usr
Skipping /usr
 (Protected paths can be set both at the site and user levels.)

能夠將 safe-rm 改名爲 rm 並放在 $PATH 中比 原rm 程序靠前的位置。一些腳本中使用徹底路徑/bin/rm則不會受此影響。雖然將 safe-rm 重命名成 rm 有其好處,但平時應該養成儘可能避免在命令行中使用 rm 的習慣,在命令行中 safe-rm 的名稱來執行安全刪除操做,以免由於依賴假裝成 rm 的safe-rm 致使在沒有 safe-rm 的機器上犯錯。

The system-wide blacklist lives in /etc/safe-rm.conf and you should probably add paths like these:

/
/etc
/usr
/usr/lib
/var
 The user-specific blacklist lives in ~/.safe-rm and could include things like:

/home/username/documents
/home/username/documents/*
/home/username/.mozilla

創建回收站機制

回收站機制則是另外一種思路,它並不真正執行刪除操做,而是將文件移動到一個特定目錄,能夠設置定時清楚回收站,或者在回收站裏面的文件大小達到必定容量時執行刪除操做(能夠選擇清空,更保守的作法時設置soft/hard閾值之類的)以騰出空間。

能夠寫個shell腳本替換rm命令,或者在須要刪除文件的時候使用mv命令將文件移動到回收站。

只讀掛載

boot文件系統能夠設置 noauto,ro 的掛載選項。

防止空變量致使的誤刪除

在腳本中不要使用

rm -rf $FOO/
執行這樣的操做前最好檢查變量是否非空,並且不要帶後面的/

[[ -n $F00 ]] && rm -rf $FOO

作好備份

這個是王道,不只能夠防止誤刪,還能夠防止其它如硬盤損壞等緣由致使的數據丟失。
能夠採用dump的增量備份機制,LVM快照,在虛擬化環境中的快照功能等等。

其它

良好的工做習慣是很是重要的,不要過於依賴工具,好比不要由於像 safe-rm 這樣的保護機制而放鬆警戒,不然當你在一臺沒有那種保護機制的機器上操做時,會由於過於輕率地使用rm命令致使悲劇。另一點就是不要使用root做爲平常工做帳號。

我一直覺得 rm -rf dir/ 和 rm -rf dir 是不一樣的,覺得前者等價於 rm -rf dir/*, 由於在 rsync 中 dir/ 隱含 dir/*。可是今天發現rm -rf dir/ 是會刪除 dir 這個目錄的。因此在刪除一個目錄時,徹底不必使用 dir/ 這樣的形式,這樣少敲一個鍵且能夠避免誤刪的風險。

Reference

經過替換linux rm命令防止誤刪除

How do I prevent accidental rm -rf /*?

+==================================================+

linux中的 rm -rf * 刪除文件確實很快,能夠若是養成常常用 rm -rf * 這個習慣可就很差了。一不當心就把你重要的資料給刪了。。。。 用rm刪除的文件是很難恢復的。爲了避免讓 rm -rf * 給咱們帶來的損失 ,咱們能夠把 /bin下的 rm改一名字字。而後,在 /bin下建一個名爲 rm的bash程序
cd /bin
mv rm rm1
而後
touch rm
vim rm 
/*=============== rm中內容以下
#!/bin/bash
# rm
if echo "$1" |grep \- ;then 
    opation="$1"
    shift
fi

mkdir -p /.trash_all_users
:>/.trash_all_users/.rm_filename.txt
for i in "$@"
do
    time=`date +%m-%d_%H-%M-%S`
    mv "$i" /.trash_all_users/"$i"_"$time"
    echo "$i"_"$time",`pwd`"/$i" >>/.trash_all_users/.rm_filename.txt
done;
===================================    */

再建一個 unrm   用於恢復
/*===================   unrm 內容以下   
#!/bin/bash
# /bin/unrm
file="/.trash_all_users/.rm_filename.txt"
for i in `cat $file `;do    
    mv   `echo "/.trash_all_users/$i"|tr "," " " `
done
:>$file
=========================    */

chmod 755 rm
chmod 755 unrm
chmod 777 /.trash_all_users

最後,每隔一段時間清空一次。清空的時候,就用 cd /.trash_all_users ;rm1 -rf * ,這下刪除了可就再也恢復不回來了哦!!!!

#bash_program

相關文章
相關標籤/搜索