Questão Como posso obter uma lista de todos os repositórios e PPAs da linha de comando em um script de instalação?


Eu sei como listar todos os pacotes instalado no meu sistema.

Mas como eu poderia obter uma lista de todos os repositórios e PPAs em um script que eu possa executar em uma nova máquina para replicar a configuração do repositório, incluindo as chaves?

Eu sei que posso olhar para /etc/apt/sources.list e /etc/apt/sources.list.d, mas eu estou procurando uma maneira de gerar um script que executa tudo apt-add-repository comandos em um novo sistema (que classifica obtendo todas as chaves).

Alguma ideia?


184
2018-06-10 11:30


origem


Duplicação possível: askubuntu.com/questions/28644/how-can-i-backup-my-ppas - Glutanimate
Na verdade, um superconjunto. Minha pergunta era sobre um script que gera o script de restauração, não apenas o backup - stwissel


Respostas:


Obrigado pelos ponteiros. Com um pouco de limpeza eu tenho um script que lista os PPAs, mas não qualquer outro repositório:

#! /bin/sh 
# listppa Script to get all the PPA installed on a system ready to share for reininstall
for APT in `find /etc/apt/ -name \*.list`; do
    grep -o "^deb http://ppa.launchpad.net/[a-z0-9\-]\+/[a-z0-9\-]\+" $APT | while read ENTRY ; do
        USER=`echo $ENTRY | cut -d/ -f4`
        PPA=`echo $ENTRY | cut -d/ -f5`
        echo sudo apt-add-repository ppa:$USER/$PPA
    done
done

Quando você liga com listppa > installppa.sh você obtém um script que pode ser copiado em uma nova máquina para reinstalar todo o PPA.

Próxima parada: faça isso para os outros repositórios:

#! /bin/sh
# Script to get all the PPA installed on a system
for APT in `find /etc/apt/ -name \*.list`; do
    grep -Po "(?<=^deb\s).*?(?=#|$)" $APT | while read ENTRY ; do
        HOST=`echo $ENTRY | cut -d/ -f3`
        USER=`echo $ENTRY | cut -d/ -f4`
        PPA=`echo $ENTRY | cut -d/ -f5`
        #echo sudo apt-add-repository ppa:$USER/$PPA
        if [ "ppa.launchpad.net" = "$HOST" ]; then
            echo sudo apt-add-repository ppa:$USER/$PPA
        else
            echo sudo apt-add-repository \'${ENTRY}\'
        fi
    done
done

Isso deve fazer o truque. Eu precisava de um pergunta no superusuário para descobrir o regex correto.


89
2018-06-10 13:49



