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

99

У меня есть файл 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

dream2work
источник
(Для будущих посетителей) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 может дать вам представление
james_womack
MacOS, похоже, поставляется с командой xar.
MikeP

Ответы:

187

Пакеты - это просто архивы .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
источник
Да. Я пробовал этот метод раньше (только распаковывать / упаковывать без изменения файлов), но после установки этого пакета ничего не произошло. В консоли я получил это сообщение: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Нет такого файла или каталога. Я исследовал, что в старом файле полезной нагрузки есть /./ Project1.app / ... а в новой полезной нагрузке находится /Project1.app / ... внутри.
dream2work
Что ж, последняя часть проста. Я не знаю, имеет ли это значение, но может (может быть, потому, что Bom и Payload не совпадают?). Просто используйте ./Foo.app вместо Foo.app в команде find | cpio | gzip. Отредактирую ответ.
abarnert
4
@abarnert: вместо cat Payload | gunzip -dc |cpio -iвас можно просто использоватьtar xzvf Payload
ccpizza
Я получаю сообщение об ошибке работает cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. Я пытаюсь открыть BSD.pkgиз установочного пакета OS X Yosemite.
shrx
1
У меня не было xar, поэтому я попробовал: 7z x <file>.pkgи это сработало.
21

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

ccpizza
источник
2
Используйте pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i для более новых архивов (взято отсюда: stackoverflow.com/a/41598227/5688277 )
Адриан О'Коннор
3

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

find ./Foo.app | cpio -o --format odc | gzip -c > Payload
Мальте Роде
источник
3

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

pbzx <pkg> | cpio -idmu

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

h6ah4i
источник
2

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

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

pbzx -n Payload | cpio -i
Никлас Р
источник