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

Другие вопросы по тегам