我有一个由 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
7 回答
包只是具有不同扩展名和指定文件层次结构的 .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 回答启发的 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)。
除了@abarnert 所说的之外,我今天不得不发现,cpio
Mountain Lion 上的默认实用程序默认使用不同的存档格式(不确定是哪种),即使手册页说明它将使用旧的 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”命令可以从以下链接下载:
你可能想看看我在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。
用于提取 pkg 的 Bash 脚本:(受此答案启发: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 包。