当前位置: 首页>>技术教程>>正文


apt – 如何伪造已安装的软件包版本?

,

问题描述

作为早期采用者并使用 11.04 每日构建,我有时会遇到这样一种情况,即某些软件包需要比我已安装的软件包更早版本的其他软件包。通常,所需软件包的较新(但被拒绝)版本提供其旧版本的所有功能。

如果我使用 dpkg -i --force-depends-version 安装依赖包一切正常,我从未见过问题。

与其手动下载和安装每个软件包,我可以让系统假装在有更新的软件包版本时安装了特定的软件包版本吗?或者是否有 --force-depends-version 等效于 apt-get 的密钥?

最佳思路

尽管已经接受了一个答案,但内联接受的更好地传达了这个过程:

  1. 有一个名为 equivs 的 Debian 软件包可以创建虚拟软件包。通过运行 sudo apt-get install -y equivs 安装它

  2. 安装后,使用以下命令生成模板 “control” 文件:equivs-control postfix(将 postfix 替换为您的包名称)。在我的情况下,我可能会使用另一个包名称,例如postfix-custom 或其他,但我的自定义包完成或 Provides postfix 的安装依赖项(再次将 postfix 替换为您想要的任何包。

  3. 生成模板控制文件后,我通常会删除很多注释掉的语句(以 # 开头的语句)。我特别喜欢保留的一个是 Provides: 语句,我可以说我的包提供了我试图伪造的另一个包提供的功能,例如Provides: postfix 告诉 Debian/Ubuntu 依赖解析机制,我的 package\xe2\x80\x94of any name\xe2\x80\x94 提供与目标包相同的功能,同样是 postfix 或其他。这允许我独立于目标包命名我的包以避免混淆。 Erlang Factory 用他们的东西来做这件事,例如esl-erlang 提供 erlang

  4. 最后,一旦创建了模板控制文件,您就可以使用 equivs-build 生成假包,例如equivs-build /path/to/generated/control/file

  5. 构建包需要几秒钟,然后您可以运行 sudo dpkg -i my_package_name*.deb

对于高级用户,如果你的模板控制文件有一个 Requires: 依赖行,你可能想要使用像 gdebi 这样的工具来安装你的包以及它声明为依赖的各种包。

次佳思路

您可以使用 equivs 包创建一个虚拟包来伪造正在安装的给定包。一些指令 here

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13023.html,未经允许,请勿转载。