Na tua grep -o exemplo, o \`  dentro [a-z0-9\-] não está fazendo o que você espera. Na verdade, corresponde a um literal barra invertida. Você não precisa escapar a - quando é no início ou no final do [] Lista; na verdade, você não pode escapar isso! .. Neste caso, o \` (provavelmente) não causará um problema, porque você (esperançosamente) não encontrará um barra invertida no deb entrada. - Peter.O
Note que os nomes PPA podem conter pontos, então eu acho que você quer mudar seu regexp para http://ppa.launchpad.net/[a-z0-9-]\+/[a-z0-9.-]\+ - kynan
Não, você quer mudar o regex para [[:graph:]]  ao invés de [a-z...blah.anything] porque isso corresponderá a qualquer alfanumérico + caracteres de pontuação - é isso que os nomes de PPA consistem. - MichalH
Eu suponho que você deveria incluir deb palavra no início de cada linha de repositório, se não for ppa:$USER/$PPA Formato. - jarno
@stwissel alguma razão particular que você usou para encontrar e depois grep? Você pode facilmente fazer um glob que o shell analisa e passá-lo para o grep. grep -Po "(?<=^deb\s).*?(?=#|$)" /etc/apt/{sources.list,sources.list.d/*.list} | while read ENTRY ; do echo $ENTRY; done Observe que, conforme escrito, isso mostra o nome do arquivo de cada entrada, de modo que é necessário fazer um ajuste desde o início do resultado até o primeiro cólon, mas isso não é muito difícil com o corte. Você também pode querer passá-lo através uniq se você não quiser várias entradas para a mesma fonte (por exemplo, se você tiver o Stable / Beta / Dev do Google Chrome instalado). - dragon788


Você pode mostrar tudo com:

grep ^ /etc/apt/sources.list /etc/apt/sources.list.d/*

80
2018-06-10 12:52



Sobre o quê egrep -v '^#|^ *$' /etc/apt/sources.list /etc/apt/sources.list.d/* remover linhas comentadas e linhas em branco?
você poderia por favor explicar o uso de ^ depois de grep dentro grep ^ /etc/apt/sources.list /etc/apt/sources.list.d/*?
@ vasa1 O cursor ^ e o sinal de dólar $ são metacaracteres que correspondem respectivamente à string vazia no início e no final de uma linha. - wojox
Eu uso o grep ^ [^ #] ... - Ele esconde automaticamente todas as fontes comentadas - Ross Aiken
Se você não vai filtrar nada, não seria mais simples apenas executar cat /etc/apt/sources.list /etc/apt/sources.list.d/* - jbo5112


Surpreende-me que a maneira mais simples, mas mais eficaz, de obter todas as fontes de software binárias ativadas, juntamente com o arquivo no qual elas estão especificadas, ainda não foi publicada:

grep -r --include '*.list' '^deb ' /etc/apt/sources.list /etc/apt/sources.list.d/

De todos os arquivos processados, isso imprimirá todas as linhas que começam com deb. Isso exclui as linhas comentadas, bem como deb-src linhas para ativar os repositórios de código-fonte.

Ele procura realmente apenas todos *.list arquivos que serão analisados ​​por aptmas, e. não *.list.save arquivos usados ​​para backup ou outros com nomes ilegais.


Se você quer um menor, mas possivelmente apenas em 99,9% de todos os casos de saída correta que pode procurar muitos arquivos (inclui todos os /etc/apt/sources.list* arquivos e diretórios, não apenas /etc/apt/sources.list e `/etc/apt/sources.list.d/*), você também pode usar isto:

grep -r --include '*.list' '^deb ' /etc/apt/sources.list*

A menos que existam arquivos que não devam estar lá, a saída será a mesma.


Um exemplo de saída na minha máquina seria isto:

/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-backports main restricted universe multiverse
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security main restricted
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security universe
/etc/apt/sources.list:deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security multiverse
/etc/apt/sources.list:deb http://archive.canonical.com/ubuntu wily partner
/etc/apt/sources.list.d/maarten-fonville-ubuntu-ppa-wily.list:deb http://ppa.launchpad.net/maarten-fonville/ppa/ubuntu wily main
/etc/apt/sources.list.d/webupd8team-ubuntu-tor-browser-wily.list:deb http://ppa.launchpad.net/webupd8team/tor-browser/ubuntu wily main
/etc/apt/sources.list.d/fossfreedom-ubuntu-indicator-sysmonitor-wily.list:deb http://ppa.launchpad.net/fossfreedom/indicator-sysmonitor/ubuntu wily main
/etc/apt/sources.list.d/getdeb.list:deb http://archive.getdeb.net/ubuntu wily-getdeb apps

Se você quiser uma saída mais bonita, vamos canalizá-la sed:

grep -r --include '*.list' '^deb ' /etc/apt/ | sed -re 's/^\/etc\/apt\/sources\.list((\.d\/)?|(:)?)//' -e 's/(.*\.list):/\[\1\] /' -e 's/deb http:\/\/ppa.launchpad.net\/(.*?)\/ubuntu .*/ppa:\1/'

E vamos ver isso:

deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-updates multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-backports main restricted universe multiverse
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security main restricted
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security universe
deb http://ftp-stud.hs-esslingen.de/ubuntu/ wily-security multiverse
deb http://archive.canonical.com/ubuntu wily partner
[maarten-fonville-ubuntu-ppa-wily.list] ppa:maarten-fonville/ppa
[webupd8team-ubuntu-tor-browser-wily.list] ppa:webupd8team/tor-browser
[fossfreedom-ubuntu-indicator-sysmonitor-wily.list] ppa:fossfreedom/indicator-sysmonitor
[getdeb.list] deb http://archive.getdeb.net/ubuntu wily-getdeb apps

14
2018-03-04 08:57



