我应该使用啥 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类型实例的更改?

Ruby 分块创建 tar 球以避免内存不足错误

波浪号大于 (~>) 在 Ruby gem 依赖项中是啥意思? [复制]

Appium:Ruby:在gem中加载错误

如何将应用程序布局打包到 Ruby gem 中?

gem install报错 ruby升级