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

Joril
fonte

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.

Oli
fonte
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

Tgr
fonte
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.

Rinzwind
fonte
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
kenorb
fonte
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
Andrew Gunnerson
fonte
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 <[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: 

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

muru
fonte
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.

ruverav
fonte
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.

fogão
fonte
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' !
Cypher2
fonte
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.

Johnathan Brown
fonte
1
Sim, claro, como afirmado na pergunta, entre parênteses :)
Joril