開源專案「safe-rm」研究心得
在上次誤刪重要資料的經驗之後,為了機制上的防護最後找到這款程式。研究如何使用的過程中參考許多網路上其他人寫的介紹文章,有的寫得像是下載後的壓縮檔應該有編譯完成的執行檔,但解壓縮之後只看到程式碼和相關設定檔;其他的文章內容也有一些錯誤存在,導致無法直接照做完成設定。最後還是只能透過理解專案組成研究如何使用了。
看過專案內容後,初步理解是本專案的編譯方式可使用 make 工具讀取專案中的 Makefile 檔案所寫的設定,或是參考 Makefile 當中所寫的內容直接執行編譯指令。
如圖,編譯的指令為「cargo build --release」,而不認得的 cargo 指令在搜尋之後確認是程式語言 Rust 的編譯程式,至此,總算理解在 src 資料夾中看起來與 golang 和 javascript 語法有點像的,副檔名是「rs」的程式碼到底是什麼了。
對於沒接觸過 Rust 的我來說,像這樣從「cargo是什麼」、「怎麼安裝cargo」開始理解,也不算是太稀奇的事情,畢竟現在有太多東西是我不知道,也學不完的了。
關於 cargo 如何安裝可參考官方網站安裝步驟,這裡不多贅述。
safe-rm 的邏輯是它會在被呼叫時讀取設定檔的內容,用這些內容將不可刪除的資料從這次執行的刪除對象中排除,再將剩下的刪除對象傳給原本的刪除指令 rm,而不是完整的,包含刪除功能的執行檔。
(網路上有的教學文章教人直接把原本的rm取代掉,這完全是行不通的做法。)
程式碼編譯產生名為「safe-rm」的執行檔,之後就可實際試用。專案說明的設定方法是在系統的設定檔 /etc/bashrc 加上新的設定,使得呼叫原生刪除指令 rm 的時候改為呼叫 safe-rm,就能多一層保護了。
試著執行原生的 rm 和剛編譯出來的 safe-rm 進行比較,以刪除重要資料夾的 /usr 為例,一個是嘗試刪除時因刪除流程本身的規則而失敗,另一個卻是進入刪除流程前發現並排除,導致刪除時無目標可刪的情境,從下圖的錯誤訊息就可以看出差異。
試用的結果,有些不如預期的部分。
首先是保護檔案的時候並沒有保護檔案所在的資料夾,因此雖然不能直接刪除檔案,但可以把所在的資料夾,連同其中的所有檔案一併刪除,這點在官方網站上也有記錄,只是尚未修正;
此外程式碼裡面可以看到有個叫做 DEFAULT_PATHS 的常數,裡面記錄了 Linux 常見的系統路徑,然而它只在使用者沒有自定義要保護的檔案時生效,自定義之後這段就沒有作用了,但是個人想像上這些重要檔案應該不分使用情境都應該保護才對;
以及個人認為最重要的,讓使用者避免直接呼叫原生 rm 的設定方法可能會因使用者個別的設定方式而被覆蓋。
綜合上述,對我來說在程式本身以及設定方法等兩者都有改進空間,因此準備開始對專案進行修改,像這樣合法改寫程式也是開源程式才能做到的事。
為了改寫程式,先是上codewars網站透過一些完成的簡單題目以 Rust 重寫,不懂的部分上網查語法,稍微試了一天之後再回頭對 safe-rm 進行修改。
從官方網站的另一個頁面可以取得包含開發過程版本記錄的 git 專案,保留前人開發的記錄不論是追溯設計邏輯或是重視他人成果都是非常重要的。
最後在專案加上以下的修改:
1. 不只是編譯,把編譯之後的執行檔設定到系統中的步驟也寫進 Makefile,可以透過管理員權限執行完成設定。
2. 把保護檔案所屬的上層資料夾各層均加入保護對象之中。
3. 更新說明文件、建立中文版文件。
將這樣的成果上傳到自己的 github 網站上,維持原本的開放軟體授權軟體,留下自己開發的腳印,供他人使用及參考。
雖然這個行為本身只是學習過程中的自我滿足,如果能對其他人有用就再好不過了。
開放軟體不是完美的,對其進行修改的開發者也不必是萬能的。
我的修改內容對現在的我而言是滿意的,當然也很可能有部分是效能較差,不好的寫法,畢竟我對 Rust 並不熟悉。其他人若是認為有不足之處可以對我或原作者提出建議,也可以自行下載進行改寫,只要遵守規範,從中學習並與他人分享就行了。
相關連結:
safe-rm官方網站: https://code.launchpad.net/safe-rm
cargo官方網站安裝頁面: https://doc.rust-lang.org/cargo/getting-started/installation.html
我的safe-rm專案網址: https://github.com/Benjamin1021523/safe-rm
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!