【问题标题】:How to unpack and pack pkg file?如何解压和打包 pkg 文件?
【发布时间】:2012-07-02 18:06:21
【问题描述】:

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

【问题讨论】:

标签: macos pkg-file


【解决方案1】:

包只是具有不同扩展名和指定文件层次结构的 .xar 存档。不幸的是,该文件层次结构的一部分是实际可安装文件的 cpio.gz 存档,通常这就是您要编辑的内容。还有一个包含该 cpio 存档中文件信息的 Bom 文件,以及一个包含摘要信息的 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", ...): No such file or directory。我调查过旧的 Payload 文件有 /./Project1.app/... 而新的有效载荷有 /Project1.app/... 里面。
  • 嗯,最后一部分很简单。我不知道它是否有区别,但它可能(也许是因为 Bom 和 Payload 不匹配?)。只需在 find|cpio|gzip 命令中使用 ./Foo.app 而不是 Foo.app 即可。我会编辑答案。
  • @abarnert:你可以简单地使用tar xzvf Payload而不是cat Payload | gunzip -dc |cpio -i
  • 运行cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format;0 blocks 时出错。我正在尝试从 OS X Yosemite 安装包中打开 BSD.pkg
  • 我没有 xar,所以我尝试了:7z x <file>.pkg,它成功了。
【解决方案2】:

这是一个受abarnert's answer启发的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)。

【讨论】:

【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    pbzx <pkg> | cpio -idmu

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

    【讨论】:

      【解决方案5】:

      您可能想在此处查看我的 pbzx 分支:https://github.com/NiklasRosenstein/pbzx

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

      pbzx -n Payload | cpio -i
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          提取 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/

          【讨论】:

            猜你喜欢
            • 2020-02-20
            • 2011-09-15
            • 2022-12-21
            • 1970-01-01
            • 2011-03-01
            • 2013-10-16
            • 2011-03-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多