不小心把根目錄刪除這種慘劇,我們從小都當笑話聽,但可千萬別以為這只是個笑話! 光小弟自己就看過無數朋友的電腦發生這種慘劇,而今天 GitLab (類似 Github 的服務)的工程師也親身示範了 rm -rf 指令的莫大威力…… 他們把 Production Server 的 Database 砍掉了…… 過去一直覺得這種慘劇不會發生在自己身上,但現在連 GitLab 這種有上萬人在用的服務,都因為大意而發生這種事情,也讓我研究了一下該如何避免,這邊就來聊聊我們該如何把 rm 指令管好吧!
不過 GitLab 的處理方式也很有趣,竟然邊回復資料還開直播給大家看,也許是不錯的行銷技巧,但在我看來只是工程師的個性使然(笑) 想看直播的可以點擊 Youtube – GitLab Live Stream。
老生常談的:
- 按下 Enter 鍵之前先看看你的當前目錄。
- 不要輕易使用 rm -rf 指令。
- Linux 用戶權限要設定好,不輕易切換到 root。
- 資料要備份!
但即使你把以上四點謹記在心,人在江湖走,哪有不挨刀的,就算你再怎麼謹慎,也難保你家的貓不會幫你亂敲鍵盤(?)
最基本的做法,rm 指令有個 -i 參數,當你使用 rm -i 刪除檔案時,系統會再次跟你確認是否要刪除檔案,你可以像下面這樣設定 rm 的別名:
# ~/.bashrc alias rm="rm -i"
即使如此,如果你不小心輸入 rm -rf,因為是強制刪除,所以 -i 指令依舊會失效,更好的做法是使用 safe-rm 指令,這個指令需要另外安裝,Mac、Linux 都可以使用,safe-rm 的用法和 rm 完全相同,唯一差別在於你可以預先設定某些路徑,當使用者要刪除這些預設的路徑時會直接被 safe-rm 阻止,個人建議把自己電腦、公司伺服器的 rm 指令都換成 safe-rm 以避免慘劇不小心發生,此外公司的網管人員也可以預先設定好禁止刪除的資料夾路徑,例如資料庫檔案儲存的位置。
Safe-rm Git: http://repo.or.cz/w/safe-rm.git
# Mac OS brew install safe-rm # Ubuntu sudo apt-get install safe-rm
安裝完 safe-rm 後,建議將它設為 rm 的別名,畢竟你不能期待使用者都會用 safe-rm 指令來刪除檔案,不如直接設為預設。
# ~/.bashrc alias rm="safe-rm"
接著讓我們來設定哪些資料夾是不可被刪除的,一旦設定了,該資料夾就無法被 safe-rm 移除,即使加上 -f 參數亦然,如果想刪除就只能從設定檔內把該路徑移除;此外,只有指定了路徑無法被移除,但其內的檔案、資料夾依舊可以移除,換句話說當你設定根目錄無法被移除時,根目錄內的檔案、資料夾依舊可以移除。
設定檔分為兩個,若不存在可自行建立:
# Global /etc/safe-rm.conf # User ~/.safe-rm
在設定檔內填入禁止移除的路徑,一行一筆資料,例如:
/home/karl /etc/* /var/log/**/*
最後別忘記要重開 Terminal 才會生效!
設定完成後,當你要移除「預設不可移除」的檔案時,就會出現如下指令
但須謹記 safe-rm 是作為最後一道防火線,更重要的應該是養成下指令前想三秒、不要輕易用 rm -rf 的好習慣,如果一昧的依賴 safe-rm,哪天換到一台新電腦,慘劇終究會發生的。