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

올바른 데비안 패키지에서 원본 파일을 자동으로 검색하고 현재 파일을 비교하기 위해 다음과 같은 간단한 스크립트를 작성했습니다.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*>.;.*|;.*\|.;'

관련 정보