2012-07-02 4 views
71

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

+0

(Для будущих посетителей) http://gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10/ может дать вам представление о –

+0

MacOS, кажется, пришел с командой Xar , – MikeP

ответ

137

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

+0

Да. Я пробовал этот метод раньше (только распаковать/упаковать без изменения каких-либо файлов), но после установки этого pkg ничего не произошло. В консоли я получил это сообщение: posix_spawn ("/ Library/Application Support/Project1/Project1.app/Contents/MacOS/Project1", ...): Нет такого файла или каталога. Я исследовал, что старый файл полезной нагрузки имеет /./ Project1.app/... и новая полезная нагрузка имеет /Project1.app/... внутри. – dream2work

+0

Ну, эта последняя часть проста. Я не знаю, имеет ли это значение, но может (возможно, потому, что Bom и полезная нагрузка не совпадают?). Просто используйте ./Foo.app вместо Foo.app в команде find | cpio | gzip. Я отредактирую ответ. – abarnert

+3

@abarnert: вместо 'cat полезной нагрузки | gunzip -dc | cpio -i' вы могли бы просто использовать «tar xzvf Payload» – ccpizza

3

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

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

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

+0

'tar xvf Payload' отлично поработал на Yosemite – cde

+1

tar: Формат нераспознанного архива – malhal

+1

Использовать pbzx -n macOSUpd10.12.1.pkg/Полезная нагрузка | cpio -i для новых архивов (взято здесь: https://stackoverflow.com/a/41598227/5688277) –

2

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

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

2

Вы могли бы хотеть смотреть в мою развилки pbzx здесь: https://github.com/NiklasRosenstein/pbzx

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

pbzx -n Payload | cpio -i 

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

  • Нет связанных вопросов^_^