aptでイ​​ンストールされた元のファイルと現在のファイルの差分の変更を取得します


19

php5-fpm使用してパッケージをインストールしましたapt。次に、PHP構成ファイルにいくつかの変更を加えました。

これで、元のファイルのバージョン(インストールされているパッケージのバージョン)と現在のバージョン(自分が変更したバージョン)の差分を取得できます。どうやってするの?


あなたが知りたいことを正確に理解するのは難しいです。あなたの状況が何であるかさえ明確ではありません。
ハウケレイジング

私はaptのはあなたにそれを伝えることができれば知っているが、私がお勧めですかことは置いてありません/etcリビジョンコントロールの下で(私はそのために水銀を使用)とaddし、commit定期的に。そうすれば、元のファイル、または中間の変更された状態にロールバックでき、変更hg diffを確認できます。でこれを行う方法が見つからない場合はapt、変更したファイルをバックアップし、packagを再インストールし、構成ファイルをリビジョン管理下に置き、変更をコピーします。その後、diffを実行できます。
アントン

@HaukeLaging私は英語が苦手です、ごめんなさい
-mdesantis


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 .代わりに使用できます。また、たとえば、アップグレードを実行する直前にこれを実行している場合など、最新ではなく現在インストールされているバージョンを確実に取得します。artarapt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)
pix

私はdata.tar.gzが、何もありませんエラー固定data.tar.xz github.com/rubo77/apt-etc-diffを -また、スクリプトビットの強化
rubo77

8

etcディレクトリ

/etcディレクトリへの変更を追跡するには、@ Anthonが示唆しているように、git、subversion、mercurialなどを使用してそのディレクトリをバージョン管理できます。etckeeperなどのツールを使用することもできます。こちらと同様、こちらにもチュートリアルがあります

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

パッケージファイル

私の知るapt限り、ディスク上のファイルと実際のファイルにあるファイルをチェックする方法はありません.deb。どちらも、ファイルの管理に実際に使用してdpkgいるツールでaptはありません。

ただしdebsums、インストールしたファイルの一部を比較するなどのツールを使用して、.debファイルの内容とシステムディスクの内容のチェックサム(md5sum)のみを調べることができます。

この参照serverfaultの質問の詳細についての詳細は、debsumdpkgチェックサムと同様に、この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た。私はそれを採用します
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

また、スクリプトにはrealpathパッケージがインストールされている必要があります。
Mxx

@Mxx:おかげで、このパッケージのチェックを追加しました。Debianjessieから始めているようですが、coreutilsが「realpath」コマンドを提供しているようです。
a3nm 14年

Ubuntuにはありませんでした。
Mxx 14年


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*>.;.*|;.*\|.;'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.