簡體   English   中英

Ruby-在代碼中使用刪除文件和目錄命令時如何防止擦拭硬盤

[英]Ruby - How to prevent wiping your hard drive when using delete file and directory commands in your code

我正在編寫一些代碼,這些代碼在運行時可能會在項目路徑中創建或刪除目錄。 我並沒有真正使用ruby進行文件處理,因此我對代碼的使用感到非常不安,因為可能在幾周后輸入錯誤,可能會導致項目目錄之外的其他目錄被清除。

無論如何,無論破壞性調用中鍵入了什么內容,程序都無法刪除其自身路徑之外的文件?

您可能想圍繞自己喜歡的delete方法創建一個包裝方法(或者也許圍繞整個類,因為不僅刪除文件可能會破壞文件),這將擴展所有提交的路徑並檢查它們是否以“ sandbox”開頭”)。 如果您願意在整個應用程序中減少刪除方法,也可以嘗試重新定義刪除方法。

也許所有這些方法中最干凈的解決方案是在系統上創建一個新用戶並以他的身份運行程序。

在POSIX系統上,可以使用Dir.chroot更改應用程序可以看到的根目錄。 然后,所有操作(不僅是刪除操作)都將限制在項目目錄中。 這確實意味着外部命令將不可用,除非您也將它們也設置為項目目錄的一部分。

這是在基於Unix的系統中使用的標准“沙盒”方法。 設置可能很困難(有時很難消除所有外部依賴關系),但如果配置正確,則可以提供重要的保護。

路徑名是幾乎所有文件操作的包裝器類。

require "pathname"
path= Pathname.new("/home/johannes")
path.directory? # => true
path.children # => [#<Pathname:.bash_history>, #<Pathname:Documents>, #<Pathname:Desktop>]
path.children.each do |p|
  p.delete if p.file?
end

Pathname#children不包含. ..這樣您就不會意外地走上樹而不是走下樹。 如果您仍然不信任該代碼,甚至可以檢查on路徑是否包含在另一個路徑中

Pathname.new("test") <=> Pathname.new("test/123") # => -1

您可以使用以下命令在項目目錄中生成文件名數組

my_files = Dir["/bla/bla/your/directory/**/*"]

然后只需檢查傳遞給“刪除”函數的文件名是否存在於my_files數組中。
我敢肯定有一個更優雅的解決方案,但這可以工作^ _ ^

您可以在輸入中使用File.expand_pathFile.dirname ,並根據__FILE__檢查。 所以這樣的事情可能會起作用:

File.delete(path) if File.dirname(File.expand_path(path)).include? File.dirname(File.expand_path(__FILE__))

我有自動創建和清除目錄的自動化測試。 我采取了兩種方法:

  1. 盡可能使用/ tmp。 “ tmpdir”標准庫模塊將創建臨時目錄,該目錄將在程序退出時銷毀。 要么,

  2. 當代碼創建一個以后將要刪除的目錄時,它將標記文件拖放到該目錄中。 是時候刪除目錄了,如果找不到標記文件,則代碼拒絕刪除目錄。 例如,標記文件可能稱為“ .ok_to_delete”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM