Как распаковать и упаковать файл pkg?

У меня есть файл pkg, созданный Install Maker для Mac. Я хочу заменить один файл в pkg. Но я должен сделать это в системе Linux, потому что это часть процесса загрузки. Когда пользователь начинает загружать файловый сервер, он должен заменить один файл в pkg. У меня есть решение, как распаковать pkg и заменить файл, но я не знаю, как снова пакет pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

    Пакеты – это только архивы .xar с другим расширением и указанной иерархией файлов. К сожалению, часть этой файловой иерархии представляет собой архив cpio.gz реальных установочных файлов, и обычно это то, что вы хотите отредактировать. Также есть файл Bom, который содержит информацию о файлах внутри этого cpio-архива и файл PackageInfo, который включает в себя сводную информацию.

    Если вам действительно нужно отредактировать один из информационных файлов, это просто:

    mkdir Foo cd Foo xar -xf ../Foo.pkg # edit stuff xar -cf ../Foo-new.pkg * 

    Но если вам нужно отредактировать установочные файлы:

     mkdir Foo cd Foo xar -xf ../Foo.pkg cd foo.pkg cat Payload | gunzip -dc |cpio -i # edit Foo.app/* rm Payload find ./Foo.app | cpio -o | gzip -c > Payload mkbom Foo.app Bom # or edit Bom # edit PackageInfo rm -rf Foo.app cd .. xar -cf ../Foo-new.pkg 

    Я считаю, что вы можете получить mkbom (и lsbom) для большинства дистрибутивов Linux. (Если вы можете получить то же, что делает вещи еще проще, но я не уверен, что это почти так же повсеместно доступно.)

    Вдохновленный ответом от abarnert , я сделал сценарий bash, который MyPackage.pkg пакет с именем MyPackage.pkg в подпапку с именем MyPackage_pkg а затем откроет папку в Finder. Удалите последнюю строку, если вам не нужен шаг Finder.

      #!/usr/bin/env bash filename="$*" dirname="${filename/\./_}" pkgutil --expand "$filename" "$dirname" cd "$dirname" tar xvf Payload open . 

    Применение:

      pkg-upack.sh MyPackage.pkg 

    Предупреждение. Это не будет работать во всех случаях и будет работать с определенными файлами, например, PKG внутри установщика системы OSX. Если вы просто хотите заглянуть внутрь файла pkg и посмотреть, что внутри, вы можете попробовать SuspiciousPackage (бесплатное приложение), и если вы хотите сделать серьезную распаковку, включая извлечение определенных файлов, посмотрите на Pacifist (nagware).

    В дополнение к тому, что сказал @abarnert, мне сегодня нужно было выяснить, что утилита cpio по умолчанию для Mountain Lion использует другой формат архива по умолчанию (не уверена какая), даже с man-страницей, в которой говорится, что он будет использовать старый формат cpio / odc , Итак, если кто-то натыкается на cpio read error: bad file format пытаясь установить его / ее управляемые пакеты, обязательно включите формат на этапе повторного пакета:

     find ./Foo.app | cpio -o --format odc | gzip -c > Payload 

    @shrx Мне удалось распаковать BSD.pkg (часть установщика Yosemite) с помощью команды «pbzx».

    pbzx | cpio -idmu

    Команда «pbzx» может быть загружена по следующей ссылке:

    • pbzx Stream Parser

    Возможно, вам pbzx взглянуть на свою вилку pbzx : https://github.com/NiklasRosenstein/pbzx

    Это позволяет вам передавать файлы pbzx, которые не были обернуты в архив XAR. Я испытал это с помощью недавно созданных XCode инструментов командной строки Disk Images (например, 10.12 XCode 8).

     pbzx -n Payload | cpio -i 
    Interesting Posts

    Является ли IPv6 «быстрее», чем IPv4?

    Отсутствующие вставки специальных опций в Excel 2010

    Как запустить meteorитный сервер на другом IP-адресе?

    Как заставить MySQL дать право пользователю root?

    В чем смысл $ в имени переменной?

    Как скопировать таблицу Lua по значению?

    Сообщение Android «Обнаружение экрана», если пользователь пытается предоставить разрешение при показе уведомления

    Как принудительно перезагрузить ПК с технологией vPro?

    Сбросьте менеджера загрузки Chrome по умолчанию

    Как переименовать длинные имена файлов в короткие в Linux?

    Правильный способ сохранить объединенные соединения в живых (или время их выхода и получить свежие) в течение более длительного времени бездействия для MySQL, приложение Grails 2

    Могу ли я установить Windows 7 x64 в VPC, где хост – это Vista x86?

    Компьютер Воспроизводит звук, но не показывает действие на Volume Mixer

    Получить DateTime.Now с точностью до миллисекунды

    Android: текстовая гиперссылка

    Давайте будем гением компьютера.