从命令行中将.xip文件解压到文件夹中?

41

苹果偶尔会使用一种专有的XIP文件格式,尤其是在分发Xcode版本时使用。它类似于zip,但是被签名,使得接收系统可以验证它。当打开(双击)一个XIP文件时,Archive Utility将展开它,但仅当数字签名完好无损时。

有人知道如何通过终端命令行将XIP文件提取到指定文件夹吗?如果签名无效,有没有解压此类型文件的方法?


如果只是一个压缩包,那么普通的解压工具应该就可以了。或者你也想要验证签名吗? - halfer
2
它不仅仅是一个签名的zip文件;它是一个签名的xar归档文件,通常应用基于LZMA的压缩。 - Geoff Nixon
下面@Geoff Nixon提供的答案对我有效。 - rexford
@antony-raphel,下面的回答是否充分回答了您的问题? - Geoff Nixon
这回答了你的问题吗?如何使用命令行提取 xip 存档? - Geoff Nixon
6个回答

56

也许尝试一下:

xip -x [.xip文件路径]

这将把存档解压到您当前的工作目录中。

至于提取到特定目录,没有明确的选项可以实现此功能,但 xip -x 会将其解压缩到当前的工作目录。因此,切换到你想要提取文件的目录后使用cd命令应该就能够运行;如果需要自动化此过程,可以编写一个脚本:

#!/bin/sh

xipfile="$(cd $(dirname "$1"); pwd -P)/$(basename "$1")" # a portable "realpath"

cd "$2"
xip -x "$xipfile"

我想这应该能解决问题吧?


8
你是怎么发现 "-x" 标志的?它既没有在 man 手册中列出,也没有在命令的帮助文档中提及... - rexford
8
我敢说,苹果大部分的实用程序都有隐藏的标志。不幸的是,找到它们并不是一个直截了当的过程。事实上,我刚刚在 StackOverflow 上问了这个问题(就是如何更好地找到它们)。但简短的答案是,在二进制文件上使用 /usr/bin/strings 命令,然后查找可能的选项。 - Geoff Nixon
2
谢谢!这个方法可以提取Xcode_9.4.1.xip文件。 - Patrick D
1
@HappyFace 你说得对,x标志在使用strings命令输出时不再明显。我认为这是从Xcode 10开始的。也许苹果公司已经开始更彻底地剥离他们的二进制文件,或者这是有意的混淆。然而,对于可用代码的Darwin部分,这些选项也可以在此处找到:https://opensource.apple.com/source/cctools/cctools-886/misc/strings.c.auto.html(参见第205行)。还有很多其他带有隐藏选项的实用程序可以通过这种方式找到。 - Geoff Nixon
1
尽管这现在是“man xip”中记录的行为,但还有一个问题。当我在外部驱动器上使用“xip -x”对Xcode 13.3.1的存档进行操作时,$TMPDIR至少暂时获得了一个17Gb的Xcode工作副本。这就是为什么安装过程很疯狂并且通常需要50Gb +的原因:同时存在于不同位置的三种不同变体的Xcode。 - Stuart Watt
显示剩余3条评论

25
我建议只需将压缩文件解压到您想要的文件夹中,然后尝试以下操作:
xar -xf file.xip -C /path/to/target

(and/or)
tar -zxvf file.xip -C /path/to/target
xartar 命令以原始格式提取 .xip 文件的“内容”和“元数据”。使用 pbzx 流解析器来提取压缩的 lzma “Payload” 格式的“内容”;该格式类似于包安装程序中找到的格式(例如,.pkg)。您可以从此处编译 pbzx 源代码,或者下载已编译二进制文件并将其安装到/usr/local/bin,然后调用pbzx 命令。
pbzx -n Content | cpio -i

命令解析完内容后,你应该能够得到在.xip压缩包中的任何东西的原始形式。

有用/附加信息:

$ pkgutil --check-signature file.xip 

