如何解压和打包pkg文件?


99

我有一个由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


(供将来的访问者使用)gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10可能会给您带来见解
james_womack

MacOS似乎带有xar命令。
MikeP

Answers:


186

程序包只是具有不同扩展名和指定文件层次结构的.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

我相信您可以在大多数Linux发行版中获得mkbom(和lsbom)。(如果您能够获得同上的体验,那将使事情变得更加容易,但是我不确定这是否几乎无所不在。)


是。我之前尝试过这种方法(仅解压/打包而不更改任何文件),但是在安装此pkg之后没有任何反应。在控制台中,我收到以下消息:posix_spawn(“ / Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1”,...):没有这样的文件或目录。我调查了旧的有效负载文件具有/./ Project1.app / ...,新的有效负载内部具有/Project1.app /...。
dream2work'7

好吧,最后一部分很容易。我不知道这是否有所不同,但可能会有所不同(也许是因为Bom和有效载荷不匹配?)。只需在find | cpio | gzip命令中使用./Foo.app而不是Foo.app。我将编辑答案。
abarnert'7

4
@abarnert:代替cat Payload | gunzip -dc |cpio -i您可以简单地使用tar xzvf Payload
ccpizza 2014年

我得到一个错误的运行cat Payload | gunzip -dc |cpio -igunzip: unknown compression format; 0 blocks。我正在尝试BSD.pkg从OS X Yosemite安装包中打开。
shrx 2014年

1
我没有xar,所以我尝试了:7z x <file>.pkg它奏效了。

21

这是一个受abarnert的回答启发的bash脚本,它将把名为的软件包解压缩到名为MyPackage.pkg的子文件夹中MyPackage_pkg,然后在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)。


2
使用pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i用于较新的存档(取自此处:stackoverflow.com/a/41598227/5688277
Adrian O'Connor

3

除了@abarnert所说的以外,我今天还必须找出cpioMountain Lion上的默认实用程序每个默认使用不同的存档格式(不确定哪个),即使手册页指出它将使用旧的cpio / odc格式。因此,如果有人cpio read error: bad file format在尝试安装其操作的软件包时偶然发现了该消息,请确保在重新打包步骤中包括以下格式:

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

3

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

pbzx <pkg> | cpio -idmu

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


2

您可能想看看我在pbzx这里的分叉:https : //github.com/NiklasRosenstein/pbzx

它允许您流式传输未包装在XAR归档文件中的pbzx文件。我在最近的XCode命令行工具磁盘映像(例如10.12 XCode 8)中经历了这一点。

pbzx -n Payload | cpio -i
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.