Ottieni modifiche diff tra i file originali installati con apt e file correnti


19

Ho installato il php5-fpmpacchetto usando apt; poi ho apportato alcune modifiche ai file di configurazione di PHP.

Ora vorrei ottenere le differenze tra le versioni dei file originali (quelle del pacchetto installato) e le versioni correnti (modificate da me). Come farlo?


È difficile capire cosa esattamente vuoi sapere. Non è nemmeno chiaro quale sia la tua situazione.
Hauke ​​Laging,

Non so se apt possa dirtelo, ma ciò che consiglio è di mettere /etcsotto controllo di revisione (io uso mercurial per questo) adde commitsu base regolare. In questo modo è possibile ripristinare i file originali o gli stati modificati intermedi e con hg diffessi è possibile visualizzare le modifiche. Se non riesci a trovare un modo per farlo apt, esegui il backup dei file modificati, reinstalla i pacchetti, porta i file di configurazione sotto controllo di revisione e copia le modifiche. Dopodiché puoi fare una diff.
Anthon,

@HaukeLaging Non sono bravo in inglese, mi dispiace
mdesantis,


1
@reinierpost no non lo è. Voglio i diff.
mdesantis,

Risposte:


12

Prova qualcosa del genere:

# 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

Come suggerito da altri, metti sicuramente i tuoi file di configurazione sotto controllo di revisione. In questo modo, puoi vedere esattamente cosa hai cambiato e quando lo hai cambiato.


Grazie! Ho dovuto modificare un po 'il codice: gist.github.com/ProGNOMmers/5404609 se aggiorni la tua domanda con un codice funzionante sarò felice di accettarlo
mdesantis

Sono contento che la mia soluzione abbia funzionato per te. Ho incluso le tue modifiche e correzioni nel mio codice.

2
tar xzf data.tar.gzdovrebbe essere tar xf data.tar.xzper Ubuntu recente
Znarkus,

3
È possibile utilizzare dpkg-deb -x ${package}_*.deb .invece di utilizzare are tar. Inoltre, apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)ti assicurerai di afferrare la versione attualmente installata anziché l'ultima, ad esempio se lo stai facendo appena prima di eseguire un aggiornamento.
pix

Ho corretto un errore in cui non c'è data.tar.gz ma data.tar.xz github.com/rubo77/apt-etc-diff - ho anche migliorato un po 'lo script
rubo77

8

directory ecc

Per tenere traccia delle modifiche alla tua /etcdirectory puoi fare come suggerito da @Anthon e usare git, subversion, mercurial, ecc. Per controllare la versione di quella directory. Puoi anche usare uno strumento come etckeeper . C'è un tutorial qui come qui .

etckeeper è una raccolta di strumenti per lasciare / etc in un repository git, mercurial, bazaar o darcs. Si collega a apt per eseguire automaticamente il commit delle modifiche apportate a / etc durante gli aggiornamenti del pacchetto. Tiene traccia dei metadati che git normalmente non supporta, ma che è importante per / etc, come i permessi di /etc/shadow. È abbastanza modulare e configurabile, pur essendo semplice da usare se si comprendono le basi per lavorare con il controllo di versione.

file del pacchetto

Per quanto ne aptso, non esiste un modo per controllare i file sul disco rispetto ai file presenti .deb. Nemmeno dpkglo strumento che aptsta effettivamente usando per fare la gestione dei file.

Tuttavia, puoi utilizzare uno strumento come il debsumsconfronto di alcuni dei file che hai installato, guarda solo i loro checksum (md5sum) di ciò che è nel .debfile rispetto a ciò che è sul tuo disco di sistema.

Vedi questa domanda serverfault per maggiori dettagli debsume dpkgchecksum, così come questa domanda askubuntu .

debsum esempio

% 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

grazie mille! Non sapevo della pratica da tenere /etcsotto controllo di revisione e etckeepersembra la soluzione giusta per gestirla; Lo adotterò
mdesantis il

2
Si noti che l'OP dovrà essere eseguito debsums -a, altrimenti i file di configurazione saranno esclusi dal controllo.
Dmitry Grigoryev il

1
@DmitryGrigoryev debums -ceè perfetto per trovare quali file (di configurazione) guardare.
0xC0000022L

6

Ho scritto il seguente semplice script per recuperare automaticamente il file originale dal pacchetto Debian giusto e diffondere il file corrente su di esso: https://a3nm.net/git/mybin/tree/debdiffconf

Usalo come segue: 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

Lo script richiede anche il realpathpacchetto installato.
Mxx,

@Mxx: grazie, aggiungendo un controllo per questo pacchetto, anche se a partire da Debian jessie sembra che coreutils stia fornendo un comando `realpath '.
a3nm,

Mancava su Ubuntu.
Mxx,


1
Sfortunatamente, questo funziona solo per i pacchetti che provengono da repository con un file Sommario. Altrimenti, sceneggiatura eccellente!
Martijn Pieters,

0

Se vuoi vedere le differenze tra il php.inifile originale e quello installato , usa

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

se non ti interessa le righe dei commenti, inseriscilo

| egrep -v '^;.*<$|\s*>.;.*|;.*\|.;'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.