mysql 开源 程序员 linux 微软 java google nginx shell 云计算 Firefox php Python Windows 编程 centos apache Android Ubuntu wordpress

定制工具:安全的delet命令

 在Linux下, 用rm是比較危險的, 刪除了的文件不會放到所謂的回收站中, 有很多因rm而“一失足成一天恨”的例子, 下面, 我們考慮來定制一個delete命令, 並模擬做一個回收站, 這樣, 即使delete文件/目錄, 也會放在自建的回收站中, 相對比較安全。

 安全地刪除沒有任何特殊屬性的文件相對而言簡單而直接:安全刪除程序使用安全刪除模式簡單地覆蓋文件。較為復雜的是安全地刪除 Windows NT/2K 壓縮、加密和稀疏文件,以及安全地清理磁盤可用空間。

 壓縮、加密和稀疏文件由 NTFS 以 16 群集塊方式管理。如果某個程序向此類文件的現有部分寫入數據,則 NTFS 會分配磁盤上的新空間來存儲新數據,並在寫入新數據後取消分配該文件先前占用的群集。NTFS 采取此保守方法的原因與數據完整性有關,而且對於壓縮和稀疏文件,這樣可以在出現新分配大於現有分配(新的壓縮數據大於舊的壓縮數據)的情況下正確應對。因此,覆蓋此類文件時將不能成功地從磁盤中刪除文件的內容。

 為了處理上述類型的文件,SDelete 依賴碎片整理 API。利用 碎片整理 API,SDelete 可以精確地判斷磁盤中哪些群集由屬於壓縮、稀疏和加密文件的數據占用。 SDelete 在了解哪些群集包含該文件的數據後,就可以打開磁盤進行原始訪問並覆蓋這些群集。

 可用空間的清理問題提出了另一項挑戰。由於 FAT 和 NTFS 沒有為應用程序提供直接尋址可用空間的方法,因此 SDelete 具有以下兩個選擇之一。第一個選擇是它可以像處理壓縮、稀疏和加密文件那樣,打開磁盤以進行原始訪問並覆蓋可用空間。此方法面臨一個很大的問題:即使 SDelete 被編碼為完全能夠計算 NTFS 和 FAT 驅動器的可用空間部分(這並非微不足道),它也會遭遇與系統上發生的活動文件操作發生沖突的風險。例如,假設 SDelete 確定某個群集可用,而就在此時文件系統驅動程序(FAT、NTFS)決定為另一應用程序正在修改的文件分配該群集。文件系統驅動程序會將新數據寫入該群集,然後 SDelete 跟隨而來並覆蓋了剛剛寫入的數據:該文件的新數據丟失了。如果為文件系統元數據分配該群集,則問題會更糟,因為 SDelete 會破壞文件系統的磁盤結構。

 第二種方法即 SDelete 所采用的方法是間接覆蓋可用空間。首先,SDelete 分配它所能分配的最大文件。SDelete 使用非緩存文件 I/O 完成此任務,這樣就不會將 NT 文件系統緩存的內容扔掉,也不會用與 SDelete 的占用大量空間的文件相關聯的無用數據替代這些內容。因為非緩存文件 I/O 必須是扇區(512 字節)對齊的,所以可能存在一些不能為 SDelete文件分配的剩余空間(即使 SDelete 無法進一步擴大該文件)。為了獲取任何剩余空間,SDelete 接下來會分配它能夠分配的最大緩存文件。對於這兩個文件, SDelete 都執行安全覆蓋,並且確保所有以前可用的磁盤空間都被安全地清理。

 在 NTFS 驅動器上,分配和覆蓋這兩個文件並非 SDelete 的全部工作。SDelete 還必須用適合 MFT 記錄的文件填充 NTFS MFT(主文件表)的任何現有可用部分。一個 MFT 記錄的大小通常為 1KB,而磁盤上的每個文件或目錄都至少需要一個 MFT 記錄。小文件都整個存儲在各自的 MFT 記錄中,而對於不適合一個記錄的文件,則會為其分配 MFT 外部的群集。SDelete 為處理可用 MFT 空間而必須完成的全部工作就是分配它能夠分配的最大文件 - 當該文件占用 MFT 記錄中的所有可用空間時,NTFS 將防止該文件增大,因為磁盤中沒有剩余的可用群集(它們正被 SDelete 先前分配的兩個文件占用)。然後,SDelete 將重復此過程。當 SDelete 甚至無法再創建新文件時,它會知道 MFT 中所有先前可用的記錄都已完全被安全覆蓋文件填充。

 為了覆蓋您刪除的文件的文件名,SDelete 會將該文件重命名 26 次,每次都用連續的字母字符替換文件名中的每個字符。例如,“foo.txt”經過第一次重命名後將變為“AAA.AAA”。

 SDelete 在清理磁盤可用空間時不能安全刪除文件名的原因是,刪除文件名需要直接操作目錄結構。目錄結構可能具有包含已刪除文件名的可用空間,但可用目錄空間不能分配給其他文件。因此, SDelete 無法分配此可用空間以便安全地覆蓋它。

延伸阅读

  • 抱歉,暂无相关内容!

评论