Apt ile yüklenen orijinal dosyalar ve geçerli dosyalar arasında fark değişiklikleri alın


19

php5-fpmPaketi kullanarak kurdum apt; sonra PHP yapılandırma dosyalarında bazı değişiklikler yaptım.

Şimdi orijinal dosya sürümleri (paketin yüklü olanları) ve mevcut sürümler (benim tarafımdan değiştirilmiş) arasındaki farkları alacağım. Nasıl yapılır?


Tam olarak ne bilmek istediğinizi anlamak zordur. Durumunuzun ne olduğu bile belli değil.
Hauke ​​Laging

Ben apt şunu diyebilirim ki, bilmek, ama ne tavsiye edersiniz koymaktır yok /etcrevizyon kontrolü (Bunun için cıva kullanın) ve altında addve commitdüzenli olarak. Bu şekilde orijinal dosyalara ya da değiştirilen durumlara aracılık hg diffedebilir ve değişiklikleri görebilirsiniz. Bunu yapmanın bir yolunu bulamıyorsanız apt, değiştirilen dosyalarınızı yedekleyin, paketleri yeniden yükleyin, yapılandırma dosyalarını revizyon denetimi altına alın ve değişikliklerinizi geri kopyalayın. Bundan sonra fark yaratabilirsiniz.
Anthon

@HaukeLaging Ben ingilizcede iyi değilim, üzgünüm
mdesantis


1
@reinierpost hayır değil. Farkları istiyorum.
mdesantis

Yanıtlar:


12

Bunun gibi bir şey deneyin:

# 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

Başkaları tarafından önerildiği gibi, yapılandırma dosyalarınızı kesinlikle revizyon kontrolü altına alın. Bu şekilde, tam olarak neyi değiştirdiğinizi ve ne zaman değiştirdiğinizi görebilirsiniz.


Teşekkür ederim! Kodu biraz değiştirmek zorunda kaldım: gist.github.com/ProGNOMmers/5404609 Sorunuzu çalışma koduyla güncellerseniz, kabul etmekten memnuniyet duyarız
mdesantis

Çözümümün sizin için çalışmasına sevindim. Kodunuza değişiklikleri ve düzeltmeleri ekledim.

2
tar xzf data.tar.gzolmalıdır tar xf data.tar.xzson Ubuntu için
Znarkus

3
Sen kullanabilirsiniz dpkg-deb -x ${package}_*.deb .kullanmak yerine arve tar. Ayrıca apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package), örneğin bir yükseltme yapmadan hemen önce bunu yapıyorsanız, en son sürümden ziyade yüklü olan sürümü aldığınızdan emin olursunuz.
pix

Hiçbir data.tar.gz olmadığı bir hatayı düzelttim ama data.tar.xz github.com/rubo77/apt-etc-diff - ayrıca betiği biraz geliştirdi
rubo77

8

vs dizini

/etcDizininizdeki değişiklikleri izlemek için @Anthon'un önerdiği gibi yapabilir ve o dizini kontrol etmek için git, subversion, mercurial, vb. Kullanabilirsiniz. Etckeeper gibi bir araç da kullanabilirsiniz . Burada olduğu gibi burada da bir eğitim var .

etckeeper git, mercurial, çarşı veya darcs deposunda saklanmasına izin veren bir araç koleksiyonudur. Paket yükseltmeleri sırasında / etc üzerinde yapılan değişiklikleri otomatik olarak yapmaya adanır. Git'in normalde desteklemediği dosya meta verilerini izler, ancak / etc için önemlidir /etc/shadow. Oldukça modüler ve yapılandırılabilir, aynı zamanda sürüm kontrolü ile çalışmanın temellerini anlarsanız kullanımı basit.

paket dosyaları

Bildiğim aptkadarıyla diskteki dosyaları ve gerçekte olan dosyaları kontrol etmenin bir yolu yok .deb. Ne yapar dpkgaracı, aptaslında dosyaların yönetimini yapmak kullanıyor.

Ancak debsums, yüklediğiniz dosyaların bazılarını karşılaştırmak gibi bir araç kullanabilirsiniz , sadece .debsistem diskinizdekilerle karşılaştırıldığında dosyada bulunanların sağlama toplamlarına (md5sum) bakar .

Bu Bkz ServerFault soru daha hakkında ayrıntılar için debsumve dpkgchecksum'la yanı sıra bu Ask Ubuntu soruyu .

debsum misal

% 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

çok teşekkür ederim! /etcRevizyon kontrolü altında tutmak için uygulamayı bilmiyordum ve etckeeperyönetmek için doğru çözüm gibi görünüyor; Kabul edeceğim
mdesantis

2
OP'nin çalışması gerekeceğini unutmayın debsums -a, aksi takdirde yapılandırma dosyaları denetimin dışında bırakılır.
Dmitry Grigoryev

1
@DmitryGrigoryev debums -cehangi (yapılandırma) dosyalara bakılacağını bulmak için mükemmeldir.
0xC0000022L

6

Orijinal dosyayı doğru Debian paketinden otomatik olarak almak ve geçerli dosyayı buna göre farklılaştırmak için aşağıdaki basit komut dosyasını yazdım: https://a3nm.net/git/mybin/tree/debdiffconf

Aşağıdaki gibi kullanın: 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

Komut dosyanız ayrıca realpathpaketin kurulmasını gerektirir .
Mxx

@Mxx: teşekkürler, bu paket için bir kontrol ekleyerek, Debian jessie ile başlasa da, coreutils'in bir `` realpath '' komutu sağladığı görülüyor.
a3nm

Ubuntu'da eksikti.
Mxx


1
Ne yazık ki, bu yalnızca bir İçerik dosyası içeren depolardan gelen paketler için çalışır. Aksi takdirde, mükemmel komut dosyası!
Martijn Pieters

0

Orijinal ve yüklü php.inidosya arasındaki farkları görmek istiyorsanız şunu kullanın:

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

yorum satırları umurumda değilse içine boru

| egrep -v '^;.*<$|\s*>.;.*|;.*\|.;'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.