Est-il possible d'installer un fichier .deb à partir d'une URL?

74

Est-il possible d'installer un paquet deb directement à partir d'une URL, à l' aide d'un shell ? Quelque chose comme

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

(Je sais que je pourrais utiliser wget puis dpkg, je me demande si quelque chose le fait déjà)

Joril
la source

Réponses:

48

Edit: Je n’avais pas vu votre déclaration précédente selon laquelle vous saviez que vous pouviez aller, c’est donc un peu gênant ... Je laisse cela ici pour tous ceux qui veulent savoir comment faire cela. De plus, la version précédente de ma réponse ne fonctionnait pas mais cette version (au prix d'un peu plus long) fait:

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

Il vous suffit de modifier l'URL au début. Cela pourrait être aliasé ou écrit comme une fonction bash.

Je me rends compte que des problèmes techniques et de sécurité l’entourent (vous n’obtenez pas de mises à jour automatiques, vous pouvez faire confiance à la source, etc.), mais sur une base purement can-i-do-it, cela pourrait fonctionner.

Oli
la source
3
Je suggérerais également d'utiliser dpkg --skip-same-version -i $FILEs'il doit être exécuté à partir de scripts. Plus d'infos ici - manpages.debian.org/unstable/dpkg/dpkg.1.en.html
Vadim Kotov
26

Ce n'est pas possible sans créer un fichier temporaire. Normalement, vous feriez comme ceci

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

ou peut-être

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

mais dpkg utilise mmap pour accéder au fichier et ne fonctionne donc pas. Il y a un rapport de bogue à ce sujet: # 367297

Tgr
la source
4
C'est une réponse utile, mais sa structure donne à penser que la réponse est «oui, il y a deux façons de le faire».
Bonh
1
Édité. Notez que dpkg 1.17.7+ accepte les arguments stdin pour certaines de ses commandes mais pas pour l’installation.
Tgr
HA HA! J'ai essayé les deux avant Googling. Merci d'avoir créé cette réponse pour dire aux personnes ayant les mêmes idées, "tu n'es pas fou."
Bruno Bronosky le
9

La méthode la plus rapide est comme ça. Cliquez pour commencer l'installation de l' obturateur .

URL utilisées pour cliquer sur le nom:

http://packages.ubuntu.com/shutter

... et pour le clic sur l'icône:

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

Et oui, vous avez besoin du Centre de logiciel Ubuntu pour terminer l'installation d'un .DEB. Sinon, vous devrez exécuter l'installation à partir de Nautilus ou en ligne de commande.

Le texte complet utilisé pour cela concerne Ask Ubuntu uniquement. Vous devez donc reformater le fichier en une ancre:

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

Plus d'informations peuvent être trouvées sur la page wiki d'apturl :

  1. 1 paquet:

    a href="apt:package"
    
  2. Regrouper plusieurs paquets:

    a href="apt:package1,package2,package3"
    
  3. Activation des référentiels:

    apturl apt:freevial?section=universe
    

Ainsi, si le logiciel ne se trouve pas dans un référentiel activé par défaut, vous devez lui ajouter une 'section ='. Sinon, vous ne pouvez pas utiliser cette méthode et avez besoin de l'utilisateur pour le télécharger et l'installer.

Rinzwind
la source
8
Juste une remarque: AptUrl ne fonctionne pas pour les logiciels qui ne se
trouvent
1
C'est gentil, merci! Quoi qu'il en soit, je cherche quelque chose qui fonctionne à partir de la ligne de commande, j'ai modifié la question. Malheureusement, apturl s'attend à une course X: /
Joril
6

Vous pouvez essayer avec curl.

Pour télécharger le fichier dans le dossier actuel et l'installer à partir du fichier local:

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

ou télécharger /var/cache/apt/archives/et installer à partir de là:

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
la source
1
erreur d'utilisation de curl:--install needs at least one package archive file argument
itsazzad
en utilisant dpkg en obtenant l'erreur: dpkg-deb: error: / dev / fd / 63 'n'est pas une archive de format Debian`
itsazzad
en utilisant la dernière boucle:dpkg: error processing archive puppetlabs-release-precise.deb (--install):
itsazzad
1
J'essayais d'installer wkhtmltopdf
itsazzad
4
Confirmation: toutes les variantes ne fonctionnent pas dans Debian Jessie avec dpkg 1.17.27
Envek
3

J'ai en fait un script qui fait quelque chose de similaire:

Il suffit de copier et coller ce script dans ~/bin(créer ce dossier s'il n'existe pas):

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

Ajoutez ensuite ceci à la dernière ligne de ~/.bashrc

PATH="~/bin:$PATH"

Le script est juste un wrapper pour dpkg. La ligne dans le ~/.bashrcfichier indique bashque chaque fois que vous tapez dpkg, il s’exécutera ~/bin/dpkg(le script) plutôt que /usr/bin/dpkg.

Le script ne fera que transmettre les arguments dpkgs'il n'y a pas d'URL fournie. Le script prend également en charge plusieurs URL. Voici quelques exemples qui fonctionneront:

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
la source
S'il vous plaît laissez-moi savoir s'il y a des problèmes avec le script. Je n’ai pas accès à mon ordinateur Ubuntu, j’écrivais cela de ma mémoire.
Andrew Gunnerson
1
Quel souvenir!
enzotib
@enzotib: haha! Avec la quantité de réinstallations que je fais, ma mémoire est plus utile que mes sauvegardes :)
Andrew Gunnerson
2

lynxpouvez appeler dpkg(ou le centre logiciel, si un affichage est disponible) et vous proposer d'installer un package téléchargé pour vous. Par exemple, en utilisant:

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

En téléchargeant l’un des .debfichiers, l’invite suivante s’affiche:

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: 

(Peut-être que je ne devrais pas essayer d'installer des paquets aléatoires sur Internet.)

muru
la source
1

Je sais que cela fait longtemps que cette question n'a pas été répondue / posée, mais voici mon humble contribution :

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

Comment installer à dpkg-getpartir de Pastebin avec une seule commande:

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"

Comment l'utiliser (par exemple pour installer 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

Et c'est tout.

Je sais que ce n'est pas parfait, mais c'est simple et ça marche.

N'oubliez pas de faire attention à ce que vous installez et à l'endroit où vous le téléchargez.

Ruverav
la source
0

Ce one-liner basé sur une réponse SO a fonctionné pour moi sur Ubuntu 15.04 pour identifier la dernière version de l' atome sur github pour mon environnement (Ubuntu 64 bits), puis pour l'installer:

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

Si vous faites cela dans un répertoire tmp, le fichier deb sera nettoyé chaque fois que vous videz votre dossier tmp. Sinon, vous pouvez supprimer manuellement le paquet deb si vous avez besoin d’espace disque.

des plaques
la source
0

Vous pouvez l'ajouter /etc/bash.bashrccomme il suit (c'est une mise à jour du script de Chen):

'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
}

Bien que je ne vois pas pourquoi je reçois cette erreur lorsque je l’appelle comme suit:

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' !
Cypher2
la source
0

Je pensais que je donnerais mes propres deux centimes à ce sujet. Vous pouvez installer un package à partir d'une URL à l'aide de la commande suivante:

wget insert_url_here

Une fois le téléchargement effectué, vous devez exécuter la commande dpkg en tant que superutilisateur: sudo dpkg -i insert_file_name_here

Il suffit ensuite de suivre les instructions présentées dans le terminal.

Johnathan Brown
la source
1
Oui bien sûr, comme indiqué dans la question, entre parenthèses :)
Joril