将包和目录结构从 `/etc/apt/sources.list.d/` 存储库文件中解码为 URL

将包和目录结构从 `/etc/apt/sources.list.d/` 存储库文件中解码为 URL

我不是apt用户,但我处于一个场景中,我需要.deb从存储库中获取一个包。

我不是基于 deb 的发行版的用户,因此我无法轻松安装deb所需的存储库。由于其他原因,这也是不切实际的。

相反,我认为简单地抓取包然后解压它可能是一个更简单的解决方案,但我在“破译”目录中的存储库条目时遇到了相当大的麻烦sources.list.d

deb [arch=amd64] http://apt.domain.de/ stable ubuntu

如何将其转换为某种 URL,以便我可以探测可用包列表之类的内容,或者如果我知道包名称,只需知道该包的 URL?

从本质上讲,在我的情况下,手动访问 debian 存储库并从中获取一个软件包以进行解包和检查等更为实用,而不是安装apt,然后通过它安装软件包等。

答案1

条目的结构是:

deb [arch=architecture] base-URL version repo-sections...

当您有sources.list.d条目时:

deb [arch=amd64] http://apt.domain.de/ stable ubuntu

这表明:

  • 基本 URL 是http://apt.domain.de/
  • 版本代号是stable
  • 架构是amd64
  • ubuntu仅列出一个存储库部分。

它表明相关二进制包的列表位于<base-URL>/dists/<version>/<repository-section>/binary-<arch>/Packages.(gz|xz),因此:

http://apt.domain.de/dists/stable/ubuntu/binary-amd64/Packages.(gz|xz)

并且实际的包裹(最有可能)位于<base-URL>/pool/<repository-section>

http://apt.domain.de/pool/ubuntu/

如果存储库包含大量包,则它可能已被拆分为第二个 URL 下的多个子目录:

  1. 用单个字符命名,与其中包含的包名称中的首字符匹配
  2. 命名为libX其中是单个字符,包含名称不带前缀以相同字符开头X的库包(即)liblibX*

如果有一个真的存储库中的包数量较多,可能会有进一步的细分。

因此,如果您正在寻找包“foo”,您将首先下载文件http://apt.domain.de/dists/stable/ubuntu/binary-amd64/Packages.gzhttp://apt.domain.de/dists/stable/ubuntu/binary-amd64/Packages.xz,然后阅读它以找出该包的哪个版本被认为是该存储库版本ubuntu部分中的最新版本。stable

你会发现这样的东西:

Package: foo
Source: foo (1.2.3-4)
Version: 1.2.3-4+b1
Installed-Size: 12345
Maintainer: The Developer Guy <[email protected]>
Architecture: amd64
Depends: libfoo (>= 1.2.3-4+b1)
...
Filename: pool/ubuntu/f/foo/foo_1.2.3-4+b1_amd64.deb
...

由此,你会知道:

  • 相关的包是foo-1.2.3-4+b1.deb

  • 它取决于 package libfoo、 version1.2.3-4+b1或更高版本

  • 并且该包可以在以下位置找到:

    http://apt.domain.de/pool/ubuntu/f/foo/foo_1.2.3-4+b1_amd64.deb

然后,您可以将包下载到临时目录并开始解压:

mkdir workdir
cd workdir
wget http://apt.domain.de/pool/ubuntu/f/foo/foo_1.2.3-4+b1_amd64.deb
ar x foo_1.2.3-4+b1_amd64.deb

这将为您提供三个文件:control.tar.xzdata.tar.xzdebian-binary.最后一个仅包含包格式的版本号,通常可以忽略。

包含data.tar.xz该包将安装的实际文件。

包含control.tar.xz任何安装前/安装后/删除脚本(如果包需要)以及包管理器的一些元数据。

相关内容