У меня есть файл 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
Как распаковать и упаковать файл pkg?
Ответ 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