2012-07-02 68 views
71

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

+0

(Para los futuros visitantes) http://gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10/ podría darle una visión –

+0

MacOS parece venir con el comando XAR . – MikeP

Respuesta

137

Los paquetes son simplemente .xar archivos con una extensión diferente y una jerarquía de archivos especificado. Desafortunadamente, parte de esa jerarquía de archivos es un archivo cpio.gz de las instancias reales, y generalmente 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 de resumen.

Si realmente sólo tiene que editar uno de los archivos de información, eso es simple:

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

Pero si tiene que 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 se puede conseguir mkbom (y lsbom) para la mayoría de las distribuciones de Linux. (Si puede hacerlo, eso hace que las cosas sean aún más fáciles, pero no estoy seguro si eso está disponible de forma casi omnipresente).

+0

Sí. He intentado este método antes (solo desempaquetar/empacar sin cambiar ningún archivo), pero después de instalar este paquete no pasó nada. En la consola Tengo este mensaje: posix_spawn ("/ Library/Application Support/Project1/Project1.app/Contents/MacOS/Proyecto1", ...): No existe el fichero o directorio. he investigado ese archivo de carga útil de edad tiene /./ Project1.app/... y la nueva carga útil tiene /Project1.app/... en el interior. – dream2work

+0

Bueno, esa última parte es fácil. No sé si hace una diferencia, pero podría (¿quizás porque el Bom y la carga no coinciden?). Simplemente use ./Foo.app en lugar de Foo.app en el comando find | cpio | gzip. Editaré la respuesta. – abarnert

+3

@abarnert: en lugar de 'cat Carga útil | gunzip -dc | cpio -i' simplemente podría usar 'tar xzvf Payload' – ccpizza

3

Además de lo que dijo @abarnert, hoy tuve que descubrir que la utilidad predeterminada es cpio en Mountain Lion usa un formato de archivo diferente por defecto (no estoy seguro de cuál), incluso con la página man indicando que usaría el formato cpio/odc anterior. Por lo tanto, si alguien tropieza con el mensaje cpio read error: bad file format al intentar instalar su/sus paquetes manipulados, asegúrese de incluir el formato en la etapa de re-pack:

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

Inspirado por la respuesta de abarnert, hice una fiesta script que descomprimirá un paquete llamado MyPackage.pkg en una subcarpeta llamada MyPackage_pkg y luego abrirá la carpeta en Finder. Elimine la última línea si no desea el paso 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 solo desea echar un vistazo dentro del archivo pkg y ver qué hay adentro, puede probar SuspiciousPackage (aplicación gratuita), y si desea realizar un desempaquetado serio, incluida la extracción de archivos específicos, eche un vistazo a Pacifist (nagware).

+0

'tar xvf Payload' funcionó muy bien en Yosemite – cde

+1

tar: Formato de archivo no reconocido – malhal

+1

Usar pbzx -n macOSUpd10.12.1.pkg/Payload | cpio -i para archivos más nuevos (tomado de aquí: https://stackoverflow.com/a/41598227/5688277) –

2

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

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

2

Es posible que desee buscar en el tenedor de pbzx aquí: https://github.com/NiklasRosenstein/pbzx

Le permite transmitir archivos pbzx que no son wra pip en un archivo XAR. Lo he experimentado con las recientes imágenes de disco de las herramientas de línea de comandos de XCode (por ejemplo, 10.12 XCode 8).

pbzx -n Payload | cpio -i 
Cuestiones relacionadas