É possível instalar um .deb a partir de um URL?


74

Existe uma maneira de instalar um pacote deb diretamente de uma URL, usando um shell ? Algo como

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

(Eu sei que eu poderia usar o wget e o dpkg, estou me perguntando se já existe algo que o faça)

Respostas:


48

Edit: Eu não vi a sua declaração anterior sobre saber que você poderia wget, então isso é um pouco estranho ... Vou deixar isso aqui para quem quiser saber como fazer isso. Além disso, a versão anterior da minha resposta não funcionou, mas esta versão (à custa de ser um pouco mais longa) funciona:

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

Você só precisa alterar o URL no início. Isso pode ser alternativo ou escrito como uma função bash.

Sei que há problemas técnicos e de segurança em torno disso (você não recebe atualizações automáticas, a fonte pode ser confiável, etc.), mas, com base no que posso fazer, pode funcionar.


3
Eu também sugeriria usar dpkg --skip-same-version -i $FILEse ele for executado a partir de scripts. Mais informações aqui - manpages.debian.org/unstable/dpkg/dpkg.1.en.html
— Vadim Kotov

26

Não é possível sem criar um arquivo temporário. Normalmente você faria isso como

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

ou talvez

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

mas o dpkg usa o mmap para acessar o arquivo, para que nenhum funcione. Há um relatório de bug sobre isso: # 367297


4
Essa é uma resposta útil, mas a maneira como ela é estruturada faz parecer que a resposta é "sim, aqui estão duas maneiras de fazer isso".
— bonh

1
Editado. Observe que o dpkg 1.17.7+ recebe argumentos stdin para alguns de seus comandos, mas não para instalação.
— Tgr

HA HA! Eu tentei os dois antes de pesquisar no Google. Obrigado por criar esta resposta para dizer às pessoas que pensam como "você não é louco".
— Bruno Bronosky

9

O método mais rápido é assim. Clique para começar a instalar o obturador .

URLs usados ​​para clicar no nome:

http://packages.ubuntu.com/shutter

... e para o clique no ícone:

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

E sim, você precisa do Ubuntu Software Center para concluir a instalação de um .DEB. Caso contrário, você terá que executar a instalação no Nautilus ou na linha de comando.

O texto completo usado para isso é apenas para o Ask Ubuntu, então você precisa reformatá-lo em uma âncora:

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

Mais informações podem ser encontradas na página wiki do apturl :

  1. 1 pacote:

    a href="apt:package"
    
  2. Agrupando vários pacotes:

    a href="apt:package1,package2,package3"
    
  3. Ativando repositórios:

    apturl apt:freevial?section=universe
    

Portanto, se o software não estiver em um repositório ativado por padrão, você deverá adicionar uma 'seção ='. Caso contrário, você não poderá usar esse método e precisará que o usuário faça o download e se instale.


8
Apenas uma nota: apturl não funciona para software que não é sobre a usuários repositório
— sergio91pt

1
Isso é legal, obrigado! De qualquer forma, estou procurando algo que funcione na linha de comando, editei a pergunta. Infelizmente o apturl espera um X em execução: /
— Joril 06/07

6

Você pode tentar com curl.

Para baixar o arquivo na pasta atual e instalar a partir do arquivo local:

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

ou faça o download /var/cache/apt/archives/e instale a partir daí:

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

1
usando curl obtendo erro:--install needs at least one package archive file argument
— itsazzad 27/05

usando o dpkg obtendo erro: dpkg-deb: error: / dev / fd / 63 'não é um
— arquivo no

usando last curl:dpkg: error processing archive puppetlabs-release-precise.deb (--install):
— itsazzad

1
Estava tentando instalar o wkhtmltopdf
— itsazzad

4
Confirmando: todas as variantes não funcionam no Debian Jessie com o dpkg 1.17.27
— Envek

3

Na verdade, eu tenho um script que faz algo semelhante:

Apenas copie e cole este script ~/bin(crie esta pasta se ela não existir):

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

Em seguida, adicione isso à última linha em ~/.bashrc

PATH="~/bin:$PATH"

O script é apenas um invólucro para dpkg. A linha no ~/.bashrcarquivo informa bashque sempre que você digita dpkg, ele será executado ~/bin/dpkg(o script), e não /usr/bin/dpkg.

O script apenas passará os argumentos para dpkgse não houver URLs. O script também suporta vários URLs. Aqui estão alguns exemplos que funcionarão:

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

Entre em contato se houver algum problema com o script. Eu não estou no meu computador Ubuntu, então escrevi isso fora da minha memória.
— Andrew Gunnerson

1
Que lembrança!
— enzotib

@enzotib: haha! Com a quantidade de reinstalações que faço, minha memória é mais útil que meus backups :)
— Andrew Gunnerson

2

lynxVocê pode ligar dpkg(ou o Software Center, se houver uma tela disponível) e oferecer a instalação de um pacote baixado para você. Por exemplo, usando:

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

E baixando um dos .debarquivos, o seguinte prompt é mostrado:

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 <ubuntu-devel-discuss@lists.ubuntu.com>
 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 <pkg-zsh-devel@lists.alioth.debian.org>

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: 

(Talvez eu não deva tentar instalar pacotes aleatórios fora da internet.)


1

Eu sei que já faz um tempo desde que esta pergunta foi respondida / postada, mas aqui está minha humilde contribuição :

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

Como instalar a dpkg-getpartir do Pastebin com um único 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"

Como usá-lo (por exemplo, para instalar o 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

E isso é tudo.

Eu sei que não é perfeito, mas é simples e funciona.

Lembre-se de ter cuidado com o que você instala e de onde você o baixa.


0

Essa linha única baseada em uma resposta SO funcionou para mim no Ubuntu 15.04 para identificar a versão mais recente do atom no github para o meu ambiente (Ubuntu de 64 bits) e instalá-lo:

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

Se você fizer isso em um diretório tmp, o arquivo deb será limpo sempre que você esvaziar sua pasta tmp. Caso contrário, você poderá excluir manualmente o pacote deb se precisar de espaço em disco.


0

Você pode anexá- /etc/bash.bashrclo da seguinte forma (é uma atualização do 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
}

Embora eu não perceba por que recebo esse erro ao chamá-lo da seguinte maneira:

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

0

Apenas pensei em dar meus dois centavos por isso. Você pode instalar um pacote a partir de uma URL usando o seguinte comando:

wget insert_url_here

Após o download, você precisa executar o comando dpkg como superusuário: sudo dpkg -i insert_file_name_here

Em seguida, basta seguir as instruções apresentadas no terminal.


1
Sim, claro, como afirmado na pergunta, entre parênteses :)
— Joril
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.