Как распаковать и упаковать файл 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
7 ответов
Пакеты - это просто.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
а затем откройте папку в 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).
Вы можете заглянуть в мою вилку pbzx
здесь: https://github.com/NiklasRosenstein/pbzx
Это позволяет вам передавать потоковые файлы pbzx, которые не упакованы в архив XAR. Я испытал это с недавними образами дисков с инструментами командной строки XCode (например, 10.12 XCode 8).
pbzx -n Payload | cpio -i
@shrx Мне удалось распаковать BSD.pkg (часть установщика Yosemite) с помощью команды "pbzx".
pbzx <pkg> | cpio -idmu
Команду "pbzx" можно скачать по следующей ссылке:
В дополнение к тому, что сказал @abarnert, мне сегодня пришлось выяснить, что по умолчанию cpio
Утилита в Mountain Lion по умолчанию использует другой формат архива (не уверен, какой именно), даже если на странице руководства указано, что будет использоваться старый формат cpio / odc. Так что, если кто-то натыкается на cpio read error: bad file format
сообщение при попытке установить его / ее манипулируемые пакеты, не забудьте включить формат в шаге re-pack:
find ./Foo.app | cpio -o --format odc | gzip -c > Payload
Сценарий Bash для извлечения pkg: (На основе этого ответа: /questions/4540867/kak-raspakovat-i-upakovat-fajl-pkg/4540871#4540871)
Сохраните следующий код в файл с именем pkg-upack.sh в папке $HOME / Downloads.
#!/usr/bin/env bash
filename="$*"
dirname="${filename/\./_}"
mkdir "$dirname"
# pkgutil --expand "$filename" "$dirname"
xar -xf "$filename" -C "$dirname"
cd "$dirname"/*.pkg
pwd
# tar xvf Payload
cat Payload | gunzip -dc |cpio -i
cd usr/local/bin
pwd
ls -lt
cp -i * $HOME/Downloads/
Использование:
cd $HOME/Downloads
chmod +x ./pkg-upack.sh
./pkg-upack.sh MyPackage.pkg
Это было проверено с помощью пакета ffmpeg и mawk с сайта rudix.org ( https://rudix.org), поиск пакетов ffmpeg и mawk на этом сайте.
Источник: Мои проекты с открытым исходным кодом: https://sourceforge.net/u/nathan-sr/profile/
Если вы столкнулись с ошибками во время установки PKG после принятого ответа, я дам вам другую процедуру, которая сработала для меня (обратите внимание на небольшие изменения в командах xar, cpio и mkbom):
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 --format odc --owner 0:80 | gzip -c > Payload
mkbom -u 0 -g 80 Foo.app Bom # or edit Bom
# edit PackageInfo
rm -rf Foo.app
cd ..
xar --compression none -cf ../Foo-new.pkg
Полученный PKG не будет иметь сжатия, cpio теперь использует формат odc и указывает владельца файла, а также mkbom.