82

我正在尝试在没有 Internet 连接的机器上安装软件包。我想要做的是将所有软件包和依赖项下载到一台具有 Internet 连接的机器上,然后将所有内容都下载到离线计算机上。

我一直在玩,apt-get但是apt-cache我还没有找到一种快速简便的方法来将包和依赖项一次性下载到我选择的目录中。我该怎么做?我是否正确地解决了这个问题?您将如何安装具有大量依赖项的离线包?

4

11 回答 11

95

标记的答案的问题是正在下载的机器上的可用包可能与目标机器不同,因此包集可能不完整。

为避免这种情况并获取所有依赖项,请使用以下命令:

apt-get download $(apt-rdepends <package>|grep -v "^ ")

从返回的某些包apt-rdepends不存在apt-get download要下载的确切名称(例如,libc-dev)。在这些情况下,过滤掉那些确切的名称(确保使用^<NAME>$其他相关名称,例如libc-dev-bin确实存在的名称不会被跳过)。

apt-get download $(apt-rdepends <package>|grep -v "^ " |grep -v "^libc-dev$")

下载后,您可以将.deb文件移动到没有 Internet 的机器上并安装它们:

sudo dpkg -i *.deb
于 2014-12-14T12:53:52.597 回答
49

这里已经回答了同样的问题: 如何列出/下载 debian 包的递归依赖项?

尝试:

PACKAGES="wget unzip"
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests \
  --no-conflicts --no-breaks --no-replaces --no-enhances \
  --no-pre-depends ${PACKAGES} | grep "^\w")
于 2017-08-03T16:21:41.357 回答
42
# aptitude clean
# aptitude --download-only install <your_package_here>
# cp /var/cache/apt/archives/*.deb <your_directory_here>
于 2012-12-07T05:40:16.707 回答
21

aptitude --download-only ...方法仅在您拥有具有 Internet 连接的 debian 发行版时才有效。

如果你不这样做,我认为最好在断开连接的 debian 机器上运行以下脚本:

apt-get --print-uris --yes install <my_package_name> | grep ^\' | cut -d\' -f2 >downloads.list

将 downloads.list 文件移动到连接的 linux(或非 linux)机器中,然后运行:

wget --input-file myurilist

这会将所有文件下载到当前目录中。之后,您可以将它们复制到 USB 密钥上并安装在断开连接的 debian 机器上。

学分:http ://www.tuxradar.com/answers/517

于 2014-10-07T14:59:44.053 回答
9

这会将所有 Debs 下载到当前目录,如果找不到候选人,也不会失败。

也不需要 sudo 来运行 sript!

nano getdebs.sh && chmod +x getdebs.sh && ./getdebs.sh

#!/bin/bash

package=ssmtp

apt-cache depends "$package" | grep Depends: >> deb.list

sed -i -e 's/[<>|:]//g' deb.list

sed -i -e 's/Depends//g' deb.list

sed -i -e 's/ //g' deb.list

filename="deb.list"

while read -r line
do
    name="$line"
    apt-get download "$name"
done < "$filename"

apt-get download "$package"

注意:我用这个作为我的例子,因为我实际上是在尝试对 SSMTP 的 Deps 进行 DL,但它在 debconf-2.0 上失败了,但是这个脚本让我得到了我需要的东西!

于 2016-10-11T00:02:18.423 回答
8

对我有用的某种简化(以及对我有用的方法)(基于以上所有内容)
请注意,依赖关系层次结构可以更深一层

获取包的依赖项

$ apt-cache depends mongodb | grep Depends:
  Depends: mongodb-dev
  Depends: mongodb-server

获取网址:

sudo apt-get --print-uris --yes -d --reinstall install mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-tools | grep "http://" |  awk '{print$1}' | xargs -I'{}' echo {} | tee files.list
wget --input-file files.list
于 2015-07-27T06:08:43.957 回答
5

我曾经apt-cache depends package 在任何情况下获取所有必需的软件包,无论它们是否已经安装在系统上。所以它总是正确的。
由于命令 apt-cache 的工作方式不同,具体取决于语言,您必须在系统上尝试此命令并调整该命令。apt-cache 取决于 yourpackage
在英语系统上,您会得到:

$ apt-cache depends yourpackage
node
  Depends: libax25
  Depends: libc6


