繁体   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