2014-03-07 2 views
0

Мне нужно загрузить файл tar.gz и заменить в нем каталог с содержимым другого файла tar.gz. До сих пор, я попытался следующие драгоценные камни, и нашел их не хватаетКакую рубиновую жемчужину я должен использовать для обработки tar-архивов?

  • архив-tar2: он потерял предпоследний разделитель пути («/»), так что не может на самом деле извлечь
  • архив-tarsimple: просто не извлекать сжатый архив, и не получено Сообща ошибками
  • minitar: столкнулись с ошибкой, где он не удался для путей файлов длиной более 100 символов
  • архива-тар-minitar - не может же, как и его родитель Errno :: ENAMETOOLONG/Слишком длинное имя файла
  • libarchive: bundle install не удалось выполнить компиляцию gcc (даже после s uccessful brew install libarchive)

Я начинаю терять веру. Есть ли хороший, обновленный, хорошо сохранившийся tar-архив, который просто работает? Я бы предпочел тот, который не вызывается в командной строке, так как я хотел бы исключить возможность инъекций в командной строке. Но в этот момент я возьму все, что позволяет вручную вызывать оболочку.

+0

Вы пробовали копирование из нескольких драгоценных камней :: Пакет :: TarReader, как в http://stackoverflow.com/a/11505644/931925, к Gems :: Package :: TarWriter? (Извините, я не очень разбираюсь в Ruby, так что вы можете легко понять что-то.) – minopret

+0

нет, но я дам ему выстрел – nont

ответ

0

Я закончил тем, что отказался от использования драгоценного камня, чтобы манипулировать архивами 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 снова.

0

Вы также можете проверить archive-tar-minitar, частично на основе minitar, который вы уже протестировали, и, похоже, он не вызывает вызовы в командной строке.

+0

спасибо за предложение. он терпит неудачу так же, как это сделал минитар. Я добавляю его к стене позора из смолы. – nont

+0

человек, если бы я был вами, я бы просто использовал системную команду в зависимости от используемой вами ОС. Это было бы безопасно против инъекций. В чем вы нуждаетесь? – sidney

+0

ya, вот что я делал раньше, но на самом деле окончательное имя файла будет зависеть от ввода пользователем, поэтому его действительно не безопасно от инъекции. Когда я, наконец, исчерпаю терпение для этого беспорядка, я вернусь к этому и добавлю белый список, который лучше, чем ничего. – nont

Смежные вопросы