Obtenez les changements de différence entre les fichiers d'origine installés avec les fichiers apt et les fichiers actuels

19

J'ai installé le php5-fpmpackage en utilisant apt; puis j'ai apporté quelques modifications aux fichiers de configuration PHP.

Maintenant, j'obtiendrais les différences entre les versions des fichiers d'origine (celles du package installé) et les versions actuelles (modifiées par moi). Comment faire?

mdesantis
la source
Il est difficile de comprendre exactement ce que vous voulez savoir. Il n'est même pas clair quelle est votre situation.
Hauke ​​Laging
Je ne sais pas si apt peut vous le dire, mais ce que je recommande, c'est de mettre /etcsous contrôle de révision (j'utilise mercurial pour ça) et addet commitrégulièrement. De cette façon, vous pouvez revenir aux fichiers d'origine ou aux états modifiés intermédiaires et hg diffvous pouvez voir les modifications. Si vous ne trouvez pas de moyen de le faire apt, sauvegardez vos fichiers modifiés, réinstallez le (s) packag (s), mettez les fichiers de configuration sous contrôle de révision et copiez vos modifications. Après cela, vous pouvez faire un diff.
Anthon
@HaukeLaging Je ne suis pas bon en anglais, je suis désolé
mdesantis
Duplicate of superuser.com/questions/10997/…
reinierpost
1
@reinierpost non ça ne l'est pas. Je veux les diffs.
mdesantis

Réponses:

12

Essayez quelque chose comme ceci:

# exit on failure
set -e

package=php5-fpm
mkdir $package
cd $package

# you could also get the file from a package mirror if you have
#  an older version of apt-get that doesn't support 'download' 
#  or if you would like more control over what package version
#  you are downloading.
# (e.g. http://archive.ubuntu.com/ubuntu/pool/main/)
apt-get download $package

# deb package files are ar archives
ar vx ${package}*.deb
# containing some compressed tar archives
tar xzf data.tar.gz
# now you have the files

# you can get diffs for all of the files in etc if you would like
find etc -type f |
while read file ; do
    diff $file /$file
done

Comme suggéré par d'autres, mettez définitivement vos fichiers de configuration sous contrôle de révision. De cette façon, vous pouvez voir exactement ce que vous avez changé et quand vous l'avez changé.

rubo77
la source
Je vous remercie! J'ai dû modifier un peu le code: gist.github.com/ProGNOMmers/5404609 si vous mettez à jour votre question avec du code de travail, je serai heureux de l'accepter
mdesantis
Je suis content que ma solution ait fonctionné pour vous. J'ai inclus vos modifications et correctifs dans mon code.
2
tar xzf data.tar.gzdevrait être tar xf data.tar.xzpour Ubuntu récent
Znarkus
3
Vous pouvez utiliser dpkg-deb -x ${package}_*.deb .au lieu d'utiliser aret tar. apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)Assurez-vous également que vous prenez la version actuellement installée plutôt que la dernière, par exemple si vous le faites juste avant de faire une mise à niveau.
pix
J'ai corrigé une erreur où il n'y avait pas de data.tar.gz mais data.tar.xz github.com/rubo77/apt-etc-diff - également amélioré un peu le script
rubo77
8

répertoire etc

Pour suivre les modifications apportées à votre /etcrépertoire, vous pouvez faire comme @Anthon l'a suggéré et utiliser git, subversion, mercurial, etc. pour contrôler la version de ce répertoire. Vous pouvez également utiliser un outil tel que etckeeper . Il y a un tutoriel ici aussi bien qu'ici .

etckeeper est une collection d'outils pour laisser / etc être stocké dans un dépôt git, mercurial, bazaar ou darcs. Il se connecte à apt pour valider automatiquement les modifications apportées à / etc lors des mises à niveau du package. Il suit les métadonnées des fichiers que git ne prend pas normalement en charge, mais cela est important pour / etc, comme les autorisations de /etc/shadow. Il est assez modulaire et configurable, tout en étant simple à utiliser si vous comprenez les bases du travail avec le contrôle de version.

fichiers de package

À ma connaissance, il aptn'y a pas de moyen de vérifier les fichiers sur le disque par rapport aux fichiers qui sont dans le réel .deb. Pas plus que dpkgl'outil qui aptutilise réellement pour gérer les fichiers.

