Uzyskaj zmiany różnic między oryginalnymi plikami zainstalowanymi z plikami apt i plikami bieżącymi

19

Zainstalowałem php5-fpmpakiet za pomocą apt; potem dokonałem pewnych zmian w plikach konfiguracyjnych PHP.

Teraz dostałbym różnice między oryginalnymi wersjami plików (tymi z zainstalowanego pakietu) a aktualnymi wersjami (zmodyfikowanymi przeze mnie). Jak to zrobić?

mdesantis
źródło
Trudno zrozumieć, co dokładnie chcesz wiedzieć. Nie jest nawet jasne, jaka jest twoja sytuacja.
Hauke ​​Laging
Nie wiem, czy apt mogę powiedzieć, ale to, co jest zalecane jest umieszczenie /etcpod kontrolą wersji (ja używam Mercurial do tego) i addi commitna bieżąco. W ten sposób możesz przywrócić do oryginalnych plików lub do pośrednich zmienionych stanów i dzięki temu hg diffmożesz zobaczyć zmiany. Jeśli nie możesz znaleźć sposobu, aby to zrobić, wykonaj aptkopię zapasową zmienionych plików, zainstaluj ponownie pakiety (paczki), poddaj pliki konfiguracyjne kontroli wersji i skopiuj zmiany. Następnie możesz zrobić różnicę.
Anthon
@HaukeLaging Nie jestem dobry w języku angielskim, przepraszam
mdesantis
Duplikat superuser.com/questions/10997/…
reinierpost
1
@reinierpost nie to nie jest. Chcę różnice.
mdesantis

Odpowiedzi:

12

Wypróbuj coś takiego:

# 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

Jak sugerują inni, zdecydowanie poddaj pliki konfiguracyjne kontroli wersji. W ten sposób możesz dokładnie zobaczyć, co zmieniłeś i kiedy to zmieniłeś.

rubo77
źródło
Dziękuję Ci! Musiałem nieco zmodyfikować kod: gist.github.com/ProGNOMmers/5404609, jeśli zaktualizujesz swoje pytanie działającym kodem, chętnie je zaakceptuję
mdesantis
Cieszę się, że moje rozwiązanie zadziałało dla Ciebie. Zawarłem twoje zmiany i poprawki w moim kodzie.
2
tar xzf data.tar.gzpowinno być tar xf data.tar.xzdla ostatniego Ubuntu
Znarkus
3
Możesz użyć dpkg-deb -x ${package}_*.deb .zamiast ari tar. apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)Upewnij się także , że pobierasz obecnie zainstalowaną wersję, a nie najnowszą, na przykład jeśli robisz to tuż przed aktualizacją.
pix
Naprawiłem błąd, w którym nie ma danych.tar.gz, ale data.tar.xz github.com/rubo77/apt-etc-diff - również trochę poprawiłem skrypt
rubo77
8

katalog itp

Aby śledzić zmiany w /etckatalogu, możesz zrobić tak, jak sugerował @Anthon i użyć git, subversion, mercurial itp. Do kontroli wersji tego katalogu. Możesz także użyć narzędzia takiego jak etckeeper . Jest tutorial tutaj , a także tutaj .

etckeeper to zbiór narzędzi do przechowywania / etc w repozytorium git, mercurial, bazar lub darcs. Łączy się z apt, aby automatycznie zatwierdzać zmiany dokonane w / etc podczas aktualizacji pakietów. Śledzi metadane plików, których git normalnie nie obsługuje, ale jest to ważne dla / etc, takich jak uprawnienia /etc/shadow. Jest dość modułowy i konfigurowalny, a jednocześnie łatwy w użyciu, jeśli rozumiesz podstawy pracy z kontrolą wersji.

pliki pakietów

Według mojej wiedzy aptnie ma sposobu, aby sprawdzić pliki na dysku w porównaniu z plikami, które są w rzeczywistości .deb. Nie robi dpkgto również narzędzie służące aptdo zarządzania plikami.

Jednak można użyć narzędzia, takiego jak debsumsporównanie niektórych zainstalowanych plików, sprawdza tylko sumy kontrolne (md5sum) zawartości .debpliku w porównaniu do zawartości dysku systemowego.

Zobacz to pytanie o awarię serwera, aby uzyskać więcej informacji na temat debsumi dpkgsprawdzanie sumowania , a także to pytanie askubuntu .

debsum przykład

% 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
źródło
Dziękuję bardzo! Nie wiedziałem o praktyce kontrolowania /etczmian i etckeeperwydaje mi się, że to właściwe rozwiązanie, aby sobie z tym poradzić;
Przyjmę
2
Pamiętaj, że OP będzie musiał zostać uruchomiony debsums -a, w przeciwnym razie pliki konfiguracyjne zostaną wykluczone z kontroli.
Dmitrij Grigoryev
1
@DmitryGrigoryev debums -cejest idealny do znalezienia plików (konfiguracyjnych) do obejrzenia.
0xC0000022L,
6

Napisałem następujący prosty skrypt do automatycznego pobrania oryginalnego pliku z właściwego pakietu Debiana i porównania z nim bieżącego pliku: https://a3nm.net/git/mybin/tree/debdiffconf

Użyj go w następujący sposób: 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
źródło
Twój skrypt wymaga również realpathzainstalowanego pakietu.
Mxx
@Mxx: dzięki, dodanie sprawdzianu dla tego pakietu, chociaż od Debiana jessie wydaje się, że coreutils dostarcza polecenie `realpath '.
a3nm
Brakowało go na Ubuntu.
Mxx
Oto moje.
reinierpost
1
Niestety działa to tylko w przypadku pakietów pochodzących z repozytoriów z plikiem Contents. W przeciwnym razie doskonały skrypt!
Martijn Pieters
0

Jeśli chcesz zobaczyć różnice między oryginalnym a zainstalowanym php.iniplikiem, użyj

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

jeśli nie przejmujesz się liniami komentarza, włóż go do

| egrep -v '^;.*<$|\s*>.;.*|;.*\|.;'
rubo77
źródło