如何解压缩和打包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