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

我有一个由安装Maker for Mac创build的pkg文件。 我想在pkg中replace一个文件。 但是我必须在Linux系统下这样做,因为这是下载过程的一部分。 当用户开始下载文件服务器时,必须用pkgreplace一个文件。 我有一个解决scheme如何解压包装和replace文件,但我不知道如何再包装到包装。 http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

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

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

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

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

 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 

我相信你可以得到mkbom(和lsbom)的大多数Linux发行版。 (如果你能得到同样的东西,那会让事情变得更容易,但是我不确定它是否可以无所不在。)

受到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 . 

用法:

  pkg-upack.sh MyPackage.pkg 

警告:这在任何情况下都不起作用,并且会在某些文件(例如OSX系统安装程序内的PKG)中失败。 如果你只是想偷看pkg文件,看看里面有什么,你可以尝试SuspiciousPackage (免费的应用程序),如果你想做一些严重的拆包,包括提取特定的文件,那么看看Pacifist (nagware)。

除了@abarnert所说的之外,我今天必须知道,Mountain Lion上的默认cpio实用程序在默认情况下使用不同的存档格式(不确定是哪个),甚至在手册页中指出它将使用旧的cpio / odc格式。 所以,如果有人在尝试安装他/她的操纵软件包时绊倒了cpio read error: bad file format消息,请务必在重新包装步骤中包含格式:

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

@shrx我已经成功地使用“pbzx”命令解压BSD.pkg(Yosemite安装程序的一部分)。

pbzx <pkg> | cpio -idmu

可以从以下链接下载“pbzx”命令:

  • pbxxstreamparsing器

你可能想看看我的fork的pbzx在这里: https : //github.com/NiklasRosenstein/pbzx

它允许您传输未包装在XAR归档中的pbzx文件。 我用最近的XCode命令行工具Disk Images(例如10.12 XCode 8)来体验这一点。

 pbzx -n Payload | cpio -i