Як завантажити пакет .deb та всі залежності?


14

Для всіх відповідей, які я знайшов на цю тему, рішенням було створити на певному комп’ютері A, де мені потрібно встановити пакет, файл, що містить усі необхідні йому залежності, а потім завантажити його на інший комп'ютер, назвемо його B.

Річ у тім, що я хочу мати сховище певного критичного програмного забезпечення, яке мені потрібно працювати, щоб пізніше встановити їх офлайн у випадку, якщо мені доведеться відформатувати свій робочий стіл.

Я ДУЖЕ НЕ Дбаю про те, щоб на моєму комп’ютері було багато зайвих файлів .deb, і я дійсно НЕ дбаю, якщо я збираюся зберігати 1 Гб файлів для встановлення програмного забезпечення 10 Мб.

Отже, я хочу, щоб будь-яка можлива залежність була завантажена. Чи десь я можу це зробити?


Відповіді:


22

Я б пішов з цим:

apt-get download PACKAGE && apt-cache depends -i PACKAGE | awk '/Depends:/ {print $2}' | xargs apt-get download

Потім ви можете встановити його dpkg -i *.debв каталог, який ви завантажили.


1
Я думаю, що це спрацювало, дуже дякую. Я просто перевіряю це ще кілька разів, перш ніж я повернусь, щоб ще раз подякувати вам :)
ebernardes

Чи можете ви пояснити мені, що виконують команди awk та xargs? Я тільки починаю використовувати Linux, і я ніколи не бачив цих 2 команд раніше
ebernardes

apt-cache depends -iперевірить важливі залежності для ПАКЕТИ. Він буде виконаний, лише якщо apt-get download PACKAGEвдасться знайти ПАКЕТ з репозиторіїв ppa, до яких ви додали /etc/apt/sources.list. Тепер apt-cache depends -i PACKAGEмає вихід форми Depends: dependency-name. Нам потрібні лише імена залежностей, тож саме це робить awk - це отримання лише другого рядка. Наприклад, спробуйте робити apt-cache depends -i vim | awk '{print $2}' . Зауважимо також, що цілу лінію праворуч від && можна вважати одним твердженням
Сергій Колодяжний,

1
Дякую! Але я провів деякі дослідження, і я використав команду sed '/ ^ </ d', щоб видалити частину виходу apt-кеша, це вже було добре, але зараз він працює у кожному випадку, я намагаюся. Дуже дякую!
ebernardes

dpkg -i *.debне так добре, він не встановлює пакунок на замовлення залежностей. Отже, вам може знадобитися кілька разів повторно, щоб встановити весь пакет. У будь-якому разі вирішити?
Мітріль

1

Це разова річ чи щось ви хочете постійно оновлювати? Ви здебільшого працюєте в Інтернеті і хочете отримати локальну резервну копію всіх ваших пакетів, про всяк випадок?

Існує кілька сервісів, які можна встановити як проксі / кеш APT. Ви вкажете APT у свій локальний кеш, він завантажиться з Інтернету та збереже локально кешовану копію всіх пакетів. Це може бути дуже корисно, якщо у вашій мережі багато комп'ютерів з однаковим вибором пакетів.

Мій кращий кеш apt становить приблизно , але є також apt-cacher-ng та кілька інших. У кожного є незначні відмінності щодо налаштування кешування.

Я завжди використовую мінімальні інструменти netinst для створення моїх систем на базі Debian, а це означає, що в моєму кеш-пам’яті зазвичай є майже всі пакети, щоб повністю створити мої системи.


Це те, що я хочу зберегти на всякий випадок, якщо мені потрібно швидко встановити якесь програмне забезпечення, навіть якщо це застаріла версія, перш ніж я можу оновити його пізніше. Я перевірю це, дякую :)
ebernardes

0

запустити наступну програму python:

import subprocess
package=input("insert package name:")
t=subprocess.run(["apt-cache", "depends", "-i", package], stdout=subprocess.PIPE)
if t.stderr or t.returncode:
    print(t.stdout)
    exit(t.stderr)
#print(":", t.stdout)
needed_pacages=t.stdout.split(b"Depends: ")
print(package, "depends of", needed_pacages)
for choices in needed_pacages:
    one_choice_made=False
    for needed_package in choices.split(b"\n"):
        needed_package=needed_package.strip(b"\n ")
        t=subprocess.run(["apt-get", "download", needed_package])
        if t.stderr or t.returncode:
            print("ERROR: Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=t), "package name:", needed_package)
        else:
            one_choice_made = True
            #print("downloaded",vajalik_pakk)
            break
    if not one_choice_made:
        print("could not get one of dependecies", choices)

1
І чому це краще, ніж прийнята відповідь?
РальфФрідль

0

запустіть наступну програму python3:

import subprocess
olemas_olevad_pakid=set()
def r(pakk):
    t=subprocess.run(["apt-get", "download", pakk])
    if t.stderr or t.returncode:
        #print("could not load package: Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=t), "paki nimi:", pakk)
        return False
    olemas_olevad_pakid.add(pakk)
    t=subprocess.run(["apt-cache", "depends", "-i", pakk], stdout=subprocess.PIPE)
    if t.stderr or t.returncode:
        print(t.stdout)
        exit(t.stderr)
    #print(":", t.stdout)
    needed_pacages=t.stdout.split(b"Depends: ")[1:]
    #print(pakk, "needs packages:", needed_pacages)
    for choices in needed_pacages:
        one_choice_made=False
        for needed_package in choices.split(b"\n"):
            needed_package=needed_package.strip(b"\n ")
            if needed_package in olemas_olevad_pakid or r(needed_package):
                one_choice_made=True
                break
        if not one_choice_made:
            print("PROBLEM: could not download any of", choices)
            return False
    return True
#for pakk in packages_to_download:
#    print("pakk:",pakk)
#    r(pakk)
r(input("package name:"))

Він завантажить усі залежності всіх залежностей, а не лише безпосередні залежності. Але встановити їх dpkg -i *.debне вдалося. Можливо, тому, що apt-cache depends -i packageдає дезінформацію або деякі файли some.deb все ще потребують підключення до Інтернету для встановлення.


Це може вийти з ладу, оскільки dpkg не встановлює пакунки у правильному порядку. Ви можете повторити спробу dpkg кілька разів, поки не будуть встановлені всі залежності.
Чорна сова Кай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.