Czy można zainstalować .deb z adresu URL?

74

Czy istnieje sposób na zainstalowanie pakietu deb bezpośrednio z adresu URL za pomocą powłoki ? Coś jak

dpkg -i http://domain.com/path/to/package.deb

(Wiem, że mógłbym użyć wget, a następnie dpkg, po prostu zastanawiam się, czy jest coś, co już to robi)

Joril
źródło

Odpowiedzi:

48

Edycja: Nie widziałem twojego poprzedniego oświadczenia o tym, że możesz się założyć, więc jest to trochę niezręczne ... Zostawię to tutaj każdemu, kto chce wiedzieć, jak to zrobić. Dodatkowo poprzednia wersja mojej odpowiedzi nie działała, ale ta wersja (kosztem nieco dłuższego) działa:

TEMP_DEB="$(mktemp)" &&
wget -O "$TEMP_DEB" 'http://path.to/my.deb' &&
sudo dpkg -i "$TEMP_DEB"
rm -f "$TEMP_DEB"

Musisz tylko zmienić adres URL na początku. Może to być alias lub zapisany jako funkcja bash.

Zdaję sobie sprawę z tego, że są związane z tym problemy techniczne i związane z bezpieczeństwem (nie otrzymujesz automatycznych aktualizacji, czy można zaufać źródłu itp.), Ale na zasadzie, że mogę zrobić, może to działać.

Oli
źródło
3
Sugerowałbym również użyć, dpkg --skip-same-version -i $FILEjeśli będzie uruchamiany ze skryptów. Więcej informacji tutaj - manpages.debian.org/unstable/dpkg/dpkg.1.en.html
Vadim Kotov
26

Nie jest to możliwe bez utworzenia pliku tymczasowego. Normalnie zrobiłbyś to tak

### Does not work
wget --quiet --output-document=- http://example.com/path/to/package.deb | dpkg --install -

albo może

