Dapatkan perubahan berbeda antara file asli yang diinstal dengan file apt dan saat ini


19

Saya menginstal php5-fpmpaket menggunakan apt; kemudian saya membuat beberapa perubahan pada file konfigurasi PHP.

Sekarang saya akan mendapatkan perbedaan antara versi file asli (yang dari paket yang diinstal) dan versi saat ini (dimodifikasi oleh saya). Bagaimana cara melakukannya?


Sulit untuk memahami apa yang sebenarnya ingin Anda ketahui. Bahkan tidak jelas apa situasimu.
Hauke ​​Laging

Saya tidak tahu apakah apt dapat memberi tahu Anda hal itu, tetapi apa yang saya rekomendasikan adalah untuk menempatkan di /etcbawah kontrol revisi (saya menggunakan lincah untuk itu) dan adddan commitsecara teratur. Dengan begitu Anda dapat memutar kembali ke file asli, atau menengah ke kondisi yang diubah dan dengan hg diffAnda dapat melihat perubahan. Jika Anda tidak dapat menemukan cara untuk melakukan ini apt, buat cadangan file yang diubah, instal ulang paket, bawa file konfigurasi di bawah kendali revisi dan salin kembali perubahan Anda. Setelah itu Anda bisa melakukan diff.
Anthon

@ HaukeLaging Saya tidak pandai bahasa Inggris, saya minta maaf
mdesantis


1
@reinierpost tidak bukan. Saya ingin diffs.
mdesantis

Jawaban:


12

Coba sesuatu seperti ini:

# 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

Seperti yang disarankan oleh orang lain, pasti menempatkan file konfigurasi Anda di bawah kendali revisi. Dengan begitu, Anda bisa melihat dengan tepat apa yang Anda ubah dan kapan Anda mengubahnya.


Terima kasih! Saya harus memodifikasi sedikit kode: gist.github.com/ProGNOMmers/5404609 jika Anda memperbarui pertanyaan Anda dengan kode yang berfungsi, saya akan dengan senang hati menerimanya
mdesantis

Saya senang solusi saya berhasil untuk Anda. Saya telah memasukkan perubahan dan perbaikan Anda dalam kode saya.

2
tar xzf data.tar.gzseharusnya tar xf data.tar.xzuntuk Ubuntu terbaru
Znarkus

3
Anda bisa menggunakan dpkg-deb -x ${package}_*.deb .daripada menggunakan ardan tar. Juga apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)akan memastikan Anda mengambil versi yang saat ini diinstal daripada yang terbaru, misalnya jika Anda melakukan ini sebelum melakukan peningkatan.
pix

Saya memperbaiki kesalahan di mana tidak ada data.tar.gz tetapi data.tar.xz github.com/rubo77/apt-etc-diff - juga sedikit meningkatkan skrip
rubo77

8

direktori dll

Untuk melacak perubahan pada /etcdirektori Anda, Anda dapat melakukan seperti yang disarankan @Anthon dan menggunakan git, subversi, mercurial, dll. Untuk mengontrol versi direktori itu. Anda juga dapat menggunakan alat seperti dllkeeper . Ada tutorial di sini dan juga di sini .

etckeeper adalah kumpulan alat untuk membiarkan / etc disimpan dalam repositori git, mercurial, bazaar atau darcs. Itu terhubung ke apt untuk secara otomatis melakukan perubahan yang dibuat ke / etc selama peningkatan paket. Ini melacak metadata file yang biasanya tidak didukung git, tetapi itu penting untuk / etc, seperti izin dari /etc/shadow. Ini cukup modular dan dapat dikonfigurasi, sementara juga mudah digunakan jika Anda memahami dasar-dasar bekerja dengan kontrol versi.

file paket

Setahu saya apttidak memiliki cara untuk memeriksa file pada disk vs file yang ada di sebenarnya .deb. Tidak juga dpkg, alat yang aptsebenarnya digunakan untuk melakukan pengelolaan file.

Namun Anda dapat menggunakan alat seperti debsumsuntuk membandingkan beberapa file yang telah Anda instal, itu hanya melihat checksum mereka (md5sum) dari apa yang ada di .debfile vs apa yang ada di disk sistem Anda.

Lihat pertanyaan serverfault ini untuk perincian lebih lanjut debsumdan dpkgchecksumming, serta pertanyaan askubuntu ini .

debsum contoh

% 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

Terima kasih banyak! Saya tidak tahu tentang praktik untuk tetap di /etcbawah kendali revisi, dan etckeepertampaknya solusi yang tepat untuk mengelolanya; Saya akan mengadopsinya
mdesantis

2
Perhatikan bahwa OP perlu dijalankan debsums -a, jika tidak file konfigurasi akan dikecualikan dari cek.
Dmitry Grigoryev

1
@DmitryGrigoryev debums -cesempurna untuk menemukan file (konfigurasi) mana yang harus dilihat.
0xC0000022L

6

Saya menulis skrip sederhana berikut untuk secara otomatis mengambil file asli dari paket Debian yang tepat dan membedakan file saat ini dengan itu: https://a3nm.net/git/mybin/tree/debdiffconf

Gunakan sebagai berikut: 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

Skrip Anda juga membutuhkan realpathpaket yang diinstal.
Mxx

@Mxx: terima kasih, menambahkan cek untuk paket ini, meskipun dimulai dengan Debian jessie sepertinya coreutils menyediakan perintah `realpath '.
a3nm

Itu hilang di Ubuntu.
Mxxl

Ini milik saya.
reinierpost

1
Sayangnya, ini hanya berfungsi untuk paket yang berasal dari repositori dengan file Contents. Kalau tidak, skrip yang bagus!
Martijn Pieters

0

Jika Anda ingin melihat perbedaan antara php.inifile asli dan yang diinstal , gunakan

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

jika Anda tidak peduli dengan baris komentar, masukkan saja

| egrep -v '^;.*<$|\s*>.;.*|;.*\|.;'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.