如何解压缩和打包pkg文件?

dre*_*ork 87 macos pkg-file

我有一个由Install Maker for Mac创建的pkg文件.我想用pkg替换一个文件.但我必须在Linux系统下这样做,因为这是下载过程的一部分.当用户开始下载文件服务器时必须用pkg替换一个文件.我有一个解决方案如何解压缩pkg并更换文件,但我不知道如何再次打包到pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

aba*_*ert 168

包只是.xar存档,具有不同的扩展名和指定的文件层次结构.不幸的是,该文件层次结构的一部分是实际可安装程序的cpio.gz存档,通常这就是您要编辑的内容.还有一个Bom文件,其中包含有关该cpio存档内文件的信息,以及一个包含摘要信息的PackageInfo文件.

如果你真的需要编辑其中一个信息文件,那很简单:

mkdir Foo
cd Foo
xar -xf ../Foo.pkg
# edit stuff
xar -cf ../Foo-new.pkg *
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要编辑可安装文件:

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
Run Code Online (Sandbox Code Playgroud)

我相信你可以为大多数Linux发行版获得mkbom(和lsbom).(如果你可以得到同样的东西,这会让事情变得更容易,但我不确定这是否几乎无处不在.)

  • @abarnert:而不是`cat Payload | gunzip -dc | cpio -i`你可以简单地使用`tar xzvf Payload` (4认同)

ccp*_*zza 18

受到来自abarnert的答案的启发,我创建了一个bash脚本,它将命名MyPackage.pkg为命名为子文件夹的包解压缩MyPackage_pkg,然后在Finder中打开该文件夹.如果您不想使用Finder步骤,请删除最后一行.

    #!/usr/bin/env bash
    filename="$*"
    dirname="${filename/\./_}"
    pkgutil --expand "$filename" "$dirname"
    cd "$dirname"
    tar xvf Payload
    open .
Run Code Online (Sandbox Code Playgroud)

用法:

    pkg-upack.sh MyPackage.pkg
Run Code Online (Sandbox Code Playgroud)

警告:这在所有情况下都不起作用,并且会因某些文件而失败,例如OSX系统安装程序中的PKG.如果您只想查看pkg文件并查看其中的内容,可以尝试使用SuspiciousPackage(免费应用程序),如果您想进行一些严格的解包,包括提取特定文件,那么请看看Pacifist(nagware).

  • 使用pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i用于较新的归档文件(来自此处:https://stackoverflow.com/a/41598227/5688277) (2认同)

Nik*_*s R 6

您可能想查看我的分支pbzxhttps://github.com/NiklasRosenstein/pbzx

它允许您传输未包装在 XAR 存档中的 pbzx 文件。我在最近的 XCode 命令行工具磁盘映像(例如 10.12 XCode 8)中经历过这种情况。

pbzx -n Payload | cpio -i
Run Code Online (Sandbox Code Playgroud)