¿Es posible instalar un .deb desde una URL?

74

¿Hay alguna manera de instalar un paquete deb directamente desde una URL, usando un shell ? Algo como

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

(Sé que podría usar wget y luego dpkg, me pregunto si ya hay algo que lo haga)

Joril
fuente

Respuestas:

48

Editar: No vi su declaración anterior sobre saber que podría hacerlo, así que esto es un poco incómodo ... Dejaré esto aquí para cualquiera que quiera saber cómo hacer esto. Además, la versión anterior de mi respuesta no funcionó, pero esta versión (a expensas de ser algo más larga) sí:

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

Solo necesita modificar la URL al principio. Esto podría ser alias o escrito como una función bash.

Me doy cuenta de que hay problemas técnicos y de seguridad que lo rodean (no obtienes actualizaciones automáticas, se puede confiar en la fuente, etc.), pero sobre una base puramente de "puedo hacerlo", esto podría funcionar.

Oli
fuente
3
También sugeriría usar dpkg --skip-same-version -i $FILEsi se va a ejecutar desde scripts. Más información aquí - manpages.debian.org/unstable/dpkg/dpkg.1.en.html
Vadim Kotov
26

No es posible sin crear un archivo temporal. Normalmente harías esto como

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

o tal vez

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

pero dpkg usa mmap para acceder al archivo, por lo que ninguno funciona. Hay un informe de error sobre esto: # 367297

Tgr
fuente
44
Esta es una respuesta útil, pero la forma en que está estructurada hace que parezca que la respuesta es "sí, aquí hay dos formas de hacerlo".
bonh
1
Editado Tenga en cuenta que dpkg 1.17.7+ toma argumentos stdin para algunos de sus comandos pero no para la instalación.
Tgr
¡JAJA! Probé ambos antes de buscar en Google. Gracias por crear esta respuesta para decirle a personas con ideas afines "no estás loco".
Bruno Bronosky
9

El método más rápido es así. Haga clic para comenzar a instalar el obturador .

URL utilizadas para hacer clic en el nombre:

http://packages.ubuntu.com/shutter

... y para hacer clic en el icono:

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

Y sí, necesita Ubuntu Software Center para finalizar la instalación de un .DEB. De lo contrario, deberá ejecutar la instalación desde Nautilus o la línea de comandos.

El texto completo utilizado para esto es solo para Ask Ubuntu, por lo que debe reformatearlo en un ancla:

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

Se puede encontrar más información en la página wiki de apturl :

  1. 1 paquete:

    a href="apt:package"
    
  2. Agrupando varios paquetes:

    a href="apt:package1,package2,package3"
    
  3. Habilitar repositorios:

    apturl apt:freevial?section=universe
    

Entonces, si el software no está en un repositorio habilitado predeterminado, debe agregarle una 'sección ='. De lo contrario, no podrá utilizar este método y necesitará que el usuario lo descargue e instale.

Rinzwind
fuente
8
Sólo una nota: apturl no funciona para el software que no está en el repositorio de usuarios
sergio91pt
1
Eso está bien, gracias! De todos modos, estoy buscando algo que funcione desde la línea de comandos, edité la pregunta. Tristemente apturl espera una X en ejecución: /
Joril
6

Puedes intentarlo con curl.

Para descargar el archivo en la carpeta actual e instalarlo desde el archivo local:

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

o descargar /var/cache/apt/archives/e instalar desde allí:

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
fuente
1
usando curl obteniendo error:--install needs at least one package archive file argument
itsazzad
usando dpkg obteniendo error: dpkg-deb: error: / dev / fd / 63 'no es un archivo de formato debian'
itsazzad
usando el último rizo:dpkg: error processing archive puppetlabs-release-precise.deb (--install):
itsazzad
1
Estaba tratando de instalar wkhtmltopdf
itsazzad
44
Confirmación: todas las variantes no funcionan en Debian Jessie con dpkg 1.17.27
Envek
3

De hecho, tengo un script que hace algo similar:

Simplemente copie y pegue este script en ~/bin(cree esta carpeta si no existe):

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

Luego agregue esto a la última línea en ~/.bashrc

PATH="~/bin:$PATH"

El script es solo un contenedor para dpkg. La línea en el ~/.bashrcarchivo dice bashque cada vez que escribe dpkg, se ejecutará ~/bin/dpkg(el script), en lugar de hacerlo /usr/bin/dpkg.

La secuencia de comandos solo pasará los argumentos a dpkgsi no se proporcionan URL. El script también admite múltiples URL. Aquí hay algunos ejemplos que funcionarán:

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
fuente
Avíseme si hay algún problema con el script. No estoy en mi computadora Ubuntu, así que escribí esto fuera de mi memoria.
Andrew Gunnerson
1
¡Qué recuerdo!
enzotib
@enzotib: jaja! Con la cantidad de reinstalaciones que hago, mi memoria es más útil que mis copias de seguridad :)
Andrew Gunnerson
2

lynxpuede llamar dpkg(o al Centro de software, si hay una pantalla disponible) y ofrecerle instalar un paquete descargado. Por ejemplo, usando:

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

Y al descargar uno de los .debarchivos, se muestra el siguiente mensaje:

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: 

(Tal vez no debería intentar instalar paquetes aleatorios fuera de Internet).

muru
fuente
1

Sé que ha pasado un tiempo desde que esta pregunta fue respondida / publicada, pero aquí está mi humilde contribución :

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

Cómo instalar dpkg-getdesde Pastebin con un solo comando:

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"

Cómo usarlo (por ejemplo, para instalar 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

Y eso es todo.

Sé que no es perfecto, pero es simple y funciona.

Recuerde tener cuidado con lo que instala y desde donde lo descarga.

ruverav
fuente
0

Esta línea única basada en una respuesta SO funcionó para mí en Ubuntu 15.04 para identificar la última versión del átomo en github para mi entorno (Ubuntu de 64 bits) y luego instalarlo:

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 hace esto en un directorio tmp, el archivo deb se limpiará cada vez que vacíe su carpeta tmp. De lo contrario, puede eliminar manualmente el paquete deb si necesita espacio en disco.

placas
fuente
0

Puede agregarlo de /etc/bash.bashrcla siguiente manera (es una actualización del 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
}

Aunque no veo por qué recibo este error cuando lo llamo de la siguiente manera:

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
fuente
0

Solo pensé que daría mis dos centavos por esto. Puede instalar un paquete desde una URL con el siguiente comando:

wget insert_url_here

Una vez que se ha descargado, debe ejecutar el comando dpkg como superusuario: sudo dpkg -i insert_file_name_here

Luego solo siga las instrucciones que se presentan en la terminal.

Johnathan Brown
fuente
1
Sí, por supuesto, como se indica en la pregunta, entre paréntesis :)
Joril