Holen Sie sich Diff-Änderungen zwischen Originaldateien, die mit Apt installiert wurden, und aktuellen Dateien

19

Ich habe das php5-fpmPaket mit installiert apt. Dann habe ich einige Änderungen an den PHP-Konfigurationsdateien vorgenommen.

Jetzt würde ich die Unterschiede zwischen den ursprünglichen Dateiversionen (die des installierten Pakets) und den aktuellen Versionen (von mir geändert) bekommen. Wie es geht?

mdesantis
quelle
Es ist schwer zu verstehen, was genau Sie wissen wollen. Es ist nicht einmal klar, wie Ihre Situation ist.
Hauke ​​Laging
Ich weiß nicht , ob apt kann man das sagen, aber was ich empfehlen kann, ist setzen /etcunter Revisionskontrolle (ich benutze Mercurial dafür) und addund commitin regelmäßigen Abständen. Auf diese Weise können Sie ein Rollback zu Originaldateien oder zu Zwischenzuständen durchführen und hg diffÄnderungen sehen. Wenn Sie keine Möglichkeit dazu finden apt, sichern Sie Ihre geänderten Dateien, installieren Sie die Pakete neu, bringen Sie die Konfigurationsdateien unter Versionskontrolle und kopieren Sie Ihre Änderungen zurück. Danach können Sie ein Diff machen.
Anthon
@HaukeLaging Ich bin nicht gut in Englisch, tut mir leid
mdesantis
Duplizieren von superuser.com/questions/10997/...
reinierpost
1
@reinierpost nein ist es nicht. Ich will die Unterschiede.
Mdesantis

Antworten:

12

Versuchen Sie so etwas:

# 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

Stellen Sie Ihre Konfigurationsdateien, wie von anderen empfohlen, definitiv unter Versionskontrolle. Auf diese Weise können Sie genau sehen, was Sie geändert haben und wann Sie es geändert haben.

rubo77
quelle
Vielen Dank! Ich musste den Code ein wenig ändern: gist.github.com/ProGNOMmers/5404609 Wenn Sie Ihre Frage mit Arbeitscode aktualisieren, werde ich sie gerne annehmen
mdesantis
Ich bin froh, dass meine Lösung für Sie funktioniert hat. Ich habe Ihre Änderungen und Korrekturen in meinen Code aufgenommen.
2
tar xzf data.tar.gzsollte tar xf data.tar.xzfür die letzten Ubuntu
Znarkus
3
Sie könnten dpkg-deb -x ${package}_*.deb .anstelle von arund verwenden tar. Auch apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)wird sicherstellen , dass Sie die derzeit installierte Version greifen , anstatt die neuesten, zum Beispiel , wenn Sie dies nur tun , bevor ein Upgrade zu tun.
pix
Ich habe einen Fehler behoben, bei dem es keine data.tar.gz gibt, aber data.tar.xz github.com/rubo77/apt-etc-diff - auch das Skript etwas verbessert
rubo77
8

etc Verzeichnis

Zum Nachverfolgen von Änderungen an Ihrem /etcVerzeichnis können Sie wie von @Anthon vorgeschlagen Git, Subversion, Mercurial usw. zur Versionskontrolle dieses Verzeichnisses verwenden. Sie können auch ein Tool wie Etckeeper verwenden . Es gibt hier und hier ein Tutorial .

etckeeper ist eine Sammlung von Werkzeugen, mit denen / etc in einem git-, mercurial-, basar- oder darcs-Repository gespeichert werden kann. Es greift auf apt zu, um Änderungen, die während Paket-Upgrades an / etc vorgenommen wurden, automatisch festzuschreiben. Es verfolgt Dateimetadaten, die git normalerweise nicht unterstützt, die aber für / etc wichtig sind, wie z. B. die Berechtigungen von /etc/shadow. Es ist ziemlich modular und konfigurierbar, aber auch einfach zu bedienen, wenn Sie die Grundlagen der Arbeit mit der Versionskontrolle verstehen.

Paketdateien

Meines Wissens aptgibt es keine Möglichkeit, die Dateien auf der Festplatte im Vergleich zu den Dateien zu überprüfen, die sich in der tatsächlichen befinden .deb. Dies gilt dpkgauch nicht für das Tool, aptdas tatsächlich zur Verwaltung von Dateien verwendet wird.

Sie können jedoch ein Tool verwenden debsums, um einige der von Ihnen installierten Dateien zu vergleichen. Es werden nur die Prüfsummen (md5sum) der Dateien und der Dateien auf Ihrer Systemfestplatte angezeigt .deb.

In dieser Frage zu Serverfehlern finden Sie weitere Informationen debsumund dpkgPrüfsummen sowie diese Askubuntu-Frage .

debsum Beispiel

% 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
quelle
Vielen Dank! Ich wusste nicht, wie man /etcRevisionskontrollen durchführt, und es etckeeperscheint die richtige Lösung zu sein, um damit fertig zu werden. Ich werde es adoptieren
mdesantis
2
Beachten Sie, dass das OP ausgeführt werden muss debsums -a, da sonst Konfigurationsdateien von der Prüfung ausgeschlossen werden.
Dmitry Grigoryev
1
@DmitryGrigoryev debums -ceist perfekt, um zu finden, welche (Konfigurations-) Dateien angezeigt werden sollen .
0xC0000022L
5

Ich habe das folgende einfache Skript geschrieben, um die Originaldatei automatisch aus dem richtigen Debian-Paket abzurufen und die aktuelle Datei dagegen zu vergleichen: https://a3nm.net/git/mybin/tree/debdiffconf

Verwenden Sie es wie folgt: 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
quelle
Für Ihr Skript muss außerdem ein realpathPaket installiert sein.
Mxx
@Mxx: danke, fügte eine Prüfung für dieses Paket hinzu, obwohl es scheint, als ob coreutils ab Debian jessie einen "realpath" -Befehl bereitstellt.
15:00 Uhr,
Es fehlte auf Ubuntu.
Mxx
Hier ist meins.
Reinierpost
1
Leider funktioniert dies nur für Pakete, die aus Repositorys mit einer Inhaltsdatei stammen. Ansonsten ausgezeichnetes Drehbuch!
Martijn Pieters
0

Wenn Sie die Unterschiede zwischen der Originaldatei und der installierten php.iniDatei sehen möchten , verwenden Sie

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

Wenn Sie sich nicht für die Kommentarzeilen interessieren, leiten Sie sie weiter

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