Indo pela resposta aceita, parece OP queria PPAs a ser mostrado no ppa:<user>/<project> Formato. - muru
A questão realmente pede para gerar um script que instale / habilite todos os repositórios. Mas o título da questão é apenas listá-los. Além disso, a segunda resposta com pontuação mais alta apenas as lista, mas lista demais. - Byte Commander
Bom, mas eu já tinha upvoted. : D - muru


Eu uso este comando para listar todas as fontes de software configuradas (repositórios), incluindo os atualmente desativados:

cat /etc/apt/sources.list; for X in /etc/apt/sources.list.d/*; do echo; echo; echo "** $X:"; echo; cat $X; done

Eu uso isso principalmente para solução de problemas; isso pode certamente ser incorporado em scripts, mas você pode querer estreitar /etc/apt/sources.list.d/* para /etc/apt/sources.list.d/*.list para que você tenha apenas fontes de software ativadas no momento.


4
2018-06-12 08:57



Thx pelo feedback. cat lista os arquivos como estão, então eu precisaria editá-los manualmente para gerar um script (como afirmado na pergunta). O desafio com repositórios: se você acabou de copiar os arquivos do / etc / apt você não obtém as chaves do repositório. É por isso que eu quero um script que os busque para nós - stwissel


Execute o seguinte comando:

apt-cache policy | grep http | awk '{print $2 $3}' | sort -u

Fonte


4
2018-06-12 11:43





Então, fazendo algumas escavações, temos AptPkg::Class.

Então usando perl podemos fazer algo simples assim

perl -MAptPkg::Cache -MData::Dumper -E'say Dumper [AptPkg::Cache->new->files()]' | less

Isso nos leva uma lista de todos os AptPkg::Class::PkgFile pacotes. Você provavelmente poderia gerar o apt-add-repository comandos com isso.


2
2017-11-14 19:48





https://repogen.simplylinux.ch/ lhe dará uma lista de todos os PPAs para sua versão do Ubuntu. Aqui está uma lista gerada sem arquivos de origem e não há impressora ppa samsung:

#------------------------------------------------------------------------------#
#                            OFFICIAL UBUNTU REPOS                             #
#------------------------------------------------------------------------------#


###### Ubuntu Main Repos
deb http://us.archive.ubuntu.com/ubuntu/ yakkety main restricted universe multiverse 

###### Ubuntu Update Repos
deb http://us.archive.ubuntu.com/ubuntu/ yakkety-security main restricted universe multiverse 
deb http://us.archive.ubuntu.com/ubuntu/ yakkety-updates main restricted universe multiverse 
deb http://us.archive.ubuntu.com/ubuntu/ yakkety-proposed main restricted universe multiverse 
deb http://us.archive.ubuntu.com/ubuntu/ yakkety-backports main restricted universe multiverse 

###### Ubuntu Partner Repo
deb http://archive.canonical.com/ubuntu yakkety partner

#------------------------------------------------------------------------------#
#                           UNOFFICIAL UBUNTU REPOS                            #
#------------------------------------------------------------------------------#


###### 3rd Party Binary Repos

#### Flacon PPA - http://kde-apps.org/content/show.php?content=113388
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F2A61FE5
deb http://ppa.launchpad.net/flacon/ppa/ubuntu yakkety main

#### Gimp PPA - https://launchpad.net/~otto-kesselgulasch/+archive/gimp
## Run this command: sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 614C4B38
deb http://ppa.launchpad.net/otto-kesselgulasch/gimp/ubuntu yakkety main

#### Google Chrome Browser - http://www.google.com/linuxrepositories/
## Run this command: wget -q https://dl.google.com/linux/linux_signing_key.pub -O- | sudo apt-key add -
deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main

#### Google Earth - http://www.google.com/linuxrepositories/
## Run this command: wget -q https://dl.google.com/linux/linux_signing_key.pub -O- | sudo apt-key add -
deb [arch=amd64] http://dl.google.com/linux/earth/deb/ stable main

#### Highly Explosive PPA - https://launchpad.net/~dhor/+archive/myway
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93330B78
deb http://ppa.launchpad.net/dhor/myway/ubuntu yakkety main

#### JDownloader PPA - https://launchpad.net/~jd-team
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6A68F637
deb http://ppa.launchpad.net/jd-team/jdownloader/ubuntu yakkety main

#### Lazarus - http://www.lazarus.freepascal.org/
## Run this command:  gpg --keyserver hkp://pgp.mit.edu:11371 --recv-keys 6A11800F  && gpg --export --armor 0F7992B0  | sudo apt-key add -
deb http://www.hu.freepascal.org/lazarus/ lazarus-stable universe

#### LibreOffice PPA - http://www.documentfoundation.org/download/
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1378B444
deb http://ppa.launchpad.net/libreoffice/ppa/ubuntu yakkety main

#### MEGA Sync Client - https://mega.co.nz/
deb http://mega.nz/linux/MEGAsync/xUbuntu_16.10/ ./

#### MKVToolnix - http://www.bunkus.org/videotools/mkvtoolnix/
## Run this command: wget -q http://www.bunkus.org/gpg-pub-moritzbunkus.txt -O- | sudo apt-key add -
deb http://www.bunkus.org/ubuntu/yakkety/ ./

#### Mozilla Daily Build Team PPA - http://edge.launchpad.net/~ubuntu-mozilla-daily/+archive/ppa
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys  247510BE
deb http://ppa.launchpad.net/ubuntu-mozilla-daily/ppa/ubuntu yakkety main

#### muCommander - http://www.mucommander.com/
## Run this command: sudo wget -O - http://apt.mucommander.com/apt.key | sudo apt-key add - 
deb http://apt.mucommander.com stable main non-free contrib  

#### Opera - http://www.opera.com/
## Run this command: sudo wget -O - http://deb.opera.com/archive.key | sudo apt-key add -
deb http://deb.opera.com/opera/ stable non-free

#### Oracle Java (JDK) Installer PPA - http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
deb http://ppa.launchpad.net/webupd8team/java/ubuntu yakkety main

#### PlayDeb - http://www.playdeb.net/
## Run this command: wget -O- http://archive.getdeb.net/getdeb-archive.key | sudo apt-key add -
deb http://archive.getdeb.net/ubuntu yakkety-getdeb games

#### SABnzbd PPA - http://sabnzbd.org/
## Run this command:  sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4BB9F05F
deb http://ppa.launchpad.net/jcfp/ppa/ubuntu yakkety main

#### SimpleScreenRecorder PPA - http://www.maartenbaert.be/simplescreenrecorder/
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 283EC8CD
deb http://ppa.launchpad.net/maarten-baert/simplescreenrecorder/ubuntu yakkety main

#### Steam for Linux - http://store.steampowered.com/about/
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F24AEA9FB05498B7
deb [arch=i386] http://repo.steampowered.com/steam/ precise steam

#### Syncthing - https://syncthing.net/
## Run this command: curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
deb http://apt.syncthing.net/ syncthing release

#### Tor: anonymity online - https://www.torproject.org
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 886DDD89
deb http://deb.torproject.org/torproject.org yakkety main

#### Unsettings PPA - http://www.florian-diesch.de/software/unsettings/
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0FEB6DD9
deb http://ppa.launchpad.net/diesch/testing/ubuntu yakkety main

#### VirtualBox - http://www.virtualbox.org
## Run this command: wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox_2016.asc -O- | sudo apt-key add -
deb http://download.virtualbox.org/virtualbox/debian yakkety contrib

#### Webmin - http://www.webmin.com
## Run this command: wget http://www.webmin.com/jcameron-key.asc -O- | sudo apt-key add -
deb http://download.webmin.com/download/repository sarge contrib

#### WebUpd8 PPA - http://www.webupd8.org/
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4C9D234C
deb http://ppa.launchpad.net/nilarimogard/webupd8/ubuntu yakkety main

#### Xorg Edgers PPA - https://launchpad.net/~xorg-edgers
## Run this command: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8844C542  
deb http://ppa.launchpad.net/xorg-edgers/ppa/ubuntu yakkety main
here is a generated list without source files and no samsung printer ppa
#### Yuuguu - http://yuuguu.com
deb http://update.yuuguu.com/repositories/apt hardy multiverse

2
2017-11-16 06:28





Aqui está o meu roteiro "list-apt-repositories", que lista todos os repositórios em"/etc/sources.list" e "/etc/sources.list.d/*.list". Você pode adicionar --ppa-only para mostrar apenas os PPAs. Os PPAs são automaticamente transformados ppa:USER/REPO formato.

As partes relevantes são as 5 linhas em list_sources e list_ppa funções, o resto é apenas clichê para envolvê-lo em um script de shell acessível.

list-apt-repositories:

#!/bin/sh

usage () {
  cat >&2 <<USAGE
$0 [--ppa-only]

Options:
  --ppa-only            only list PPAs
USAGE
  exit $1
}

list_sources () {
  grep -E '^deb\s' /etc/apt/sources.list /etc/apt/sources.list.d/*.list |\
    cut -f2- -d: |\
    cut -f2 -d' ' |\
    sed -re 's#http://ppa\.launchpad\.net/([^/]+)/([^/]+)(.*?)$#ppa:\1/\2#g'
}

list_ppa () {
  list_sources | grep '^ppa:'
}

generate=list_sources

while test -n "$1"
do
  case "$1" in
    -h|--help) usage 1;;
    --ppa-only) generate=list_ppa;;
    *)
      printf -- "Unknown argument '$1'\n" >&2
      usage 2
    ;;
  esac
  shift
done

$generate

E para fazer um script de instalação, canalize para outro script "make-apt-repository-install-script". O script gerado suporta o -y/--yes argumento para uso não interativo add-apt-repository(1)).

make-apt-repository-install-script:

#!/bin/sh

if test -n "$1"
then
  cat >&2 <<USAGE
Usage: $0 < PATH_TO_LIST_OF_REPOS
       list-apt-repositories [--ppa-only] | $0

No options recognized.

Reads list of repositories from stdin and generates a script to install them
using \`add-apt-repository(1)\`. The script is printed to stdout.

The generated script supports an optional
\`-y\` or \`--yes\` argument which causes the \`add-apt-repository\` commands
to be run with the \`--yes\` flag.
USAGE
  exit 1
fi

cat <<INSTALL_SCRIPT
#!/bin/sh
y=
case "\$1" in
  -y|--yes) y=\$1;;
  '') y=;;
  *)
    printf '%s\n' "Unknown option '\$1'" "Usage: \$0 [{-y|--yes}]" >&2
    exit 1
  ;;
esac
INSTALL_SCRIPT

xargs -d'\n' printf "add-apt-repository \$y '%s'\n"

Mais uma vez, a parte importante é a xargs comando na última linha, o resto é boilerplate.


2
2017-12-04 07:40





Para que ele adicione linhas ppa.launchpad.net como ppa: $ USER / $ PPA. Adicione outros repositórios com sua linha completa a partir dos arquivos * .list. Não há linhas de dupe.

#! / bin / bash
# Meu ~ / bin / mk_repositories_restore_script
mkdir -p ~ / bin
x = ~ / bin / restore_repositories
echo \ # \! / bin / bash> $ x
chmod u + x $ x
(
 para APT em $ (find / etc / apt / -name \ *. list)
    do sed -n -e '/ ^ deb / {
     /ppa\.launchpad/s/\(.*\/\/[^\/]*.\)\([^ \ t] * \) \ (. * $ \) / sudo apt-add-repository ppa : \ 2 / p;
     /ppa\.launchpad/!s / \ (deb [\ t] * \) \ (. * $ \) / sudo apt-add-repositório \ 2 / p;
    } '$ APT
 feito
) | classificar | uniq | tee -a ~ / bin / restore_repositories

1
2018-04-11 22:51





Obrigado BobDodds!
Se alguém estiver interessado, atualizei seu código um pouco (espero que você não se importe) ..
Este script irá digitar apenas os PPAs adicionados pelo usuário (/etc/apt/sources.list.d).

    #!/bin/bash
    # My ~/bin/mk_repositories_restore_script
    mkdir -p ~/bin
    x=~/bin/restore_repositories
    echo \#\!/bin/bash > $x
    chmod u+x $x
    (
    for APT in $( find /etc/apt/ -name \*.list )
    do sed -n -e '/^deb /{
          /ppa\.launchpad/s/\(.*\/\/[^\/]*.\)\([^ \t]*\)\(.*\/ubuntu.*$\)/ppa:\2/p;                                                                                                                                                                                       
        }' $APT
    done
    ) | sort | uniq | tee -a ~/bin/restore_repositories

0
2017-11-15 00:16