防止rm誤操作的方法

--preserve-root 選項

像freebsd, GNU/Linux 這樣的系統(tǒng)都有文件系統(tǒng)根目錄保護機制,如果沒有指定--no-preserve-root參數(shù),GNU rm 將拒絕執(zhí)行

rm -rf /

這樣致命的指令(嗯,其實我沒有驗證過其效果啦),但只應(yīng)用于文件名嚴格為 '/' 的情形,不能阻止

rm -rf /*

避免使用 ./ 前綴

要刪除一個目錄下的所有內(nèi)容,不要使用

rm -rf ./*

,更進一步地,不要使用 ./* 來引用當前目錄下的所有文件,直接使用 * 即可,這樣可以避免寫成 /* 或者 / * 這樣的悲劇發(fā)生。

chattr 設(shè)置擴展屬性

在需要保護的目錄下創(chuàng)建一個文件名比較靠前的文件 0,設(shè)置其不可刪除

touch /0
chattr +i /0

這種做法對 -f 選項的rm 命令行無效,其它文件仍然會被刪除。

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

在重要目錄下創(chuàng)建 -i 文件

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 ./*

這樣的事情發(fā)生,因為此時 -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

此方法不能避免一次誤刪除數(shù)量少于或等于3個的文件。
此方法可以和上面的創(chuàng)建不能具有 i 擴展屬性的文件結(jié)合使用。

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

這樣可以避免路徑尚未敲完整時誤按 enter 鍵造成的錯誤操作。
此方法在使用 GNU coreutils 的系統(tǒng)上可用,在某些unix系統(tǒng)上可能不支持將選項放到命令行的最后。。

使用 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 有其好處,但平時應(yīng)該養(yǎng)成盡量避免在命令行中使用 rm 的習慣,在命令行中 safe-rm 的名稱來執(zhí)行安全刪除操作,以避免因為依賴偽裝成 rm 的safe-rm 導(dǎo)致在沒有 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

建立回收站機制

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

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

只讀掛載

boot文件系統(tǒng)可以設(shè)置 noauto,ro 的掛載選項。

防止空變量導(dǎo)致的誤刪除

在腳本中不要使用

rm -rf $FOO/

執(zhí)行這樣的操作前最好檢查變量是否非空,而且不要帶后面的/。

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

做好備份

這個是王道,不僅可以防止誤刪,還可以防止其它如硬盤損壞等原因?qū)е碌臄?shù)據(jù)丟失。

可以采用dump的增量備份機制,LVM快照,在虛擬化環(huán)境中的快照功能等等。

其它

良好的工作習慣是非常重要的,不要過于依賴工具,比如不要因為像 safe-rm 這樣的保護機制而放松警惕,否則當你在一臺沒有那種保護機制的機器上操作時,會因為過于輕率地使用rm命令導(dǎo)致悲劇。另外一點就是不要使用root作為日常工作賬號。

我一直以為 rm -rf dir/rm -rf dir 是不同的,以為前者等價于 rm -rf dir/*, 因為在 rsync 中 dir/ 隱含 dir/*。但是今天發(fā)現(xiàn)rm -rf dir/ 是會刪除 dir 這個目錄的。所以在刪除一個目錄時,完全沒必要使用 dir/ 這樣的形式,這樣少敲一個鍵且可以避免誤刪的風險。

參考:
通過替換linux rm命令防止誤刪除
How do I prevent accidental rm -rf /*?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容