Wie entpacke und packe ich eine pkg-Datei?

99

Ich habe eine pkg-Datei, die von Install Maker für Mac erstellt wurde. Ich möchte eine Datei in pkg ersetzen. Aber ich muss dies unter Linux tun, da dies ein Teil des Download-Prozesses ist. Wenn der Benutzer mit dem Herunterladen des Dateiservers beginnt, muss eine Datei in pkg ersetzt werden. Ich habe eine Lösung, wie man pkg entpackt und eine Datei ersetzt, aber ich weiß nicht, wie man pkg wieder packt. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

dream2work
quelle
(Für zukünftige Besucher) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 könnte Ihnen einen Einblick geben
james_womack
MacOS scheint mit dem Befehl xar zu kommen.
MikeP

Antworten:

186

Pakete sind nur .xar-Archive mit einer anderen Erweiterung und einer angegebenen Dateihierarchie. Leider ist ein Teil dieser Dateihierarchie ein cpio.gz-Archiv der tatsächlich installierbaren Dateien, und normalerweise möchten Sie dies bearbeiten. Außerdem gibt es eine Bom-Datei mit Informationen zu den Dateien in diesem cpio-Archiv und eine PackageInfo-Datei mit zusammenfassenden Informationen.

Wenn Sie wirklich nur eine der Info-Dateien bearbeiten müssen, ist das ganz einfach:

mkdir Foo
cd Foo
xar -xf ../Foo.pkg
# edit stuff
xar -cf ../Foo-new.pkg *

Wenn Sie jedoch die installierbaren Dateien bearbeiten müssen:

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

Ich glaube, Sie können mkbom (und lsbom) für die meisten Linux-Distributionen bekommen. (Wenn Sie das Gleiche tun können, macht das die Sache noch einfacher, aber ich bin mir nicht sicher, ob das fast so allgegenwärtig ist.)

abarnert
quelle
Ja. Ich habe diese Methode schon einmal ausprobiert (nur entpacken / packen, ohne Dateien zu ändern), aber nach der Installation dieses Pakets ist nichts passiert. In der Konsole wurde folgende Meldung angezeigt: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Keine solche Datei oder kein solches Verzeichnis. Ich habe untersucht, dass die alte Payload-Datei /./ Project1.app / ... und die neue Payload /Project1.app / ... enthält.
Dream2work
Nun, dieser letzte Teil ist einfach. Ich weiß nicht, ob es einen Unterschied macht, aber es könnte sein (vielleicht, weil Bom und Payload nicht übereinstimmen?). Verwenden Sie einfach ./Foo.app anstelle von Foo.app im Befehl find | cpio | gzip. Ich werde die Antwort bearbeiten.
Abarnert
4
@abarnert: stattdessen cat Payload | gunzip -dc |cpio -ikönnten Sie einfach verwendentar xzvf Payload
ccpizza
Ich erhalte eine Fehlermeldung cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. Ich versuche, BSD.pkgüber das OS X Yosemite-Installationspaket zu öffnen .
Shrx
1
Ich hatte kein Xar, also habe ich es versucht: 7z x <file>.pkgund es hat funktioniert.
21

Hier ist ein Bash-Skript, das von abarnerts Antwort inspiriert ist und ein Paket mit dem Namen MyPackage.pkgin einen Unterordner mit dem Namen entpackt MyPackage_pkgund dann den Ordner im Finder öffnet.

    #!/usr/bin/env bash
    filename="$*"
    dirname="${filename/\./_}"
    pkgutil --expand "$filename" "$dirname"
    cd "$dirname"
    tar xvf Payload
    open .

Verwendung:

    pkg-upack.sh MyPackage.pkg

Warnung: Dies funktioniert nicht in allen Fällen und schlägt bei bestimmten Dateien fehl, z. B. den PKGs im OSX-Systeminstallationsprogramm. Wenn Sie einen Blick in die pkg-Datei werfen und sehen möchten, was sich darin befindet, können Sie SuspiciousPackage (kostenlose App) ausprobieren. Wenn Sie weitere Optionen benötigen, z. B. das selektive Entpacken bestimmter Dateien, schauen Sie sich Pacifist (Nagware) an.

ccpizza
quelle
2
Verwenden Sie pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i für neuere Archive (hier entnommen: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor
3

Zusätzlich zu dem, was @abarnert sagte, musste ich heute herausfinden, dass das Standarddienstprogramm cpioauf Mountain Lion standardmäßig ein anderes Archivformat verwendet (nicht sicher, welches), selbst wenn die Manpage angibt, dass es das alte cpio / odc-Format verwenden würde. Wenn also jemand cpio read error: bad file formatbeim Versuch, seine manipulierten Pakete zu installieren, auf die Nachricht stößt, müssen Sie das Format in den Schritt zum erneuten Packen aufnehmen:

find ./Foo.app | cpio -o --format odc | gzip -c > Payload
Malte Rohde
quelle
3

@shrx Es ist mir gelungen, die BSD.pkg (Teil des Yosemite-Installationsprogramms) mit dem Befehl "pbzx" zu entpacken.

pbzx <pkg> | cpio -idmu

Der Befehl "pbzx" kann über den folgenden Link heruntergeladen werden:

h6ah4i
quelle
2

Vielleicht möchten Sie in meine Gabelung von pbzxhier schauen : https://github.com/NiklasRosenstein/pbzx

Sie können damit pbzx-Dateien streamen, die nicht in ein XAR-Archiv eingebunden sind. Ich habe dies mit den neuesten XCode-Befehlszeilentools-Disk-Images (z. B. 10.12 XCode 8) erlebt.

pbzx -n Payload | cpio -i
Niklas R.
quelle