Как распаковать и упаковать файл 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

Ответ 1

Пакеты - это просто архивы .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. (Если вы можете получить то же, что делает вещи еще проще, но я не уверен, что это почти повсеместно доступно.)

Ответ 2

Вдохновленный ответом abarnert, я создал bash script, который распакует пакет с именем 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).

Ответ 3

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

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

Ответ 4

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

pbzx <pkg> | cpio -idmu

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

Ответ 5

Возможно, вы захотите посмотреть в свою вилку pbzx здесь: https://github.com/NiklasRosenstein/pbzx

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

pbzx -n Payload | cpio -i