326 votes

Comment puis-je obtenir une liste de tous les dépôts et PPA à partir de la ligne de commande dans un script d'installation?

Je sais comment listez tous les packages installés sur mon système.

Mais comment pourrais-je obtenir une liste de tous les dépôts et PPA dans un script que je pourrais exécuter sur une nouvelle machine pour reproduire la configuration du dépôt, y compris les clés?

Je sais que je peux regarder dans /etc/apt/sources.list et /etc/apt/sources.list.d, mais je cherche un moyen de générer un script qui exécute toutes les commandes apt-add-repository sur un nouveau système (qui trie l'obtention de toutes les clés).

Des idées?

211voto

Mats Fredriksson Points 7136

Vous pouvez tout afficher avec :

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

119voto

David Osborn Points 1232

Merci pour les conseils. Avec un peu de nettoyage, j'ai obtenu un script qui répertorie les PPAs, mais pas tout autre dépôt :

#! /bin/sh 
# listppa Script pour obtenir tous les PPA installés sur un système prêts à être partagés pour la réinstallation
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

Lorsque vous l'appelez avec listppa > installppa.sh, vous obtenez un script que vous pouvez copier sur une nouvelle machine pour réinstaller tous les PPA.

Prochaine étape : faire de même pour les autres dépôts :

#! /bin/sh
# Script pour obtenir tous les PPA installés sur un système
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

Cela devrait faire l'affaire. J'ai eu besoin d'une question sur superuser pour trouver le bon regex.

40voto

Byte Commander Points 99026

Je suis surpris que la manière la plus simple mais la plus efficace d'obtenir toutes les sources de logiciels binaires activées avec le fichier dans lequel elles sont spécifiées n'ait pas encore été publiée :

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

De tous les fichiers traités, cela affichera chaque ligne commençant par deb. Cela exclut les lignes commentées ainsi que les lignes deb-src pour activer les dépôts de code source.

Cela ne recherche vraiment que tous les fichiers *.list qui seront analysés par apt, mais pas par exemple les fichiers *.list.save utilisés pour la sauvegarde ou d'autres fichiers avec des noms illégaux.


Si vous voulez un résultat plus court mais peut-être seulement dans 99,9% des cas correct qui peut rechercher trop de fichiers (inclut tous les fichiers et répertoires /etc/apt/sources.list*, pas seulement /etc/apt/sources.list et `/etc/apt/sources.list.d/*), vous pourriez également utiliser ceci:

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

À moins qu'il n'y ait des fichiers qui ne devraient pas être là, la sortie sera la même.


Un exemple de sortie sur ma machine serait le suivant :

/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://ftp-stud.hs-esslingen.de/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

Si vous voulez une sortie plus jolie, passons-la par 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/'

Et nous verrons ceci :

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

25voto

KeyC0de Points 631

Exécutez la commande suivante :

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

Source

8voto

ejm Points 193

Voici mon script, "list-apt-repositories", qui répertorie tous les dépôts dans "/etc/sources.list" et "/etc/sources.list.d/*.list". Vous pouvez ajouter --ppa-only pour afficher uniquement les PPAs. Les PPAs sont automatiquement transformés au format ppa:UTILISATEUR/DEPOT.

Les parties pertinentes sont les 5 lignes dans les fonctions list_sources et list_ppa, le reste n'est que du texte standard pour l'envelopper dans un script shell pratique.

list-apt-repositories:

#!/bin/sh

usage () {
  cat >&2 <&2
      usage 2
    ;;
  esac
  shift
done

$generate

Et pour créer un script d'installation, redirigez la sortie vers un autre script "make-apt-repository-install-script". Le script généré prend en charge l'argument -y/--yes pour une utilisation non interactive (voir add-apt-repository(1)).

make-apt-repository-install-script:

#!/bin/sh

if test -n "$1"
then
  cat >&2 <&2
    exit 1
  ;;
esac
INSTALL_SCRIPT

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

Encore une fois, la partie importante est la commande xargs à la dernière ligne, le reste est standard.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X