Отримайте різні зміни між оригінальними файлами, встановленими apt та поточними файлами


19

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

Тепер я отримав різниці між оригінальними версіями файлів (версіями встановленого пакета) та поточними версіями (зміненими мною). Як це зробити?


Важко зрозуміти, що саме ти хочеш знати. Навіть не зрозуміло, яка у вас ситуація.
Hauke ​​Laging

Я не знаю , якщо схильний можу вам сказати , що, але то , що я рекомендую поставити /etcпід контроль версій (я використовую ртутний для цього) і addі commitна регулярній основі. Таким чином ви можете повернутись до оригінальних файлів або до проміжних змінених станів, і hg diffви зможете побачити зміни. Якщо ви не можете знайти спосіб зробити це apt, створіть резервну копію змінених файлів, перевстановіть упаковку, переведіть конфігураційні файли під контроль редагування та скопіюйте свої зміни. Після цього ви можете зробити різницю.
Антон

@HaukeLaging Я не добре в англійській
мові,


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

Як пропонують інші, обов'язково поставте свої конфігураційні файли під контроль редагування. Таким чином, ви можете точно бачити, що ви змінили і коли ви змінили це.


Дякую! Мені довелося трохи змінити код: 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)переконайтеся, що ви захопили встановлену на даний момент версію, а не останню, наприклад, якщо ви робите це безпосередньо перед оновленням.
пікс

Я виправив помилку, коли немає даних.tar.gz, але data.tar.xz github.com/rubo77/apt-etc-diff - також трохи
покращив

8

каталог тощо

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

etckeeper - це набір інструментів, які дозволяють / тощо зберігатись у сховищі git, mercurial, базару чи Darcs. Він підключається до можливості, щоб автоматично здійснювати зміни, внесені до / тощо під час оновлення пакету. Він відслідковує метадані файлів, які 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

дуже дякую! Я не знав про практику тримати /etcпід контролем ревізії, і, etckeeperздається, правильне рішення для управління нею; Я його
прийму

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

Ваш сценарій також вимагає realpathвстановлення пакета.
Mxx

@Mxx: дякую, додаємо чек на цей пакет, хоча, починаючи з Debian jessie, здається, що coreutils надає команду `realpath '.
a3nm

На Ubuntu його не вистачало.
Mxx


1
На жаль, це працює лише для пакетів, що надходять із сховищ із файлом Contents. Інакше відмінний сценарій!
Martijn Pieters

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*>.;.*|;.*\|.;'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.