Come decomprimere e comprimere il file pkg?


99

Ho un file pkg creato da Install Maker per Mac. Voglio sostituire un file in pkg. Ma devo farlo sotto il sistema Linux, perché questa è una parte del processo di download. Quando l'utente inizia a scaricare il file server deve sostituire un file in pkg. Ho una soluzione su come decomprimere pkg e sostituire un file ma non so come comprimere di nuovo in pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html


(Per i futuri visitatori) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 potrebbe darti un'idea
james_womack

MacOS sembra avere il comando xar.
MikeP

Risposte:


186

I pacchetti sono solo archivi .xar con un'estensione diversa e una gerarchia di file specificata. Sfortunatamente, parte di quella gerarchia di file è un archivio cpio.gz degli effettivi installabili, e di solito è quello che vuoi modificare. E c'è anche un file Bom che include informazioni sui file all'interno di quell'archivio cpio e un file PackageInfo che include informazioni di riepilogo.

Se hai davvero solo bisogno di modificare uno dei file di informazioni, è semplice:

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

Ma se devi modificare i file installabili:

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

Credo che tu possa ottenere mkbom (e lsbom) per la maggior parte delle distribuzioni Linux. (Se riesci a ottenere lo stesso, questo rende le cose ancora più facili, ma non sono sicuro che sia disponibile quasi ovunque.)


Sì. Ho già provato questo metodo (solo decomprimere / impacchettare senza modificare alcun file), ma dopo aver installato questo pacchetto non è successo nulla. Nella console ho ricevuto questo messaggio: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Nessun file o directory di questo tipo. Ho verificato che il vecchio file Payload ha /./ Project1.app / ... e il nuovo payload ha /Project1.app / ... all'interno.
dream2work

Bene, l'ultima parte è facile. Non so se fa la differenza, ma potrebbe (forse perché Bom e Payload non corrispondono?). Usa semplicemente ./Foo.app invece di Foo.app nel comando find | cpio | gzip. Modificherò la risposta.
abarnert

4
@abarnert: al posto di cat Payload | gunzip -dc |cpio -ipotresti semplicemente usaretar xzvf Payload
ccpizza

Ottengo un errore in esecuzione cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. Sto cercando di aprire BSD.pkgdal pacchetto di installazione di OS X Yosemite.
shrx

1
Non avevo xar quindi ho provato: 7z x <file>.pkge ha funzionato.

21

Ecco uno script bash ispirato alla risposta di abarnert che decomprimerà un pacchetto denominato MyPackage.pkgin una sottocartella denominata MyPackage_pkge quindi aprirà la cartella nel Finder.

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

Utilizzo:

    pkg-upack.sh MyPackage.pkg

Attenzione: questo non funzionerà in tutti i casi e fallirà con alcuni file, ad esempio i PKG all'interno del programma di installazione del sistema OSX. Se vuoi dare un'occhiata all'interno del file pkg e vedere cosa c'è dentro, puoi provare SuspiciousPackage (app gratuita) e se hai bisogno di più opzioni come decomprimere selettivamente file specifici, dai un'occhiata a Pacifist (nagware).


2
Usa pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i per gli archivi più recenti (tratto da qui: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor

3

Oltre a ciò che ha detto @abarnert, oggi ho dovuto scoprire che l' cpioutilità predefinita su Mountain Lion utilizza un formato di archivio diverso per impostazione predefinita (non sono sicuro di quale), anche con la pagina man che afferma che avrebbe utilizzato il vecchio formato cpio / odc. Quindi, se qualcuno si imbatte nel cpio read error: bad file formatmessaggio mentre tenta di installare i suoi pacchetti manipolati, assicurati di includere il formato nel passaggio di reimballaggio:

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

3

@shrx Sono riuscito a decomprimere BSD.pkg (parte dell'installer di Yosemite) usando il comando "pbzx".

pbzx <pkg> | cpio -idmu

Il comando "pbzx" può essere scaricato dal seguente link:


2

Potresti voler esaminare il mio fork di pbzxqui: https://github.com/NiklasRosenstein/pbzx

Ti consente di eseguire lo streaming di file pbzx che non sono inclusi in un archivio XAR. L'ho sperimentato con le recenti immagini del disco degli strumenti della riga di comando di XCode (ad es. 10.12 XCode 8).

pbzx -n Payload | cpio -i
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.