提取 Debian 包
学习如何提取 Debian 包及其包含的内容。
Debian 软件包采用二进制格式,因此在文本编辑器中查看它们毫无意义。然而,该格式基于开放标准,有相应的工具可供检查和创建这些软件包。
文件名
撰写本文时,使用链接 https://packages.debian.org/stretch/bash 从某个镜像站点下载了适用于 amd64 架构的当前版本软件包。
下载的文件名为 bash_4.4-5_amd64.deb。该文件名包含四个部分:
- 软件包名称
bash。 - 版本号
4.4-5。 - 架构
amd64。 - 文件扩展名
.deb。
文件名、版本号和架构之间用下划线 _ 分隔。
由多个单词组成的软件包名称使用连字符 - 来分隔单词。例如,git-sh 软件包提供了一个专为与版本控制系统 git 配合使用而优化的 shell。版本号通常由上游版本号、一个连字符以及 Debian 构建编号组成。
内容
Debian 软件包是一个 ar 归档文件,其中包含三个文件:
debian-binarycontrol.tar.gzdata.tar.xz
第一个文件包含纯文本形式的格式版本号。自 2003 年以来,该版本号一直为 2.0,我们预计它在可预见的未来不会发生变化。
control.tar.gz 包含多个元数据文件,而 data.tar.xz 包含将被安装到目标机器文件系统中的文件。
我们可以使用如下命令提取这些文件:
1$ ar xv bash_4.4-5_amd64.deb
以下是来自 bash_4.4-5_amd64.deb 提取的文件:
从 bash_4.4-5_amd64.deb 软件包中提取的文件
1x - debian-binary 2x - control.tar.gz 3x - data.tar.xz
你可以在本课末尾的“实验区”中查看已提取的内容。
debian-binary 文件
debian-binary 文件包含一行纯文本,表示所使用的文件格式版本号,目前为 2.0。
控制归档文件
control.tar.gz 是一个经过 gzip 压缩的 tar 归档文件,但也可能是 xz 压缩的,扩展名表明了所使用的压缩算法。我们可以使用 tar 命令行程序来提取其中的文件:
1$ tar xvf control.tar.gz
以下是提取出的文件:
从 control.tar.gz 中提取的文件
1./ 2./conffiles 3./control 4./md5sums 5./postinst 6./postrm 7./preinst 8./prerm
数据归档文件
data.tar.xz 文件(旧版本中为 data.tar.gz,使用稍低效的 gzip 压缩)包含将在安装时逐个复制到目标文件系统的文件:
1$ tar tf data.tar.xz | head
以下是 data.tar.xz 中的文件内容:
从 data.tar.xz 中提取的文件
1./ 2./bin/ 3./bin/bash 4./etc/ 5./etc/bash.bashrc 6./etc/skel/ 7./etc/skel/.bash_logout 8./etc/skel/.bashrc 9./etc/skel/.profile 10./usr/
我们也可以直接使用命令 dpkg-deb -c <文件名> 从 .deb 文件中获取这些文件列表。
该归档文件包含文件和目录的权限、所有者和所属组信息,但仅以数字形式的 UID 和 GID 表示。
注意: 当
dpkg安装软件包时,它会验证每个文件(不包括目录)是否已被其他软件包安装过,如果发现文件冲突,则会报错。
实验区
-
提取 Debian 软件包文件的命令:
1$ ar xv bash_4.4-5_amd64.deb -
查看
debian-binary文件内容的命令:1$ cat debian-binary -
提取
control.tar.gz归档文件的命令:1$ tar xvf control.tar.gz -
提取
data.tar.xz归档文件的命令:1$ tar tf data.tar.xz | head
-
提取 Debian 软件包文件的命令:
1$ ar xv bash_4.4-5_amd64.deb -
查看
debian-binary文件内容的命令:1$ cat debian-binary -
提取
control.tar.gz归档文件的命令:1$ tar xvf control.tar.gz -
提取
data.tar.xz归档文件的命令:1$ tar tf data.tar.xz | head
让我们在下面的终端中尝试上述命令:
/dev/null && chpasswd <.password.txt && usermod -aG sudo user && cp -r /usercode/* /home/user && chown user:user /home/user/ -R && cp -r bash_4.4-5_amd64.deb /home/user && rm bash_4.4-5_amd64.deb && su - user" mode="edit">