如何检测一个 .deb 软件包的架构?

在一个声明为32位的存储库中有一个.deb软件包,但是安装的是64位的二进制文件。这种情况发生在通过存储库使用apt-get安装以及下载.deb文件后运行dpkg -i命令进行安装时。
如果我安装这个文件来尝试,它会升级/覆盖我现有的32位应用程序,导致无法再运行它(在15.04 32位Ubuntu上)。当这种情况首次发生时,我使用which命令搜索已安装的可执行文件,并使用file命令检查其类型,结果证明它是一个64位的ELF二进制文件。
$ file qtox
qtox: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped

所以在维护者修复问题之前,我该如何确定一个软件包(来自仓库或.deb文件)包含哪种架构呢?
我尝试了仓库版本的apt-cache show和apt-cache policy,以及.deb文件的dpkg -I,但它们都报告32位,这是错误的。
除了访问软件包的元信息(我认为这就是我尝试的命令所做的),显然不适用于找到所包含可执行文件的真实架构,还有其他方法吗?

1那是什么包裹? - Pilot6
@Pilot6 我遇到问题的具体软件包是qtox(.deb文件的直接下载链接),但我希望得到一个通用答案。Tox团队不得不将所有东西迁移到另一个域名,因为旧域名的所有者偷走了他们的钱并逃走了... 他们还没有完全解决所有问题。 - Byte Commander
只是提供信息:关于这个问题的qtox软件包现在已经在他们的存储库中得到更新,不再包含错误的架构。 - Byte Commander
3个回答

创建一个脚本,在我的例子中是foo
#!/bin/bash

# Create a temporary folder in /tmp
dir=$(mktemp -d)

# Extract the deb file
dpkg -x "$1" "$dir"

printf "\n%s\n\n" "$1"

# Show the package architecture information
dpkg --info $1 | \
    awk '/Architecture/ {printf "defined dpkg architecture is:\t%s\n", $2}'

# Show the executable format via find and awk for ELF
find $dir -type f -exec file -b {} \; | \
        sort -u | \
        awk '/ELF/ {printf "executable format is: \t\t%s\n", $0}'

rm -rf "$dir"

exit 0

使用方法

./foo <deb_file>

例子

% ./foo qtox_1.1\~git20150707.cfeeb03-97_i386.deb

qtox_1.1~git20150707.cfeeb03-97_i386.deb

defined dpkg architecture is:   i386
executable format is :          ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped

该死,它不让我更改编辑说明。我本来想写:“使用awk的printf,添加了语法高亮”。 - muru
@muru 抱歉,忘记了awk的printf o_O - A.B.

一个DEB包只是一个具有非常特定内容的存档文件。您可以使用任何喜欢的存档管理器(如File Roller或其他)打开它,其内容会按照将其解压到/的方式布局。您只需要找到一个二进制文件并查询其文件类型。通常情况下这是不必要的 - 如果文件名中包含i386,那么它应该是i386。您的情况明显异常,所以我想知道包维护者是如何让这种情况发生的。

它起作用了。我用我的压缩文件管理器打开了.deb文件,进入压缩文件内的/usr/bin目录,并提取了qtox二进制文件。在该文件上运行file命令产生了已知的64位描述。如果现在已知文件内的二进制位置,您是否可以将这个过程自动化一些?一个小脚本可以自动打开存档,将二进制文件提取到我的主目录或任何临时目录,打印其file输出,然后再删除它将是最好的答案。 - Byte Commander

每个deb软件包都会声明一个架构,例如“i386”或“all”。然而,这只是一种声明,并且它可能被错误地声明(有意为之,或者在某些软件包构建脚本中出现错误)。
你可以采取什么措施来验证真实的软件包架构:
# verify, if package supports multiple architectures (and possibly has some bug):
dpkg --print-foreign-architectures package.deb

# unpack and check executables inside:
dpkg --unpack package.deb
dpkg --contents package.deb |grep ^-rwxr-xr-x |awk "{ print \$6 }" |grep -v /etc/

# and then check a few random unpacked executables using:
file ./usr/bin/some-executable

等一下,这个会解压包内容到 /usr/bin/ 吗???我不想让它散落在那里,特别是为了防止它覆盖我的当前安装的最新可用的真正的32位版本。而且我想在验证之后摆脱所有那些文件,所以请确保它们都保持在一个易于删除的临时文件夹中。 - Byte Commander
dpkg: error: --print-foreign-architectures takes no arguments - A.B.
dpkg --unpack package.deb给出了dpkg: 错误: 所请求的操作需要超级用户权限 - A.B.
1@A.B. 的回答接近了。你可以使用 dpkg-deb 将文件提取到当前目录:dpkg-deb --fsys-tarfile | tar x ./usr/bin。然后你可以执行:file ./usr/bin/qtox - muru
dpkg --unpack将文件提取到当前目录,而不是根目录。 - Tomasz Klim