### Does not work
dpkg --install <(wget --quiet --output-document=- http://example.com/path/to/package.deb)

ale dpkg używa mmap do uzyskania dostępu do pliku, więc żadne z nich nie działa. Istnieje raport o błędzie na ten temat: # 367297

Tgr
źródło
4
To przydatna odpowiedź, ale jej struktura sprawia, że ​​wydaje się, że odpowiedź brzmi „tak, oto dwa sposoby na zrobienie tego”.
bonh
1
Edytowane. Zauważ, że dpkg 1.17.7+ przyjmuje argumenty stdin dla niektórych swoich poleceń, ale nie dla instalacji.
Tgr
HA HA! Próbowałem obu tych rzeczy przed Googlingiem. Dziękujemy za utworzenie tej odpowiedzi, aby powiedzieć podobnie myślącym ludziom: „nie jesteś szalony”.
Bruno Bronosky,
9

Najszybsza metoda jest taka. Kliknij, aby rozpocząć instalację migawki .

Adresy URL używane do klikania nazwy:

http://packages.ubuntu.com/shutter

... i kliknij ikonę:

http://apt.ubuntu.com/p/shutter

I tak, potrzebujesz Centrum Oprogramowania Ubuntu, aby zakończyć instalację .DEB. W przeciwnym razie będziesz musiał przeprowadzić instalację z Nautilus lub wiersza poleceń.

Pełny tekst użyty do tego jest tylko dla Ask Ubuntu, więc musisz sformatować to w kotwicę:

[shutter](http://packages.ubuntu.com/shutter) [![Install shutter]
(https://i.stack.imgur.com/HjNGK.png)](http://apt.ubuntu.com/p/shutter)

Więcej informacji można znaleźć na stronie wiki apturl :

  1. 1 opakowanie:

    a href="apt:package"
    
  2. Pakowanie kilku pakietów:

    a href="apt:package1,package2,package3"
    
  3. Włączanie repozytoriów:

    apturl apt:freevial?section=universe
    

Więc jeśli oprogramowanie nie znajduje się w domyślnie włączonym repozytorium, należy dodać do niego „section =”. W przeciwnym razie nie będziesz mógł użyć tej metody i musisz pobrać ją i zainstalować samodzielnie.

Rinzwind
źródło
8
Tylko uwaga: AptUrl nie działa w przypadku oprogramowania, które nie znajduje się w repozytorium użytkowników
sergio91pt
1
To miło, dzięki! W każdym razie szukam czegoś, co działałoby z wiersza poleceń, zredagowałem pytanie. Niestety, apturl oczekuje działającego X: /
Joril
6

Możesz spróbować curl.

Aby pobrać plik do bieżącego folderu i zainstalować z pliku lokalnego:

curl -sLO https://apt.puppetlabs.com/puppetlabs-release-precise.deb && sudo dpkg -i puppetlabs-release-precise.deb

lub pobierz /var/cache/apt/archives/i zainstaluj stamtąd:

curl -sL -o/var/cache/apt/archives/puppetlabs-release-precise.deb https://apt.puppetlabs.com/puppetlabs-release-precise.deb && sudo dpkg -i /var/cache/apt/archives/puppetlabs-release-precise.deb
kenorb
źródło
1
błąd curl podczas uzyskiwania:--install needs at least one package archive file argument
itsazzad
przy użyciu dpkg dpkg-deb: error: pojawia się błąd: / dev / fd / 63 'nie jest archiwum formatu Debian`
itsazzad
za pomocą ostatniego curl:dpkg: error processing archive puppetlabs-release-precise.deb (--install):
itsazzad
1
Próbowałem zainstalować wkhtmltopdf
itsazzad
4
Potwierdzanie: wszystkie warianty nie działają w Debian Jessie z dpkg 1.17.27
Envek
3

Mam skrypt, który robi coś podobnego:

Po prostu skopiuj i wklej ten skrypt do ~/bin(utwórz ten folder, jeśli nie istnieje):

#!/bin/bash
# ~/bin/dpkg
COUNT=0
for i in $@; do
        echo $i | grep http 2>&1 > /dev/null
        if [ $? == 0 ]; then
                URL="$URL $i"
                continue
        fi
        PASSTODPKG="$PASSTODPKG $i"
done

#Remove beginning and trailing space
URL=$(echo $URL | sed -e 's/^ //g' -e 's/ $//g')

if [ ! -z $URL ]; then
        mkdir /tmp/debs
        cd /tmp/debs
        for i in $URL; do
                wget "$i"
        done
        dpkg $PASSTODPKG /tmp/debs/*.deb
else
        dpkg $PASSTODPKG
fi

Następnie dodaj to do ostatniego wiersza w ~/.bashrc

PATH="~/bin:$PATH"

Skrypt jest tylko opakowaniem dpkg. Wiersz w ~/.bashrcpliku informuje, bashże za każdym razem, gdy wpiszesz dpkg, uruchomi się ~/bin/dpkg(skrypt), a nie /usr/bin/dpkg.

Skrypt po prostu przekaże argumenty, dpkgjeśli nie podano adresu URL. Skrypt obsługuje również wiele adresów URL. Oto kilka przykładów, które będą działać:

sudo dpkg -i http://www.example.com/file1.deb
sudo dpkg -i http://www.example.com/file1.deb http://www.example.com/file2.deb
sudo dpkg -i http://www.example.com/file1.deb existing.deb http://www.example.com/file2.deb
sudo dpkg -i existing.deb
Andrew Gunnerson
źródło
Daj mi znać, jeśli występują problemy ze skryptem. Nie mam przy komputerze Ubuntu, więc zapisałem to sobie w pamięci.
Andrew Gunnerson,
1
Co za wspomnienie!
enzotib,
@enzotib: haha! Dzięki liczbie
ponownych
2

lynxmoże zadzwonić dpkg(lub do Centrum oprogramowania, jeśli dostępny jest wyświetlacz) i zaoferować zainstalowanie pobranego pakietu. Na przykład za pomocą:

lynx http://archive.ubuntu.com/ubuntu/pool/main/z/zsh/

Po pobraniu jednego z .debplików wyświetlany jest następujący monit:

Info for debian package '/tmp/user/1000/L11127-6774TMP.udeb':
 new debian package, version 2.0.
 size 2545218 bytes: control archive=5830 bytes.
     857 bytes,    21 lines      control              
   14682 bytes,   169 lines      md5sums              
     225 bytes,    20 lines   *  postinst             #!/bin/sh
 Package: zsh-doc
 Source: zsh
 Version: 5.1.1-1ubuntu1
 Architecture: all
 Maintainer: Ubuntu Developers <[email protected]>
 Installed-Size: 5291
 Depends: zsh-common (= 5.1.1-1ubuntu1)
 Section: doc
 Priority: optional
 Homepage: http://www.zsh.org/
 Description: zsh documentation - info/HTML format
  Zsh is a UNIX command interpreter (shell) usable as an
  interactive login shell and as a shell script command
  processor. Of the standard shells, zsh most closely resembles
  ksh but includes many enhancements. Zsh has command-line editing,
  built-in spelling correction, programmable command completion,
  shell functions (with autoloading), a history mechanism, and a
  host of other features.
  .
  This contains the documentation in GNU info and HTML formats.
 Original-Maintainer: Debian Zsh Maintainers <[email protected]>

Do you wish to:
 - I)nstall the package now,
 - S)ave it to a file, or
 - Q)uit now
Your choice (I/S/Q)? I
Installation of Debian packages needs to be done as root.
Enter command used to become root (default=sudo): 

Installing package...
[sudo] password for bro3886: 
(Reading database ... 756955 files and directories currently installed.)
Preparing to unpack .../user/1000/L11127-6774TMP.udeb ...
Unpacking zsh-doc (5.1.1-1ubuntu1) over (5.0.5-4ubuntu1~ubuntu14.04.1) ...
dpkg: dependency problems prevent configuration of zsh-doc:
 zsh-doc depends on zsh-common (= 5.1.1-1ubuntu1); however:
  Version of zsh-common on system is 5.0.5-4ubuntu1~ubuntu14.04.1.

dpkg: error processing package zsh-doc (--install):
 dependency problems - leaving unconfigured
Processing triggers for doc-base (0.10.5) ...
Processing 1 changed doc-base file...
Processing triggers for install-info (5.2.0.dfsg.1-2) ...
Errors were encountered while processing:
 zsh-doc

Done.  Press <return> to continue: 

(Może nie powinienem próbować instalować losowych pakietów z Internetu.)

muru
źródło
1

Wiem, że minęło trochę czasu, odkąd na to pytanie udzielono odpowiedzi / opublikowano, ale oto mój skromny wkład :

#!/bin/bash
dir="/tmp/dpkg-get"
url="$1"
file="${url##*/}"

if [ "$EUID" -ne 0 ]
then
echo "Please run as root"
exit
fi

[ -d $dir ] || mkdir $dir
wget -q --show-progress -O "$dir/$file" $url && \
dpkg -i "$dir/$file"

Jak zainstalować dpkg-getz Pastebin za pomocą jednego polecenia:

sudo bash -c "wget http://pastebin.com/raw/GWu7qLwK -O- | tr -d '\r' > /usr/local/bin/dpkg-get && \
chmod a+x /usr/local/bin/dpkg-get"

Jak go używać (na przykład, aby zainstalować PowerShell 6 alpha):

sudo dpkg-get https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.10/powershell_6.0.0-alpha.10-1ubuntu1.16.04.1_amd64.deb

I to wszystko.

Wiem, że to nie jest idealne, ale jest proste i działa.

Pamiętaj, aby uważać na to, co instalujesz i skąd go pobierasz.

ruverav
źródło
0

Ten jednowierszowy, oparty na odpowiedzi SO, działał dla mnie na Ubuntu 15.04 w celu zidentyfikowania najnowszej wersji atomu na github dla mojego środowiska (64-bitowe Ubuntu), a następnie zainstalowania go:

sudo dpkg -i $(curl -w "%{filename_effective}" -LO $(curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4))

Jeśli zrobisz to w katalogu tmp, plik deb zostanie wyczyszczony po każdym opróżnieniu folderu tmp. W przeciwnym razie możesz ręcznie usunąć pakiet deb, jeśli potrzebujesz miejsca na dysku.

płyty grzewcze
źródło
0

Możesz dołączyć go /etc/bash.bashrcw następujący sposób (jest to ulepszenie ze skryptu Chena):

'dpkg-url'() {

COUNT=0

for package in "${urls[@]}"; do
    if [[ $package = *http* ]]; then 
    urls+=("$package")
    fi

    dpkg_url="$dpkg_url "$package""
done

# Remove beginning and trailing spaces #

url=$(echo "$url" | sed -e 's/^ //g' -e 's/ $//g')

if [[ ! -z "$url" ]]; then
    directory=$(mktemp -d);
        trap 'rm -rf "$directory"' EXIT

    cd "$directory" || exit
        for package in "$url"; do
            wget ""$package""
        done
    dpkg $dpkg_url "$directory"/*.deb
else
    dpkg $dpkg_url
fi
}

Chociaż nie rozumiem, dlaczego pojawia się ten błąd podczas wywoływania go w następujący sposób:

dpkg-url -i http://downloads.sourceforge.net/ldview/ldview-4.2-beta1.x64.deb
dpkg: error: need an action option

Type dpkg --help for help about installing and deinstalling packages [*];
Use `dselect' or `aptitude' for user-friendly package management;
Type dpkg -Dhelp for a list of dpkg debug flag values;
Type dpkg --force-help for a list of forcing options;
Type dpkg-deb --help for help about manipulating *.deb files;

Options marked [*] produce a lot of output - pipe it through `less' or `more' !
Szyfr 2
źródło
0

Pomyślałem, że dam za to dwa centy. Możesz zainstalować pakiet z adresu URL za pomocą następującego polecenia:

wget insert_url_here

Po pobraniu należy uruchomić polecenie dpkg jako administrator: sudo dpkg -i insert_file_name_here

Następnie postępuj zgodnie z instrukcjami wyświetlanymi w terminalu.

Johnathan Brown
źródło
1
Tak, oczywiście, jak stwierdzono w pytaniu, między nawiasami :)
Joril