如何将所有依赖项和软件包下载到目录


69

我正在尝试在没有Internet连接的计算机上安装软件包。我想要做的是将所有程序包和相关性下载到具有Internet连接的计算机上,然后将所有内容通过网络潜入离线计算机。

我一直在玩的apt-getapt-cache,但我还没有想出一个快速简便的方法一举下载软件包和依赖于我选择的目录。我该怎么做?我要正确解决这个问题吗?您将如何安装具有很多依赖性的脱机软件包?


Answers:


36
# aptitude clean
# aptitude --download-only install <your_package_here>
# cp /var/cache/apt/archives/*.deb <your_directory_here>

35
仅当您没有本地安装软件包或其依赖项时,此方法才有效。
Kissaki 2014年

15
在现实世界中,这对您不起作用。在大多数情况下,已经安装了许多依赖项程序包,因此--download-only不会下载它们,也不会将它们放在/ var / cache / apt / archive /目录中。因此您最终将获得不完整的依赖包。
2014年

我想如果您可以使源安装(大概已连接到Internet)和目标安装(没有Internet连接)完全相同,例如,在两台计算机上从同一ISO安装Ubuntu,然后清理.deb源上的所有s,这将起作用。 ,然后安装所需的内容,将所有新下载的.debs复制到目标计算机,然后运行sudo dpkg -i *.deb???
Mahesha999 '16

5
使用reinstall命令而不是install将下载软件包,即使它们已安装也是如此
antoine

3
完全不依赖我(Ubuntu 18.04)
Jeff

84

标记为答案的问题是正在执行下载的计算机上的可用软件包可能与目标计算机不同,因此软件包集可能不完整。

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

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

6
我用过,apt-rdepends因为它会递归列出所需的软件包。但是,这两种解决方案都仍然存在(较小的IMO)问题,即某些依赖项只能由实际命名为依赖项的程序包提供。某些依赖关系由名称不同的程序包解决,但具有相应的“ Provides”标签。例如,我遇到了一个关于未解决的debconf-2.0的引用的问题-我笨拙但非常可行的解决方案是手动过滤掉那些(通常很少)软件包,并grep -v在管道中添加另一个软件包。
2015年

您确定rdepends意味着递归依赖吗?我认为这是反向依赖性。
Rich von Lehe

3
对于上面的评论,我将“ apt-cache rdepends”与apt-rdepends混淆了。我的错误-您是正确的,而且功能强大。
Rich von Lehe

别担心。我现在将其编辑回去再说apt-rdepends
2015年

5
通过将两个链接grep在一起解决该错误。apt-get download $(apt-rdepends <package>|grep -v "^ "|grep -v "libc-dev")
Mike S

32

这里已经回答了相同的问题: 如何列出/下载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")

2
这个脚本很棒..下载了整个依赖树。我想知道我们是否还可以自动生成具有正确顺序的dpkg命令的文件,以便首先加载没有其他依赖项的软件包?目前,它只是sudo dpkg -i *.deb几次暴力。
Nikhil VJ

1
@NikhilVJ下载依赖项后,就可以使用apt-get install --no-download <PACKAGE>它了,它将仅搜索本地缓存。它应该能够像往常一样整理出依存顺序。
TheBeardedQuack

1
更改您的apt-get download行以这样开始,以便将文件下载到当前目录。 apt-get download -o Dir::Cache="./" -o Dir::Cache::archives="./"
自己

1
为什么要使用--no-pre-depends?我认为需要先安装依赖项。
Steely Wing

我发现它为某些软件包下载了amd64和i386版本。要仅下载所需的版本,我通过以下方式扩展了grep :(grep "^\w" | grep -v "i386"忽略i386)
Gal Avineri,

19

aptitude --download-only ...方法仅在您手中拥有可连接互联网的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

PS我基本上是复制博客文章,因为它不是很可读,以防万一文章会消失。


5
apt-get方法仅在未安装软件包的情况下有效
A. Binzxxxxxx

添加-qq到apt-get行中,消除了对grep(和的需要--assume-yes)的必要
jpaugh

由于(我认为)apt版本0.8.11(ubuntu 11.04)可以使用“下载”选项,因此即使已经安装了软件包,也可以使用它。因此,请使用apt-get --print-uris --yes download <my_package_name> |... 而不是“ install”,或在安装时使用选项“ --reinstall”,例如@ozma说(@ A.Binzxxxxxx)
eli

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

1
非常感谢。我实际上想知道是否有一种方法可以告诉APT也下载依赖项并将它们缓存在/ var / cache / apt / archives中。我想下载texlive-full --install-recommends,最终只texlive-full在档案文件中找到一个名为metapackage的文件。
Ashhar Hasan

1
我不知道缓存。您将不得不自己尝试一下askubuntu.com/questions/463380/…–
ozma

它有点旧,但我只是发现,如果文件在apt缓存中,就不会再次下载。“ apt-get clean”解决了它。
ozma

8

这会将所有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"

注意:我以本例为例,因为我实际上是尝试对Deps进行SSMTP的Deps调试,但在debconf-2.0上却失败了,但是此脚本满足了我的需求!希望能帮助到你。


这对我来说很棒。我不得不添加另一行来处理PreDepends。感谢分享!
tay10r

1
如何用它来下载软件包的Ubuntu的一些其他的版本,例如14版
aprilian

@aprilian,如果您发现让我知道,但是显而易见的解决方案是启动Ubuntu 14并运行脚本:P
FreeSoftwareServers

5

apt-cache depends package 无论是否已经安装在系统上,我总是会获取所有必需的软件包。因此,它将始终正确工作。
由于apt-cache命令的工作方式不同,具体取决于语言,因此您必须在系统上尝试使用此命令并改编该命令。apt-cache取决于yourpackage
在英语系统上,您会得到:

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


在德语系统上,您得到:节点

  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

获取文件后,在执行脱机安装时将使用什么命令来确保使用所有这些文件?
dtmland'3

我认为,如果您使用dpkg -i package .deb package2.deb,则dpkg会确定安装顺序
FreeSoftwareServers 16-10-10

这对我不起作用,因为我的Depends之一是<debconf>,它在One班轮中无法正确处理,但是我确定它可以用于很多事情,一般概念都可以,但是我使用了ozma的答案
FreeSoftwareServers 2016年

我想知道,如果您apt-get使用env var来运行,则LANG=en不需要为该德语单词使用grep,对吗?并且您的解决方案将适用于所有人
knocte

1

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

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


1
不,我不知道。使用apt-mirror玩的不好,但是我没有足够的USB HD或良好的网络连接。我真的只想下载我绝对需要的软件包。

1

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

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'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.