从 postinst 脚本访问 debian 包的文件

从 postinst 脚本访问 debian 包的文件

是否可以通过脚本访问 Debian 包的文件postinst

通常,我会使用类似的东西dpkg -c path/to/deb,但是在脚本内部调用apt/是不可能的,对吗?dpkgpostinst

目前,我使用 安装该包dpkg -i path/to/deb,稍后该包将由存储库提供。

我想要实现的目标:

dpkg -i myPackage_1.0-0_all.deb

解压文件(尤其是 *.specialTag)

postinst运行一个脚本,该脚本可处理所有*.specialTag文件在系统上(使用find / -name *.specialTag)。

*.specialTag如果系统上没有旧文件,那么这种方法就可以正常工作,因为:

  • 如果我*.specialTag从中删除一个文件myPackage_1.0-0_all.deb,创建一个新版本myPackage_1.0-1_all.deb并安装它,那么该*.specialTag文件仍然在系统上。
  • 我的postinst脚本将会找到它并使用它。

所以我的想法不是循环遍历系统上的所有文件,而是只循环遍历我随身携带的文件myPackage_1.0-1_all.deb

但是我需要在脚本中调用dpkg/ 。aptpostinst

答案1

要获取软件包安装的文件列表,您可以使用dpkg -L YOUR-PACKAGE-NAME,这将按您在期间的预期工作postinst。(因此,如果您的软件包名为,则example命令为dpkg -L example。)

dpkg -L即使/var/lib/dpkg/lock锁定文件被锁定,它似乎也能正常工作,而且无论如何,锁定都是不是期间举行postinst

您还可以使用文件/var/lib/dpkg/info/YOUR-PACKAGE-NAME.list,该dpkg文件在安装软件包期间运行之前创建postinst。(因此,如果您的软件包名为,则example文件为/var/lib/dpkg/info/example.list。)

以上两个都提供了包中包含的所有文件的列表(以及根目录下的所有父目录,您可能需要根据正在执行的操作将其过滤掉)。

答案2

据我所知示意图,文件应该在 postinst 上完全解压。因此,如果您usr/share/foo/script.sh在包中有一个文件,您应该能够访问此脚本/usr/share/foo/script.sh

postinst debian mainainter 示意图

答案3

解决方案 1:dpkg --contents

首先,我不认为该dpkg -c命令会尝试锁定系统以列出文件.deb。它不应该。换句话说,它应该在您的postinst脚本中正常工作。

解决方案 2:dpkg-deb --contents

但是,如果你看一下手册页,你会发现-c( --contents) 命令行选项实际上不应该dpkg再使用了。它已被弃用(已经有 10 年左右了)。

他们还提到了替代方案:

dpkg-deb --contents <package-name>

现在,这也可以工作,只是您需要知道安装了哪个包。例如,为了获取包的内容,您需要知道 .deb 在哪里以及正确的版本和体系结构(尽管体系结构可能不是什么大问题)。

换句话说,这并不是一个好的解决方案。

解决方案 3:列表文件

正如 mtraceur 在他的回答中提到的,您想使用列出内容的 dpkg 信息文件。尝试:

less /var/lib/dpkg/info/YOUR-PACKAGE-NAME.list

这是没有 -like 输出的相同列表,ls -l可以更轻松地解析您感兴趣的文件。

解决方案 4:在构建时准备数据

因为我不喜欢其他解决方案,所以我会做的是在构建时查找,它会生成一个包含您感兴趣的文件的列表。这将成为您在下安装的配置文件的形式/usr/share/<package-name>/tag-files.list

它更好的几个原因:

  • 这个文件非常容易解析,每个文件读取一行,因此您可以for在 postinst 脚本中使用一个简单的循环。
  • 搜索工作发生在构建时:一次(每次构建)。
  • 如有必要,可以验证该列表,以确保其正确无误。

相关内容