110

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

4

7 回答 7

200

包只是具有不同扩展名和指定文件层次结构的 .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)。(如果你能同上,那会让事情变得更容易,但我不确定这是否几乎无处不在。)

于 2012-07-02T19:23:15.533 回答
23

这是一个受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)。

于 2014-05-30T09:00:50.353 回答
4

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

find ./Foo.app | cpio -o --format odc | gzip -c > Payload
于 2013-02-27T10:02:28.177 回答
4

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

pbzx <pkg> | cpio -idmu

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

于 2015-01-09T15:39:55.837 回答
3

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

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

pbzx -n Payload | cpio -i
于 2017-01-11T18:01:29.417 回答
1

如果您在 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。

于 2021-02-24T19:00:36.457 回答
1

用于提取 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 包。

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

于 2021-11-06T22:59:15.997 回答