Получить различия между исходными файлами, установленными с apt и текущими файлами

19

Я установил php5-fpmпакет с помощью apt; Затем я внес некоторые изменения в конфигурационные файлы PHP.

Теперь я хотел бы получить различия между исходными версиями файлов (версиями установленного пакета) и текущими версиями (измененными мной). Как это сделать?

mdesantis
источник
Трудно понять, что именно вы хотите знать. Даже неясно, какова ваша ситуация.
Хауке Лагинг
Я не знаю, может ли apt сказать вам об этом, но я рекомендую поставить /etcконтроль над ревизиями (для этого я использую mercurial) addи commitрегулярно. Таким образом, вы можете вернуться к исходным файлам или к промежуточным измененным состояниям и hg diffувидеть изменения. Если вы не можете найти способ сделать это, сделайте aptрезервную копию ваших измененных файлов, переустановите пакеты, переведите файлы конфигурации под контроль версий и скопируйте ваши изменения. После этого вы можете сделать diff.
Anthon
@HaukeLaging Я не очень хорош в английском, извините
mdesantis
Дубликат superuser.com/questions/10997/…
reinierpost
1
@reinierpost нет, это не так. Я хочу отличия.
Mdesantis

Ответы:

12

Попробуйте что-то вроде этого:

# 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

Как предлагают другие, определенно поставьте ваши файлы конфигурации под контроль версий. Таким образом, вы можете точно увидеть, что вы изменили и когда вы изменили это.

rubo77
источник
Спасибо! Мне пришлось немного изменить код: gist.github.com/ProGNOMmers/5404609, если вы обновите свой вопрос рабочим кодом, я буду рад принять его
mdesantis
Я рад, что мое решение сработало для вас. Я включил ваши изменения и исправления в мой код.
2
tar xzf data.tar.gzдолжно быть tar xf data.tar.xzдля недавнего Ubuntu
Znarkus
3
Вы можете использовать dpkg-deb -x ${package}_*.deb .вместо использования arи tar. Также apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)убедитесь, что вы взяли текущую установленную версию, а не самую последнюю, например, если вы делаете это непосредственно перед обновлением.
пикс
Я исправил ошибку, когда data.tar.gz отсутствует, но data.tar.xz github.com/rubo77/apt-etc-diff - также немного
улучшил
8

и т. д. каталог

Для отслеживания изменений в вашем /etcкаталоге вы можете сделать, как предложил @Anthon, и использовать git, subversion, mercurial и т. Д. Для управления версиями этого каталога. Вы также можете использовать такой инструмент, как etckeeper . Там в учебнике здесь , а также здесь .

etckeeper - это набор инструментов для хранения / etc в репозитории git, mercurial, bazaar или darcs. Он подключается к apt для автоматической фиксации изменений, внесенных в / etc во время обновления пакета. Он отслеживает метаданные файла, которые git обычно не поддерживает, но это важно для / etc, например, права доступа /etc/shadow. Он достаточно модульный и настраиваемый, а также простой в использовании, если вы понимаете основы работы с контролем версий.

файлы пакета

Насколько мне известно apt, нет способа проверить файлы на диске по сравнению с файлами, которые находятся в фактическом .deb. Так же dpkgкак и инструмент, который aptфактически используется для управления файлами.

Однако вы можете использовать такой инструмент, как debsumsсравнение некоторых установленных файлов, он только смотрит на их контрольные суммы (md5sum) того, что находится в .debфайле, и того, что находится на системном диске.

Смотрите этот Serverfault вопрос для получения более подробной информации о debsumи dpkgконтрольных суммах, а также этот askubuntu вопрос .

debsum пример

% 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
источник
большое тебе спасибо! Я не знал о практике держать /etcпод контролем ревизии, и мне etckeeperкажется, что это правильное решение для управления ею; Я приму это
mdesantis
2
Обратите внимание, что OP нужно будет запустить debsums -a, иначе файлы конфигурации будут исключены из проверки.
Дмитрий Григорьев
1
@DmitryGrigoryev debums -ceидеально подходит для поиска файлов конфигурации.
0xC0000022L
6

Я написал следующий простой скрипт для автоматического получения исходного файла из правильного пакета Debian и сравнения текущего файла с ним: https://a3nm.net/git/mybin/tree/debdiffconf

Используйте это следующим образом: 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
источник
Ваш скрипт также требует realpathустановленного пакета.
Mxx
@Mxx: спасибо, добавив проверку для этого пакета, хотя начиная с Debian jessie, кажется, что coreutils предоставляет команду `realpath '.
a3nm
Это отсутствовало в Ubuntu.
Mxx
Вот мой.
reinierpost
1
К сожалению, это работает только для пакетов, которые приходят из репозиториев с файлом содержимого. В остальном отличный сценарий!
Мартин Питерс
0

Если вы хотите увидеть различия между оригинальным и установленным php.iniфайлом, используйте

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

если вас не интересуют строки комментариев, отправьте их в

| egrep -v '^;.*<$|\s*>.;.*|;.*\|.;'
rubo77
источник