在德语系统上,您会得到: node

  Hängt ab von: libax25
  Hängt ab von: libc6


英文版本的术语:
Depends:
您必须yourpackage在此命令中将术语“”更改为您的意愿两次,请注意这一点!

$ sudo apt-get --print-uris --yes -d --reinstall install yourpackage $(apt-cache depends yourpackage | grep "  Depends:" |  sed 's/  Depends://' | sed ':a;N;$!ba;s/\n//g') | grep ^\' | cut -d\' -f2 >downloads.list


还有德语版本的术语:
Hängt ab von:
您必须yourpackage在此命令中将术语“”更改为您的意愿两次,请注意这一点!
此文本在此命令中使用了两次,如果您想使其适应您的语言,请注意这一点!

$ sudo apt-get --print-uris --yes -d --reinstall install yourpackage $(apt-cache depends yourpackage | grep "Hängt ab von:" |  sed 's/  Hängt ab von://' | sed ':a;N;$!ba;s/\n//g') | grep ^\' | cut -d\' -f2 >downloads.list


您在 downloads.list 中获得链接列表
检查列表,转到您的文件夹并运行列表:

$ cd yourpathToYourFolder

$ wget --input-file downloads.list


您需要的所有软件包都在:

$ ls yourpathToYourFolder
于 2015-06-06T16:41:30.573 回答
4

这会将所有包和依赖项(尚未安装)下载到您选择的目录:

sudo apt-get install -d -o Dir::Cache=/path-to/directory/apt/cache -o Dir::State::Lists=/path-to/directory/apt/lists packages

确保/path-to/directory/apt/cache/path-to/directory/apt/lists存在。如果你不设置-o Dir::Cache它指向/var/cache/aptDir::State::Lists指向/var/lib/apt/lists它保留了可用包的索引文件

这两个-o选项都可以与更新和升级一起使用,而不是安装。

在不同的机器上运行相同的命令,没有' -d'

于 2019-02-13T16:03:10.933 回答
2

我假设你有一个不错的胖 USB HD 和良好的网络连接。您可以使用 apt-mirror 来创建自己的 debian 镜像。

http://apt-mirror.sourceforge.net/

于 2012-12-07T04:23:55.070 回答
0

如果您接受警告说您的系统上可能已经安装了依赖项,那么最简单的方法是去 apt-get install --simulate <your_package>,这将首先列出它将安装的所有依赖项,然后复制列表包,然后 apt-get 下载 <the_list_of_packages>


例如,对于 xubuntu-21.04 MINIMAL INSTALL 上的 qt5-gtk2-platformtheme,您将获得(在 apt-get install --simulate 之后)以下内容:

libdouble-conversion3 libmd4c0 libpcre2-16-0 libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 libqt5svg5 libqt5widgets5 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xinput0 libxcb-xkb1 libxkbcommon-x11-0 qt5-gtk-platformtheme qttranslations5- l10n

然后你只需 cd 在你选择的文件夹中,执行 apt-get download <the_list_above>,你就可以将它们全部 d/w 放在那里。然后你可以 dpkg -i *.deb

于 2021-08-30T19:16:35.187 回答
0

通过@onno 给出的命令补充并自动排除所有冲突依赖项(未找到依赖项):

apt-get download $(apt-rdepends <package>|grep -v "^ " |grep -v "^conflictiv-dependency$")

至少对于 Ubuntu,错误消息格式如下:

E: Can't select candidate version from package <package> as it has no candidate

以下脚本下载所有找到的依赖项,不包括未找到的依赖项:

#!/bin/bash
rm -f error.txt
apt download $(apt-rdepends $1 | grep -v "^ ") 2> error.txt
#IF THERE WAS ERRORS (DEPENDENCIES NOT FOUND)
if [ $(cat error.txt | wc -l) -gt 0 ]
then
    partial_command="\("
    while read -r line
    do
        conflictive_package="$(awk '{split($0,array," "); print array[8]}' <<< $line)"
        partial_command="$partial_command$conflictive_package\|"
    done < error.txt
    
    partial_command="$(awk '{print substr($0, 1, length($0)-2)}' <<< $partial_command)\)"
    eval "apt download \$(apt-rdepends $1 | grep -v '^ ' | grep -v '^$partial_command$')"
fi
rm error.txt
于 2022-02-20T02:20:43.120 回答