aptを使用してインストールされた元のファイルと現在のファイルとの差分変更を取得する

aptを使用してインストールされた元のファイルと現在のファイルとの差分変更を取得する

php5-fpmインストーラを使用した後、aptPHP設定ファイルをいくつか変更しました。

それでは、元のファイルバージョン(インストールされたパッケージバージョン)と現在のバージョン(私が修正したバージョン)の違いを確認します。どうすればいいですか?

答え1

次のようにしてみてください。

# 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

他の人が提案したように、構成ファイルをリビジョン管理下に置きます。これにより、正確に何が変更されたかを確認できます。

答え2

等ディレクトリ

/etcディレクトリの変更を追跡するには、@Anthonが提案したとおりに実行し、git、subversion、mercurialなどを使用してディレクトリのバージョンを指定できます。次のようなものも使用できます。マネージャーをお待ちください。チュートリアルがありますここまたここ

etckeeperは、/ etcをgit、mercurial、bazaar、またはdarcsリポジトリに保存できるツールバーです。パッケージのアップグレード中に/ etcへの変更を自動的にコミットするためにaptに接続します。 gitは通常サポートしていませんが、/ etcに重要なファイルメタデータを追跡します/etc/shadow。たとえば、バージョン管理の基本を知っていると、非常にモジュール化され、設定可能で、使いやすいです。

パッケージファイル

私が知っている限り、aptディスク上のファイルと実際のファイルを確認する方法はありません。実際にファイルを管理するツール.debも同様です。dpkgapt

しかし、あなたは次のようなものを使うことができますdebsumsインストールされている一部のファイルを比較するには、.debファイルの内容とシステムディスクの内容のチェックサム(md5sum)のみを調べます。

これを見てサーバー障害の問題チェックサムのdebsum詳細については、dpkg次を参照してください。アクベントの問題

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

答え3

正しい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.

# https://stackoverflow.com/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

答え4

元のファイルとインストールされているファイルの違いを確認するには、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*>.;.*|;.*\|.;'

関連情報