Jak pobrać pakiet .deb i wszystkie zależności?


14

Dla wszystkich odpowiedzi na ten temat, które znalazłem, rozwiązaniem było utworzenie, na pewnym komputerze A, na którym muszę zainstalować pakiet, pliku zawierającego wszystkie potrzebne zależności, a następnie pobranie go na inny komputer, nazwijmy go B.

Chodzi o to, że chcę mieć pewne krytyczne oprogramowanie. Muszę pracować, aby móc je później zainstalować offline, na wypadek, gdyby musiałem sformatować pulpit.

NAPRAWDĘ NIE PIELĘGNUJĘ o to, że mam dużo zbędnych plików .deb na moim komputerze, i NAPRAWDĘ NIE PIELĘGNUJĘ, jeśli zamierzam przechowywać 1 GB plików, aby zainstalować oprogramowanie 10 MB.

Chcę więc pobrać dowolną zależność. Czy jest jakoś to zrobić?


Odpowiedzi:


22

Wybrałbym to:

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

Następnie możesz zainstalować go dpkg -i *.debw katalogu, który je pobrałeś.


1
Myślę, że to zadziałało, dziękuję bardzo. Jeszcze raz przetestuję to jeszcze raz, zanim wrócę, aby jeszcze raz podziękować :)
ebernardes

Czy możesz mi wyjaśnić, co robią polecenia awk i xargs? Właśnie zaczynam używać Linuksa i nigdy wcześniej nie widziałem tych 2 poleceń
ebernardes

apt-cache depends -isprawdzi ważne zależności dla PAKIETU. Zostanie wykonany tylko wtedy apt-get download PACKAGE, gdy uda się znaleźć PAKIET z repozytoriów ppa, które dodałeś /etc/apt/sources.list. Teraz apt-cache depends -i PACKAGEma wynik formy Depends: dependency-name. Potrzebujemy tylko nazw zależności, więc to właśnie robi awk - pobiera tylko drugi ciąg. Na przykład spróbuj apt-cache depends -i vim | awk '{print $2}' . Zauważ również, że całą linię po prawej stronie && można uznać za jedno stwierdzenie
Sergiy Kolodyazhnyy

1
Dzięki! Ale zrobiłem trochę badań i użyłem polecenia sed '/ ^ </ d', aby usunąć część danych wyjściowych apt-cache zależy, było już dobre, ale teraz działa w każdym przypadku, gdy próbuję. Wielkie dzięki!
ebernardes

dpkg -i *.debnie jest tak dobry, nie instaluje pakietu według kolejności zależności. Dlatego może być konieczne kilkakrotne spróbowanie, aby zainstalować cały pakiet. W każdym razie do obejścia?
Mithril,

1

Czy to jednorazowa sprawa, czy chcesz być na bieżąco? Czy pracujesz głównie w trybie online i na wszelki wypadek chcesz mieć lokalną kopię zapasową wszystkich swoich pakietów?

Istnieje kilka usług, które można zainstalować, które działają jak serwer proxy / pamięć podręczna APT. Wskazujesz APT na lokalną pamięć podręczną, zostanie ona pobrana z Internetu i zachowa lokalnie buforowaną kopię wszystkich pakietów. Może to być bardzo przydatne, jeśli masz wiele komputerów w sieci z identycznym wyborem pakietów.

Mój preferowany apt cache jest w przybliżeniu , ale jest też apt-cacher-ng i kilka innych. Każda z nich ma niewielkie różnice dotyczące konfiguracji buforowania.

Zawsze używam minimalnych instalatorów netinst do budowania moich systemów opartych na Debianie, co oznacza, że ​​moja apt cache zwykle zawiera prawie wszystkie pakiety do pełnej budowy moich systemów.


Jest to coś, co chcę zachować na wszelki wypadek, jeśli muszę szybko zainstalować jakieś oprogramowanie, nawet jeśli jest to nieaktualne, zanim będę mógł je później zaktualizować.
Sprawdzę

0

uruchom następujący program 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
Dlaczego to jest lepsze niż zaakceptowana odpowiedź?
RalfFriedl

0

uruchom następujący program 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:"))

Pobierze wszystkie zależności wszystkich zależności, nie tylko bezpośrednie. Ale instalacja ich dpkg -i *.debnie powiodła się. Może dlatego, że apt-cache depends -i packagezawiera błędne informacje lub niektóre pliki.deb nadal wymagają połączenia z Internetem, aby zainstalować.


Może się nie powieść, ponieważ dpkg nie instaluje pakietów we właściwej kolejności. Możesz spróbować ponownie kilka razy dpkg, dopóki nie zostaną zainstalowane wszystkie zależności.
Czarna sowa Kai
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.