5 题: 如何解压缩和打包pkg文件?

在...创建的问题 Tue, Aug 11, 2015 12:00 AM

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

    
85
  1. (对于未来的访客) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 可能会给你提供见解
    2015-02-11 23:49:51Z
  2. MacOS似乎带有xar命令。
    2016-08-26 20:39:12Z
  3. 醇>
    5答案                              5 跨度>                         

    包只是.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)。 (如果你可以同上,那会让事情变得更容易,但我不确定这是否几乎无处不在。)

        
    165
    2012-07-03 16:58:31Z
    1. 是的。我之前尝试过这种方法(只解包/打包而不更改任何文件),但安装完毕后这个pkg什么都没发生。在控制台中,我收到了以下消息:posix_spawn(“/Library /Application Support /Project1 /Project1.app /Contents /MacOS /Project1”,...):没有这样的文件或目录。我调查过旧的Payload文件有/./Project1.app /...而新的有效负载有/Project1.app /... inside。
      2012-07-03 08:33:45Z
    2. 好吧,最后一部分很简单。我不知道它是否有所作为,但它可能(可能是因为Bom和Payload不匹配?)。只需在find | cpio | gzip命令中使用./Foo.app而不是Foo.app。我会编辑答案。
      2012-07-03 16:58:21Z
    3. @ abarnert:而不是cat Payload | gunzip -dc |cpio -i你可以简单地使用tar xzvf Payload
      2014-05-21 16:52:07Z
    4. 运行cat Payload | gunzip -dc |cpio -i时遇到错误:gunzip: unknown compression format; 0 blocks我正在尝试从OS X Yosemite安装包打开BSD.pkg
      2014-10-29 10:43:35Z
    5. 我没有xar所以我尝试过:7z x <file>.pkg并且它有效。
      2015-01-25 14:52:18Z
    6. 醇>

    受到 abarnert 答案的启发,我制作了一个bash脚本,将名为MyPackage.pkg的软件包解压缩到一个名为的子文件夹中MyPackage_pkg然后在Finder中打开文件夹。如果您不想使用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)。

        
    17
    2017-05-23 11:55:03Z
    1. tar xvf Payload在Yosemite上工作得很好
      2016-01-25 02:37:56Z
    2. tar:无法识别的存档格式
      2016-11-08 18:14:54Z
    3. 使用pbzx -n macOSUpd10.12.1.pkg /Payload | cpio -i用于较新的档案(摘自此处: stackoverflow.com/a/41598227/5688277
      2017-11-30 12:10:15Z
    4. 醇>

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

     
    find ./Foo.app | cpio -o --format odc | gzip -c > Payload
    
        
    3
    2013-02-27 10:02:28Z

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

    pbzx <pkg> | cpio -idmu

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

    3
    2015-01-26 09:40:05Z

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

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

     
    pbzx -n Payload | cpio -i
    
        
    2
    2017-01-11 18:01:29Z
来源放置 这里