Comment décompresser et emballer le fichier pkg?

99

J'ai un fichier pkg créé par Install Maker pour Mac. Je veux remplacer un fichier dans pkg. Mais je dois le faire sous le système Linux, car cela fait partie du processus de téléchargement. Lorsque l'utilisateur commence à télécharger le serveur de fichiers doit remplacer un fichier dans pkg. J'ai une solution pour décompresser pkg et remplacer un fichier mais je ne sais pas comment emballer à nouveau vers pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

dream2work
la source
(Pour les futurs visiteurs) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 pourrait vous donner un aperçu
james_womack
MacOS semble être fourni avec la commande xar.
MikeP

Réponses:

186

Les packages ne sont que des archives .xar avec une extension différente et une hiérarchie de fichiers spécifiée. Malheureusement, une partie de cette hiérarchie de fichiers est une archive cpio.gz des installables réels, et c'est généralement ce que vous souhaitez modifier. Et il y a aussi un fichier Bom qui comprend des informations sur les fichiers à l'intérieur de cette archive cpio, et un fichier PackageInfo qui comprend des informations récapitulatives.

Si vous avez vraiment juste besoin de modifier l'un des fichiers d'informations, c'est simple:

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

Mais si vous devez éditer les fichiers installables:

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

Je crois que vous pouvez obtenir mkbom (et lsbom) pour la plupart des distributions Linux. (Si vous pouvez obtenir la même chose, cela rend les choses encore plus faciles, mais je ne suis pas sûr que ce soit presque aussi disponible partout.)

Abarnert
la source
Oui. J'ai déjà essayé cette méthode (décompressez / pack uniquement sans changer de fichier), mais après l'installation de ce paquet, rien ne s'est passé. Dans la console, j'ai reçu ce message: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Aucun fichier ou répertoire de ce type. J'ai étudié que l'ancien fichier Payload a /./ Project1.app / ... et que le nouveau payload a /Project1.app / ... à l'intérieur.
dream2work
Eh bien, cette dernière partie est facile. Je ne sais pas si cela fait une différence, mais cela pourrait (peut-être parce que le Bom et la Payload ne correspondent pas?). Utilisez simplement ./Foo.app au lieu de Foo.app dans la commande find | cpio | gzip. Je vais modifier la réponse.
abarnert le
4
@abarnert: au lieu de cat Payload | gunzip -dc |cpio -ivous pouvez simplement utilisertar xzvf Payload
ccpizza
Je reçois une erreur en cours d'exécution cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. J'essaie d'ouvrir à BSD.pkgpartir du package d'installation OS X Yosemite.
shrx
1
Je n'avais pas de xar alors j'ai essayé: 7z x <file>.pkget ça a marché.
21

Voici un script bash inspiré de la réponse d' abarnert qui décompressera un paquet nommé MyPackage.pkgdans un sous-dossier nommé MyPackage_pkgpuis ouvrira le dossier dans le Finder.

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

Usage:

    pkg-upack.sh MyPackage.pkg

Attention: cela ne fonctionnera pas dans tous les cas, et échouera avec certains fichiers, par exemple les PKG dans le programme d'installation du système OSX. Si vous voulez jeter un œil à l'intérieur du fichier pkg et voir ce qu'il contient, vous pouvez essayer SuspiciousPackage (application gratuite), et si vous avez besoin de plus d'options telles que le décompression sélective de fichiers spécifiques, jetez un œil à Pacifist (nagware).

ccpizza
la source
2
Utilisez pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i pour les archives plus récentes (extrait d'ici: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor
3

En plus de ce que @abarnert a dit, j'ai dû découvrir aujourd'hui que l' cpioutilitaire par défaut sur Mountain Lion utilise un format d'archive différent par défaut ( je ne sais pas lequel), même avec la page de manuel indiquant qu'il utiliserait l'ancien format cpio / odc. Donc, si quelqu'un tombe sur le cpio read error: bad file formatmessage en essayant d'installer ses paquets manipulés, assurez-vous d'inclure le format dans l'étape de reconditionnement:

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

@shrx J'ai réussi à décompresser le BSD.pkg (qui fait partie du programme d'installation de Yosemite) en utilisant la commande "pbzx".

pbzx <pkg> | cpio -idmu

La commande "pbzx" peut être téléchargée à partir du lien suivant:

h6ah4i
la source
2

Vous voudrez peut-être regarder dans ma fourchette d' pbzxici: https://github.com/NiklasRosenstein/pbzx

Il vous permet de diffuser des fichiers pbzx qui ne sont pas enveloppés dans une archive XAR. J'ai fait l'expérience de cela avec des images de disque récentes des outils de ligne de commande XCode (par exemple 10.12 XCode 8).

pbzx -n Payload | cpio -i
Niklas R
la source