是否可以通过脚本访问 Debian 包的文件postinst
?
通常,我会使用类似的东西dpkg -c path/to/deb
,但是在脚本内部调用apt
/是不可能的,对吗?dpkg
postinst
目前,我使用 安装该包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
/ 。apt
postinst
答案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
:
答案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 脚本中使用一个简单的循环。 - 搜索工作发生在构建时:一次(每次构建)。
- 如有必要,可以验证该列表,以确保其正确无误。