Como descompactar e empacotar o arquivo pkg?

99

Eu tenho um arquivo pkg criado pelo Install Maker para Mac. Quero substituir um arquivo no pacote. Mas devo fazer isso no sistema Linux, porque isso faz parte do processo de download. Quando o usuário começa a baixar o arquivo, o servidor deve substituir um arquivo no pacote. Eu tenho uma solução como descompactar pkg e substituir um arquivo, mas não sei como empacotar novamente para pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

dream2work
fonte
(Para futuros visitantes) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 pode lhe dar uma visão
james_womack
MacOS parece vir com o comando xar.
MikeP de

Respostas:

186

Os pacotes são apenas arquivos .xar com uma extensão diferente e uma hierarquia de arquivo especificada. Infelizmente, parte dessa hierarquia de arquivos é um arquivo cpio.gz dos instaláveis ​​reais e geralmente é isso que você deseja editar. E também há um arquivo Bom que inclui informações sobre os arquivos dentro desse arquivo cpio e um arquivo PackageInfo que inclui informações resumidas.

Se você realmente precisa apenas editar um dos arquivos de informação, é simples:

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

Mas se você precisar editar os arquivos instaláveis:

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

Eu acredito que você pode obter mkbom (e lsbom) para a maioria das distros Linux. (Se você conseguir o mesmo, isso torna as coisas ainda mais fáceis, mas não tenho certeza se isso está quase onipresente.)

abarnert
fonte
Sim. Eu tentei este método antes (apenas descompacte / empacote sem alterar nenhum arquivo), mas depois de instalar este pacote nada aconteceu. No console, recebi esta mensagem: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Não existe esse arquivo ou diretório. Eu investiguei que o antigo arquivo de carga útil tem /./ Project1.app / ... e a nova carga tem /Project1.app / ... dentro.
dream2work
Bem, essa última parte é fácil. Não sei se faz diferença, mas pode (talvez porque o Bom e o Payload não combinam?). Basta usar ./Foo.app em vez de Foo.app no ​​comando find | cpio | gzip. Vou editar a resposta.
abarnert
4
@abarnert: em vez de cat Payload | gunzip -dc |cpio -ivocê simplesmente pode usartar xzvf Payload
ccpizza
Eu recebo um erro de funcionamento cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. Estou tentando abrir a BSD.pkgpartir do pacote de instalação do OS X Yosemite.
Shrx
1
Eu não tinha xar, então tentei: 7z x <file>.pkge funcionou.
21

Aqui está um script bash inspirado na resposta de abarnert que descompactará um pacote nomeado MyPackage.pkgem uma subpasta chamada MyPackage_pkge então abrirá a pasta no Finder.

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

Uso:

    pkg-upack.sh MyPackage.pkg

Aviso: Isso não funcionará em todos os casos e falhará com alguns arquivos, por exemplo, os PKGs dentro do instalador do sistema OSX. Se você quiser espiar dentro do arquivo pkg e ver o que está dentro, você pode tentar o SuspiciousPackage (aplicativo gratuito) e, se precisar de mais opções, como descompactar seletivamente arquivos específicos, dê uma olhada no Pacifist (nagware).

ccpizza
fonte
2
Use pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i para arquivos mais recentes (retirado daqui: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor
3

Além do que @abarnert disse, hoje tive que descobrir que o cpioutilitário padrão no Mountain Lion usa um formato de arquivo diferente por padrão (não tenho certeza de qual), mesmo com a página de manual informando que ele usaria o antigo formato cpio / odc. Portanto, se alguém se deparar com a cpio read error: bad file formatmensagem ao tentar instalar seus pacotes manipulados, certifique-se de incluir o formato na etapa de reembalagem:

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

@shrx Consegui descompactar o BSD.pkg (parte do instalador Yosemite) usando o comando "pbzx".

pbzx <pkg> | cpio -idmu

O comando "pbzx" pode ser baixado do seguinte link:

h6ah4i
fonte
2

Você pode querer dar uma olhada em meu garfo pbzxaqui: https://github.com/NiklasRosenstein/pbzx

Ele permite que você transmita arquivos pbzx que não estão agrupados em um arquivo XAR. Eu experimentei isso com imagens de disco de ferramentas de linha de comando XCode recentes (por exemplo, XCode 8 de 10.12).

pbzx -n Payload | cpio -i
Niklas R
fonte