user583507
user583507

Reputation:

How to download all dependencies and packages to directory

I'm trying to install a package on a machine with no Internet connection. What I want to do is download all the packages and dependences on a machine WITH an Internet connection and then sneaker-net everything to the offline computer.

I've been playing with the apt-get and apt-cache but I haven't figured out a quick and easy way to download the package and dependencies in one swoop to a directory of my choosing. How would I do this? Am I going about this problem correctly? How would you install offline packages that have a lot of dependencies?

Upvotes: 124

Views: 255551

Answers (14)

David Ceja
David Ceja

Reputation: 1

Complementing and automating the exclusion of ALL conflictive dependencies (dependencies not found) by the command given by @onno:

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

At least for Ubuntu, where the Error Message format is as follows:

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

The following script Downloads all Found Dependencies, Excluding not Found ones:

#!/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

Upvotes: 0

FreeSoftwareServers
FreeSoftwareServers

Reputation: 2791

This will download all the .debs to the current directory, and will not fail if it can't find a candidate. This script does not require sudo to run.

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"

I used this as my example because I was actually trying to download the dependencies for ssmtp and it failed on debconf-2.0, but this script did what I needed.

Upvotes: 10

FSp
FSp

Reputation: 1635

The aptitude --download-only ... approach only works if you have a debian distro with internet connection in your hands.

If you don't, I think it is better to run the following script on the disconnected debian machine:

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

move the downloads.list file into a connected linux (or non linux) machine, and run:

wget --input-file myurilist

this downloads all your files into the current directory.After that you can copy them on an USB key and install in your disconnected debian machine.

Credits: http://www.tuxradar.com/answers/517

Upvotes: 26

panticz
panticz

Reputation: 2315

Same question already answered here: How to list/download the recursive dependencies of a debian package?

try:

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")

Upvotes: 83

onno
onno

Reputation: 1391

The marked answer has the problem that the available packages on the machine that is doing the downloads might be different from the target machine, and thus the package set might be incomplete.

To avoid this and get all dependencies, use the following:

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

Some packages returned from apt-rdepends don't exist with the exact name for apt-get download to download (for example, libc-dev). In those cases, filter out those exact names (be sure to use ^<NAME>$ so that other related names, for example libc-dev-bin, that do exist are not skipped).

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

Once downloaded, you can move the .deb files to a machine without Internet and install them:

sudo dpkg -i *.deb

Upvotes: 130

SamBob
SamBob

Reputation: 926

Adding a more modern answer to this question: The problem with other answers is that the machine that downloads the dependencies needs to be in a sense "clean" to get all dependencies. Enter docker!

  • Connect the removeable storage device and note its mounted path /mnt/store
  • Begin an interactive docker container with your target OS (e.g. ubuntu:22.04) and the store mounted:
docker run --rm -it -v /mnt/store:/store ubuntu:22.04
apt-get update
apt-get --download-only install <your_package_here>
cp /var/cache/apt/archives/*.deb /store

And all the required .debs will be on the removable storage. FInally connect the removable storage to the offline machine, note the mounted path /mnt/path and run (as root):

dpkg -i /mnt/store/*.deb

Rinse and repeat with any other packages you fancy.

Upvotes: 0

Ichsan
Ichsan

Reputation: 828

It works with me

sudo apt-get reinstall --download-only <your software>

for example

sudo apt-get reinstall --download-only ubuntu-restricted-extras

For accessing installed .deb files, you can look in this path:

/var/cache/apt/archives

Upvotes: 1

Vsevolod Gromov
Vsevolod Gromov

Reputation: 551

On modern Ubuntu systems (for example, 22.04):

apt clean
apt update
apt install --download-only  freeipa-client

After you can find deb-files in

ls -l /var/cache/apt/archives/

Upvotes: 3

Gyll
Gyll

Reputation: 371

IF you accept the caveat that there may be dependencies already installed on your system, then the easiest way is to go apt-get install --simulate <your_package>, this will first list all the deps it will install, then copy the list of packages, then apt-get download <the_list_of_packages>


e.g. for qt5-gtk2-platformtheme on a xubuntu-21.04 MINIMAL INSTALL you'll get (after apt-get install --simulate) the following:

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

then you just cd in a folder of your choice, do apt-get download <the_list_above>, and you have them all d/w in there. you can then dpkg -i *.deb

Upvotes: 1

jjvs
jjvs

Reputation: 51

This will download all packages and dependencies (no already installed) to a directory of your choice:

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

Make sure /path-to/directory/apt/cache and /path-to/directory/apt/lists exist. If you don't set -o Dir::Cache it points to /var/cache/apt, Dir::State::Lists points to /var/lib/apt/lists (which keeps the index files of available packages)

Both -o options can be used with update and upgrade instead of install.

On different machine run the same command without '-d'

Upvotes: 5

ozma
ozma

Reputation: 1803

Somewhat simplified (and what worked for me) way that worked for me (based on all the above)
Note that dependencies hierarchy can go deeper then one level

Get dependencies of your package

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

Get urls:

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

Upvotes: 10

michbau
michbau

Reputation: 61

I used apt-cache depends package to get all required packages in any case if the are already installed on system or not. So it will work always correct.
Because the command apt-cache works different, depending on language, you have to try this command on your system and adapt the command. apt-cache depends yourpackage
On an englisch system you get:

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


On an german system you get: node

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


The englisch version with the term:
"Depends:"
You have to change the term "yourpackage" to your wish twice in this command, take care of this!

$ 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


And the german version with the term:
"Hängt ab von:"
You have to change the term "yourpackage" to your wish twice in this command, take care of this!
This text is used twice in this command, if you want to adapt it to your language take care of this!

$ 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


You get the list of links in downloads.list
Check the list, go to your folder and run the list:

$ cd yourpathToYourFolder

$ wget --input-file downloads.list


All your required packages are in:

$ ls yourpathToYourFolder

Upvotes: 6

metalheart
metalheart

Reputation: 3809

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

Upvotes: 46

joshuacronemeyer
joshuacronemeyer

Reputation: 1336

I'm assuming you've got a nice fat USB HD and a good connection to the net. You can use apt-mirror to essentially create your own debian mirror.

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

Upvotes: 2

Related Questions