Cependant, vous pouvez utiliser un outil tel que debsumspour comparer certains des fichiers que vous avez installés, il ne regarde que leurs sommes de contrôle (md5sum) de ce qui est dans le .debfichier par rapport à ce qui est sur le disque de votre système.

Voir cette question de panne de serveur pour plus de détails debsumet la dpkgsomme de contrôle, ainsi que cette question askubuntu .

debsum exemple

% debsums openssh-server
/usr/lib/openssh/sftp-server                                                  OK
/usr/sbin/sshd                                                                OK
/usr/share/lintian/overrides/openssh-server                                   OK
/usr/share/man/man5/sshd_config.5.gz                                          OK
/usr/share/man/man8/sshd.8.gz                                                 OK
/usr/share/man/man8/sftp-server.8.gz                                          OK
slm
la source
Merci beaucoup! Je ne connaissais pas la pratique de garder /etcsous contrôle de révision, et etckeepersemble la bonne solution pour la gérer; Je l'adopterai
mdesantis
2
Notez que l'OP devra s'exécuter debsums -a, sinon les fichiers de configuration seront exclus de la vérification.
Dmitry Grigoryev
1
@DmitryGrigoryev debums -ceest parfait pour trouver les fichiers (de configuration) à consulter.
0xC0000022L
6

J'ai écrit le script simple suivant pour récupérer automatiquement le fichier d'origine du bon paquet Debian et comparer le fichier actuel avec celui-ci: https://a3nm.net/git/mybin/tree/debdiffconf

Utilisez-le comme suit: debdiffconf FILE

#!/bin/bash

# Usage: debdiffconf.sh FILE
# Produce on stdout diff of FILE against the first installed Debian package
# found that provides it.
# Returns the exit code of diff if everything worked, 3 or 4 otherwise.

# /programming//a/4785518
command -v apt >/dev/null 2>&1 || {
  echo "apt not found, this is probably not a Debian system. Aborting." >&2;
  exit 4; }
command -v apt-file >/dev/null 2>&1 || {
  echo "Please install apt-file: sudo apt install apt-file. Aborting." >&2;
  exit 4; }
command -v realpath >/dev/null 2>&1 || {
  echo "Please install realpath: sudo apt install realpath. Aborting." >&2;
  exit 4; }

FILE=$(realpath -m "$1")
while read PACKAGE
do
  # verify from first installed package
  if dpkg-query -W --showformat='${Status}\n' | grep installed > /dev/null
  then
    DIR=$(mktemp -d)
    cd "$DIR"
    echo "Trying $PACKAGE..." >&2
    apt download "$PACKAGE" >&2
    # downloaded archive is the only file present...
    ARCHIVE=$(ls)
    mkdir contents
    # extract entire archive
    dpkg-deb -x "$ARCHIVE" contents/ >&2
    if [ -f "contents$FILE" ]
    then
      # package contained required file
      diff "contents$FILE" "$FILE"
      RET=$?
      # cleanup
      cd
      rm -Rf "$DIR"
      # exit entire script as this is the main shell
      # with the return code from diff
      exit $RET
    else
      # cleanup
      cd
      rm -Rf "$DIR"
    fi
  fi
done < <(apt-file -l search "$FILE")
# if we are here, it means we have found no suitable package
echo "Could not find original package for $FILE" >&2
exit 3
a3nm
la source
Votre script nécessite également que le realpathpackage soit installé.
Mxx
@Mxx: merci, en ajoutant une vérification pour ce paquet, bien qu'en commençant par Debian jessie, il semble que coreutils fournisse une commande `realpath '.
a3nm
Il manquait sur Ubuntu.
Mxx
Voici le mien.
reinierpost
1
Malheureusement, cela ne fonctionne que pour les packages provenant de référentiels avec un fichier Contents. Sinon, excellent script!
Martijn Pieters
0

Si vous souhaitez voir les différences entre l'original et le php.inifichier installé , utilisez

diff -W COLUMNS --suppress-common-lines -y /usr/share/php5/php.ini-development /etc/php5/apache2/php.ini -W $COLUMNS

si vous ne vous souciez pas des lignes de commentaires,

| egrep -v '^;.*<$|\s*>.;.*|;.*\|.;'
rubo77
la source