¿Cómo desempaquetar y empaquetar el archivo pkg?

99

Tengo un archivo pkg creado por Install Maker para Mac. Quiero reemplazar un archivo en pkg. Pero debo hacer esto bajo el sistema Linux, porque esto es parte del proceso de descarga. Cuando el usuario comienza a descargar archivos, el servidor debe reemplazar un archivo en el paquete. Tengo una solución para descomprimir un paquete y reemplazar un archivo, pero no sé cómo empacar nuevamente en un paquete. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

dream2work
fuente
(Para futuros visitantes) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 podría darle una idea
james_womack
MacOS parece venir con el comando xar.
MikeP

Respuestas:

186

Los paquetes son simplemente archivos .xar con una extensión diferente y una jerarquía de archivos especificada. Desafortunadamente, parte de esa jerarquía de archivos es un archivo cpio.gz de los archivos instalables reales y, por lo general, eso es lo que desea editar. Y también hay un archivo Bom que incluye información sobre los archivos dentro de ese archivo cpio y un archivo PackageInfo que incluye información resumida.

Si realmente solo necesita editar uno de los archivos de información, es simple:

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

Pero si necesita editar los archivos instalables:

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

Creo que puede obtener mkbom (y lsbom) para la mayoría de las distribuciones de Linux. (Si puede obtener lo mismo, eso facilitará aún más las cosas, pero no estoy seguro de que esté disponible de manera tan ubicua).

abarnert
fuente
Si. He probado este método antes (solo desempaquetar / empaquetar sin cambiar ningún archivo), pero después de instalar este paquete no pasó nada. En la consola recibí este mensaje: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): No existe tal archivo o directorio. He investigado que el antiguo archivo de carga tiene /./ Project1.app / ... y la nueva carga tiene /Project1.app / ... dentro.
dream2work
Bueno, esa última parte es fácil. No sé si hace una diferencia, pero podría hacerlo (¿quizás porque el Bom y el Payload no coinciden?). Simplemente use ./Foo.app en lugar de Foo.app en el comando find | cpio | gzip. Editaré la respuesta.
abarnert
4
@abarnert: en lugar de cat Payload | gunzip -dc |cpio -isimplemente podría usartar xzvf Payload
ccpizza
Me aparece un error de ejecución cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. Estoy intentando abrir BSD.pkgdesde el paquete de instalación de OS X Yosemite.
Shrx
1
No tenía xar, así que lo intenté: 7z x <file>.pkgy funcionó.
21

Aquí hay un script bash inspirado en la respuesta de abarnert que descomprimirá un paquete nombrado MyPackage.pkgen una subcarpeta nombrada MyPackage_pkgy luego abrirá la carpeta en Finder.

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

Uso:

    pkg-upack.sh MyPackage.pkg

Advertencia: Esto no funcionará en todos los casos y fallará con ciertos archivos, por ejemplo, los PKG dentro del instalador del sistema OSX. Si desea echar un vistazo dentro del archivo pkg y ver qué hay dentro, puede probar SuspiciousPackage (aplicación gratuita), y si necesita más opciones, como descomprimir selectivamente archivos específicos, eche un vistazo a Pacifist (nagware).

ccpizza
fuente
2
Utilice pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i para archivos más nuevos (tomado de aquí: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor
3

Además de lo que dijo @abarnert, hoy tuve que descubrir que la cpioutilidad predeterminada en Mountain Lion usa un formato de archivo diferente por defecto (no estoy seguro de cuál), incluso con la página de manual que indica que usaría el antiguo formato cpio / odc. Por lo tanto, si alguien se topa con el cpio read error: bad file formatmensaje mientras intenta instalar sus paquetes manipulados, asegúrese de incluir el formato en el paso de volver a empaquetar:

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

@shrx He logrado descomprimir el BSD.pkg (parte del instalador de Yosemite) usando el comando "pbzx".

pbzx <pkg> | cpio -idmu

El comando "pbzx" se puede descargar desde el siguiente enlace:

h6ah4i
fuente
2

Es posible que desee mirar en mi bifurcación de pbzxaquí: https://github.com/NiklasRosenstein/pbzx

Le permite transmitir archivos pbzx que no están empaquetados en un archivo XAR. He experimentado esto con imágenes de disco de herramientas de línea de comandos de XCode recientes (por ejemplo, 10.12 XCode 8).

pbzx -n Payload | cpio -i
Niklas R
fuente