apt 和 wget 如何在 Web 中查找 URI 位置并获取文件?这些方法有何不同?

apt 和 wget 如何在 Web 中查找 URI 位置并获取文件?这些方法有何不同?

我正在使用 Ubuntu 18.04LTS,使用代理。这个问题是由以下问题引发的(但完全独立于此)apt-get 安装代理后-无法获取

当我检查包的位置时yudit-commonapt install --print-uris例如,实际上作为的先决条件feh),我得到的http://us.archive.ubuntu.com/ubuntu/pool/universe/y/yudit/yudit-common_2.9.6-7_all.deb是文件在 Web 中的位置deb。请参阅下面的注释 1。

然后当我安装时yudit-common,一切正常,这意味着deb我的电脑知道文件在哪里 http://us.archive.ubuntu.com/ubuntu/pool/universe/y/yudit/yudit-common_2.9.6-7_all.deb在网络上,并且可以下载安装前请先检查。请参阅下面的注释 2。

但如果我尝试打开wget文件,我的电脑甚至不知道deb文件在哪里(这样当然就拿不到了)。见下文注释3。

apt您在哪里wget寻找信息?
我可以强制wget使用相同的域查找吗apt
如果防火墙允许apt成功获取 IP 地址并从网络中提取文件,并阻止wget执行此操作,我可以通过某种方式“传送”wget请求吗apt


笔记

  1. .deb包文件的位置
    $ apt install --print-uris feh 2> /dev/null
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following additional packages will be installed:
      yudit-common
    Suggested packages:
      yudit-doc yudit
    The following NEW packages will be installed:
      feh yudit-common
    0 upgraded, 2 newly installed, 0 to remove and 51 not upgraded.
    Need to get 1.760 kB of archives.
    After this operation, 9.775 kB of additional disk space will be used.
    'http://us.archive.ubuntu.com/ubuntu/pool/universe/y/yudit/yudit-common_2.9.6-7_all.deb' yudit-common_2.9.6-7_all.deb 1637644 MD5Sum:987ef69fa59b1c3034bfa28955e612d9
    'http://us.archive.ubuntu.com/ubuntu/pool/universe/f/feh/feh_2.23.2-1build1_amd64.deb' feh_2.23.2-1build1_amd64.deb 122020 MD5Sum:b5f42ee280ee4aada1cbd93ec0007e68
  1. 安装yudit-common
    $ sudo apt-get install yudit-common
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Suggested packages:
      yudit-doc yudit
    The following NEW packages will be installed:
      yudit-common
    0 upgraded, 1 newly installed, 0 to remove and 51 not upgraded.
    Need to get 1.638 kB of archives.
    After this operation, 9.411 kB of additional disk space will be used.
    Get:1 http://us.archive.ubuntu.com/ubuntu bionic/universe amd64 yudit-common all 2.9.6-7 [1.638 kB]
    Fetched 1.638 kB in 9s (174 kB/s)      
    Selecting previously unselected package yudit-common.
    (Reading database ... 488875 files and directories currently installed.)
    Preparing to unpack .../yudit-common_2.9.6-7_all.deb ...
    Unpacking yudit-common (2.9.6-7) ...
    Setting up yudit-common (2.9.6-7) ...
  1. wget档案yudit-common .deb
    $ wget http://us.archive.ubuntu.com/ubuntu/pool/universe/y/yudit/yudit-common_2.9.6-7_all.deb
    --2020-09-20 06:32:21--  http://us.archive.ubuntu.com/ubuntu/pool/universe/y/yudit/yudit-common_2.9.6-7_all.deb
    Resolving us.archive.ubuntu.com (us.archive.ubuntu.com)... failed: Name or service not known.
    wget: unable to resolve host address ´us.archive.ubuntu.com´
  1. 有趣的

https://unix.stackexchange.com/questions/168584/wget-is-unable-to-resolve-host-address-80-of-the-time

答案1

我不知道我的电脑、代理、防火墙和 DNS 服务器之间的确切关系和互操作。

但我发现,apt在我的情况下,原因wget是我缺少正确的代理配置wget。当我添加文件~/.wgetrc

http_proxy = http://username:password@proxy:port
ftp_proxy = http://username:password@proxy:port
proxy_user = username
proxy_password = password 
use_proxy = on

它开始工作了。(请注意,这有点不安全,因为密码是以纯文本形式存储的……我想知道是否有任何方法可以要求输入密码;或者在与 具有相同安全级别的目录中wget设置全局密码)。另一方面,依赖于,它已经到位。.wgetrcapt.confapt/etc/apt/apt.conf

至于问题:

apt您在哪里wget寻找信息?
该序列的一部分涉及设置代理。 apt并且wget如上所述,具有不同的机制(我知道也可以设置环境变量,这至少对于来说是有效的wget)。

我可以强制wget使用相同的域查找吗apt
我设想了一种原始人的方法...解析apt.conf并使用该信息wget。也许有更简洁的方法。

如果防火墙允许apt成功获取 IP 地址并从网络中提取文件,并阻止wget执行此操作,我可以通过某种方式“传送”wget请求吗apt
根据上述发现,该问题由上一个问题取代。

答案2

是的,您的 Ubuntu 系统知道在哪里找到 .debs。这是一个三步过程。

  1. 你的系统知道档案在哪里(来源) 位于。其位于/etc/apt/sources.list

    $ cat /etc/apt/sources.list
    deb http://us.archive.ubuntu.com/ubuntu/ focal main universe
    deb http://us.archive.ubuntu.com/ubuntu/ focal-updates main universe
    deb http://security.ubuntu.com/ubuntu focal-security main universe
    
    • 最初的来源由 Ubuntu 安装程序放置。您可以更改这些源;它只是 root 拥有的文本文件。但是,您也有可能破坏系统,因此请确保您知道如何恢复原始文件。
  2. Apt 保存了所有已知软件包的数据库,这些软件包来自所有已知的来源. 名称、描述、版本、大小、URI 等。Apt 使用其数据库来计算可用的升级,并了解从中获取包的 URI。

    每次运行时sudo apt update,apt 都会从每个源下载一个 Release 文件,并使用该 Release 文件来更新 apt 的数据库。

    • 数据库位于 /var/lib/apt/lists。它被设计为机器可读,而不是人类可读。使用 apt 命令(apt searchapt listapt-cache等)查询数据库。

    • 这就是为什么大多数说明都说在安装新软件之前运行apt update- 所以 apt 的数据库具有正确的 URI。

  3. 当您告诉 apt 时sudo apt install foo,apt 会查阅其数据库来查找正确的版本、未卸载的依赖项以及它所需的所有包的 URI。

相关内容