我应该使用啥 ruby gem 来处理 tar 存档操作?
Posted
技术标签:
【中文标题】我应该使用啥 ruby gem 来处理 tar 存档操作?【英文标题】:what ruby gem should I use to handle tar archive manipulation?我应该使用什么 ruby gem 来处理 tar 存档操作? 【发布时间】:2014-03-07 20:49:13 【问题描述】:我需要下载一个 tar.gz 文件,并将其中的目录替换为另一个 tar.gz 文件的内容。到目前为止,我已经尝试了以下宝石,发现它们缺乏
archive-tar2:它丢失了倒数第二个路径分隔符(“/”),因此实际上无法提取 archive-tarsimple:根本没有解压压缩包,没有返回错误信息 minitar:遇到了一个错误,导致文件路径超过 100 个字符时失败 archive-tar-minitar - 与其父级 Errno::ENAMETOOLONG 一样失败/文件名太长 libarchive: bundle install 未能通过 gcc 编译(即使在成功 brew install libarchive 之后)我开始失去信心。是否有一个好的、最新的、维护良好的 tar 存档 gem 可以正常工作?我更喜欢不调用命令行的,因为我想消除命令行注入攻击的可能性。但在这一点上,我将采取任何避免手动调用 shell 的方法。
【问题讨论】:
您是否尝试过从 ***.com/a/11505644/931925 中的几个 Gems::Package::TarReader 复制到 Gems::Package::TarWriter? (对不起,我不熟悉 Ruby,所以很容易误解。) 不,但我会试一试 【参考方案1】:您也可以查看archive-tar-minitar,它部分基于您已经测试过的minitar
,并且它似乎没有发出对命令行的调用。
【讨论】:
感谢您的建议。它以与 minitar 相同的方式失败。我正在将它添加到我的 tar 宝石耻辱墙中。 伙计,如果我是你,我会根据你使用的操作系统简单地使用系统命令。注射仍然是安全的。你有什么需求? 是的,这就是我之前所做的,但实际上,最终的文件名将取决于用户输入,因此它确实不能安全注入。当我终于对这个烂摊子失去耐心时,我会回去做那个并添加字符白名单,这总比没有好。 不要将一组单词列入白名单,如果您需要良好的安全性,我强烈建议您解析用户的条目以将其转换为从 A-Z 的字母,没有任何注入可能发生在第一名。但是,用户不应该能够插入所有内容,但这将是一个很好的对策。 Edit:哦,对不起,你已经通过character whitelisting
表示过这个意思;)
是的,这就是我的意思,但是,白名单比黑名单好。我对红宝石存档宝石的糟糕状态感到有点震惊。【参考方案2】:
我最终放弃了使用 gem 来操作 tar 档案,而只是通过命令行来完成。
`cd #container && tar xvfz sdk.tar.gz`
`cd #container && tar xvfz Wizard.tar.gz`
#update the framework packaged with the wizard
FileUtils.rm_rf(container + "/Wizard.app/Contents/Resources/SDK.bundle")
FileUtils.rm_rf(container + "/Wizard.app/Contents/Resources/SDK.framework")
FileUtils.mv(container + "/resources/SDK.bundle", container + "/Wizard.app/Contents/Resources/")
FileUtils.mv(container + "/resources/SDK.framework", container + "/Wizard.app/Contents/Resources/")
config_plist = render_to_string(
file: 'site/_wizard_config',
layout: false,
locals: app_id: @version.app.id ,
formats: 'xml'
)
File.open(container + "/Wizard.app/Contents/Resources/Configuration.plist", 'w') |file| file.write( config_plist )
`cd #container && rm Wizard.tar.gz`
`cd #container && tar -cvf Wizard.tar 'Wizard.app'`
`cd #container && gzip Wizard.tar`
所有这些反引号让我觉得我又在写 Perl。
【讨论】:
以上是关于我应该使用啥 ruby gem 来处理 tar 存档操作?的主要内容,如果未能解决你的问题,请参考以下文章
是否有一个gem提供支持来检测对本机ruby类型实例的更改?