Como baixar pacotes de um repositório dado pela linha de comando?

3

Não se trata do download comum & instalar coisa, o que o apt (aptitude, etc) faz, é um download em script de um arquivo de pacote.

Eu encontrei a ferramenta dget para esta tarefa, que funciona muito bem. Mas, infelizmente, ele não tem nenhuma opção para especificar um URL de repositório diferente, como é dado no /etc/apt/sources.list .

É de alguma forma possível? Na verdade, uma funcionalidade semelhante a dget seria a melhor, mas , onde também posso especificar o URL do repo.

p. muito obrigado os scripts, mas eu gostaria de preferir uma ferramenta debian para esta tarefa muito simples . Ele fará parte de um script, para uso externo, e qualquer complexidade desnecessária tem custos colaterais intoleráveis. Isso deve ser feito por uma ferramenta debian.

P.s.2. Finalmente, resolvi isso atualizando os repositórios de todo o sistema e baixando os pacotes com dget . Muito obrigado os roteiros!

    
por peterh 10.08.2016 / 09:59

4 respostas

2

Se você estiver executando uma versão razoavelmente recente do Debian ou outra distribuição usando o apt, você pode usar apt-get para isto. Coloque as seguintes configurações em um arquivo chamado apt-get.conf para não usar

Dir::Etc::main ".";
Dir::Etc::Parts "./apt.conf.d";
Dir::Etc::sourcelist "./sources.list";
Dir::Etc::sourceparts "./sources.list.d";
Dir::State "./apt-tmp";
Dir::State::status "./apt-tmp/status";
Dir::Cache "./apt-tmp";

Prepare alguns arquivos necessários:

mkdir -p apt-tmp/lists/partial
touch apt-tmp/status
apt-get -c apt.conf update >/dev/null

Então você pode baixar pacotes para o diretório atual com

apt-get -c apt.conf download $packages

Com versões antigas de apt-get que não possuem o comando download , você pode usar

apt-get -c apt.conf install -d $packages

para baixar pacotes e suas dependências em apt-tmp/archives .

    
por 15.08.2016 / 21:38
7

Todas as ferramentas que posso encontrar usam a informação local apt (e, portanto, os repositórios em /etc/apt/sources.list etc., conforme definido na última vez em que apt-get update foi executado). Não é muito difícil interpretar o formato de repositório .

Salvar

#!/bin/sh
# Downloads a package from a repository
# dlpkg repo distro suite arch package

for arch in all "${4}"; do
    curl "${1}/dists/${2}/${3}/binary-${arch}/Packages.xz" | xz -d | "$(dirname $0)/pkgfilename" -v "PACKAGE=${5}" | while read filename; do
        curl -O "${1}/${filename}"
    done
done

como dlpkg e

#!/usr/bin/awk -f

/Package:/ {
    package = $2
}

package == PACKAGE && /Filename:/ {
    print $2
}

como pkgfilename , torne-os executáveis e você pode baixar um pacote executando

./dlpkg <repository URL> <distribution> <suite> <architecture> <package>

por exemplo

./dlpkg http://ftp.fr.debian.org/debian unstable main amd64 libc6

Se você precisar lidar com repositórios cujos Packages arquivos não estão em ordem canônica ( Package antes de Filename ), você pode usar o seguinte script AWK:

#!/usr/bin/awk -f

BEGIN {
    filename = ""
}

/^$/ {
    filename = ""
    stanza = 0
}

/Package:/ {
    if ($2 == PACKAGE) {
        stanza = 1
        if (filename != "") {
            print filename
            stanza = 0
        }
    }
}

/Filename:/ {
    filename = $2
    if (stanza == 1) {
        print filename
        filename = ""
    }
}

Não há tratamento de erros, que é deixado como um exercício para o leitor. Não há verificação de assinatura ...

    
por 10.08.2016 / 12:09
2

Eu não acho que o que você está tentando alcançar esteja de acordo com a idéia de ter repos como tal. A ideia é que você teria que adicionar o repositório ao repolista e depois instalar a partir dele, etc.

É possível baixar um pacote manualmente (eu faço isso com bastante freqüência com pacotes RPM para o Fedora), e instalo um pacote manualmente com as ferramentas comuns (no meu caso dnf ).

Geralmente, uso o URL de /etc/yum.repos.d/<repo>.repo e, depois, navego com um navegador e faço o download com wget . Deve ser análogo aos pacotes DEB.

Então,

  1. Faça o download do pacote manualmente com um navegador ou wget
  2. Instale com o seu cliente de gerenciamento de pacotes da cli.

Se o repo estiver diretamente disponível on-line (o que não vejo por que não), dnf entende quando recebe um URL para um pacote RPM. Tenho certeza que a ferramenta equivalente do Debian fará o mesmo. Então você vai economizar o download do pacote com um navegador ou com wget .

Pelo que entendi, você está interessado apenas em baixar os pacotes. Então, nesse caso, acho que usar wget simples é o melhor caminho a seguir, etc.

    
por 10.08.2016 / 11:14
2

Bem, talvez este script seja uma solução para suas necessidades:

#!/bin/bash

U="$1"
FILE="$2"

[[ -z "$U" ]] && echo -e "Usage: $0 repo-url [file to download]\nwithout give \"file to download\" this script will list the files inside the repo\n";

for i in $(curl -l "$U" 2>/dev/null|grep -i 'href='|sed -e 's/.*href=//g' -e 's/>.*//g' -e 's/"//g'|grep -v '/$'|grep "$FILE")
do
 if [[ -z "$FILE" ]]
 then
  echo "FILE: $i"
 else
  echo "Download file: $i"
  curl -q "${U}/${i}" --output "$i" 2>/dev/null
  ls -la "$i"
 fi
done

    
por 10.08.2016 / 10:37

Tags