如何解包和打包 pkg 文件?

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

197097 次浏览

包裹只是。具有不同扩展名和指定文件层次结构的 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)。(如果你也可以这样做,事情就会变得更简单,但是我不确定这是否是无处不在的。)

除了@abarnert 所说的,我今天还发现 Mountain Lion 上的默认 cpio实用程序每个默认使用一种不同的归档格式(不确定是哪种) ,即使手册页声明它将使用旧的 cpio/odc 格式。因此,如果有人在试图安装他/她操纵的软件包时偶然发现了 cpio read error: bad file format消息,一定要在重新打包步骤中包含这种格式:

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

Here is a bash script inspired by Abarnert 的回答 which will unpack a package named MyPackage.pkg into a subfolder named MyPackage_pkg and then open the folder in 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 文件内部,看看里面有什么,你可以试试 可疑包裹(免费应用程序) ,如果你需要更多的选项,比如有选择地解压缩特定的文件,然后看看 和平主义者(nagware)。

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

pbzx <pkg> | cpio -idmu

「 pbzx 」命令可在以下连结下载:

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

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

pbzx -n Payload | cpio -i

如果您在安装 PKG 过程中遇到错误,那么我将提供另一个适用于我的过程(请注意对 xar、 cpio 和 mkbom 命令的小改动) :

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 --format odc --owner 0:80 | gzip -c > Payload
mkbom -u 0 -g 80 Foo.app Bom # or edit Bom
# edit PackageInfo
rm -rf Foo.app
cd ..
xar --compression none -cf ../Foo-new.pkg

产生的 PKG 将不会有压缩,cpio 现在使用 odc 格式并指定文件的所有者以及 mkbom。

Bash script to extract pkg: (Inspired by this answer:https://stackoverflow.com/a/23950738/16923394)

将以下代码保存到 $HOME/Downloads 文件夹中名为 pkg-upack.sh 的文件中

#!/usr/bin/env bash
filename="$*"
dirname="${filename/\./_}"
mkdir "$dirname"
# pkgutil --expand "$filename" "$dirname"
xar -xf "$filename" -C "$dirname"
cd "$dirname"/*.pkg
pwd
# tar xvf Payload
cat Payload | gunzip -dc |cpio -i
# cd usr/local/bin
# pwd
# ls -lt
# cp -i * $HOME/Downloads/

如果您使用的是 rudix 包,则取消注释最后四行。

用法:

    cd $HOME/Downloads
chmod +x ./pkg-upack.sh
./pkg-upack.sh MyPackage.pkg

使用 rudix.org (https://rudix.org)中的 ffmpeg 和 mawk 包在这个站点上搜索 ffmpeg 和 mawk 包进行了测试。

Source: My open Source project: https://sourceforge.net/u/nathan-sr/profile/来源: 我的开源项目: https://sourceforge.net/u/nathan-sr/profile/