Як розпакувати та упакувати файл pkg?


99

У мене є файл pkg, створений Install Maker для Mac. Я хочу замінити один файл у кг. Але я повинен це зробити в системі Linux, тому що це частина завантаження. Коли користувач починає завантажувати файловий сервер, слід замінити один файл у кг. У мене є рішення, як розпакувати pkg і замінити файл, але я не знаю, як знову упакувати на pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html


(Для майбутніх відвідувачів) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 може дати вам зрозуміти
james_womack

Здається, MacOS постачається з командою xar.
MikeP

Відповіді:


186

Пакети - це просто архіви .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. (Якщо ви можете отримати те ж саме, це робить справи ще простішими, але я не впевнений, що це майже так само повсюдно доступно.)


Так. Я раніше пробував цей метод (розпаковувати / упакувати без зміни файлів), але після встановлення цього кг не сталося нічого. У консолі я отримав таке повідомлення: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Немає такого файлу чи каталогу. Я дослідив, що старий файл корисного навантаження має /./ Project1.app / ..., а новий корисний набір має /Project1.app / ... всередині.
dream2work

Ну, ця остання частина легко. Я не знаю, чи має це значення, але це може бути (можливо, тому, що Бом і корисний вантаж не відповідають?). Просто використовуйте ./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
У мене не було ксара, тому я спробував: 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).


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" можна завантажити з наступного посилання:


2

Можливо, ви захочете заглянути в мою вилку pbzxтут: https://github.com/NiklasRosenstein/pbzx

Це дозволяє передавати файли pbzx, які не загорнуті в архів XAR. Я відчував це з останніми зображеннями дисків інструментів командного рядка XCode (наприклад, 10.12 XCode 8).

pbzx -n Payload | cpio -i
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.