Xcode_9_beta_2.xip 返回:

Package "Xcode_9_beta_2.xip":
   Status: signed Apple Software
   Certificate Chain:
    1. Software Update
       SHA1 fingerprint: 1E 34 E3 91 C6 44 37 DD 24 BE 57 B1 66 7B 2F DA 09 76 E1 FD
       -----------------------------------------------------------------------------
    2. Apple Software Update Certification Authority
       SHA1 fingerprint: FA 02 79 0F CE 9D 93 00 89 C8 C2 51 0B BC 50 B4 85 8E 6F BF
       -----------------------------------------------------------------------------
    3. Apple Root CA
       SHA1 fingerprint: 61 1E 5B 66 2C 59 3A 08 FF 58 D1 4A E2 24 52 D1 98 DF 6C 60

注:

重要提示:从macOS Sierra开始,仅扩展由Apple签名的XIP归档文件。一直在使用XIP归档文件的开发人员需要切换到使用已签名的安装程序包或磁盘映像。

OS X手册页面: xip


我遇到了一个错误: 存档:Xcode_8.1.xip 未找到中央目录签名。这个文件要么不是一个压缩文件,要么它构成了多部分存档的一个磁盘。在后一种情况下,中央目录和zipfile注释将被发现在此存档的最后一个磁盘上。注意:Xcode_8.1.xip可能是一个普通的可执行文件,而不是一个存档。 - Antony Raphel
当您双击文件时会发生什么? - l'L'l
1
它打开默认的归档实用程序以验证签名并提取文件。但是,在完成验证之前出现错误。 - Antony Raphel
"unzip"不起作用。 它在10.12.6上给了我一个错误:“未找到中央目录签名”。 尝试使用最新的Xcode 9 beta版本。 - Thomas Tempelmann
1
请注意,在您引用的 man 手册中未记录,xip 实用程序有一个简单的 -x 选项(请参见我的替代答案)。但是这并不验证签名,我认为您提供的“有用/附加信息”部分可能是唯一实用的身份验证方式。因此,最好的答案可能是像这样的东西: pkgutil --verify-signature [xip 文件] && xip -x [xip 文件] - Geoff Nixon
显示剩余5条评论

22

你可以打开归档工具本身,进入偏好设置并设置特定的目标文件夹,然后双击该文件。这样你就可以将其扩展到特定的目标位置了。;-)


我对这个解决方案感到更加安全。只是需要注意的是,实际上应该进入“首选项” :) - Gobe
在 Monterey (12.6.3) 中,似乎现在不可能将 Xcode.xib 解压到特定文件夹 - 它总是首先被提取到引导卷上的 tmp 文件夹中 - 如果那里没有足够的空间,整个过程将失败。看起来没有办法绕过这个问题。:( - Thomas Tempelmann

7

您可以通过打开Archive Utility(可以通过spotlight搜索或launchpad打开)来更改输出。接着,前往Archive Utility > 首选项 (Command+,)。然后,前往保存展开的文件 > 到...,您就可以更改输出目录。 :)

更简单的方法:打开"Archive Utility"并打开它的首选项,然后更改它可以提取文件的位置。另外,Archive Utility 可以 打开 .xip 文件。


很遗憾,“保存展开的文件”没有“提示选择文件夹”的选项。 - Dave Nottage

1

(对于带有有效签名的存档文件。)

从目标文件夹中,创建一个指向 .xip 存档文件的符号链接,然后使用该链接进行扩展(完成后再删除链接)。示例:

cd /Applications
ln -s /Volumes/SomewhereElse/Xcode.xip
xip --expand Xcode.xip
rm Xcode.xip

以下内容不涉及多余的符号链接,并且对我来说运行良好,可能是您选项的简化版本:cd /Applications && xip --expand ~/Downloads/Xcode.xip — 请根据需要将 ~/Downloads/Xcode.xip/Applications 替换为源路径和目标路径。 - akasaka

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接