apt 파일과 현재 파일로 설치된 원본 파일 간의 차이점 변경


19

;를 php5-fpm사용하여 패키지를 설치했습니다 apt. 그런 다음 PHP 구성 파일을 약간 변경했습니다.

이제 원본 파일 버전 (설치된 패키지 버전)과 현재 버전 (나에 의해 수정 됨) 사이에 차이점이 있습니다. 어떻게합니까?


정확히 알고 싶은 것을 이해하기는 어렵습니다. 상황이 무엇인지조차 명확하지 않습니다.
Hauke ​​Laging

나는 경향이 당신에게 그렇게 말할 수 있는지 알고 있지만, 제가 추천하는 일은 넣어하지 않는 /etc버전 관리 (나는 그것에 대해 수은 사용)과에서 add하고 commit정기적으로. 이렇게하면 원본 파일 또는 중간 변경 상태로 롤백 hg diff할 수 있으며 변경 내용을 볼 수 있습니다. 로이 작업을 수행 할 수있는 방법을 찾을 수 없으면 apt변경된 파일을 백업하고 packag를 다시 설치하고 구성 파일을 수정본으로 가져오고 변경 사항을 다시 복사하십시오. 그 후 diff를 할 수 있습니다.
Anthon

@HaukeLaging 나는 영어를 잘 못해요, 미안 해요
mdesantis


1
@reinierpost 아니에요. 나는 diffs를 원한다.
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최근 우분투
Znarkus

3
당신은 사용할 수 dpkg-deb -x ${package}_*.deb .를 사용하는 대신 ar하고 tar. 또한 apt-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 저장소에 저장하도록하는 도구 모음입니다. 패키지 업그레이드 중에 / etc에 대한 변경 사항을 자동으로 커밋하기 위해 apt에 연결합니다. 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. 그렇지 않으면 구성 파일이 검사에서 제외됩니다.
Dmitry Grigoryev

1
@DmitryGrigoryev debums -ce는 어떤 (구성) 파일을 찾을 수 있는지 완벽합니다.
0xC0000022L

6

다음 간단한 스크립트를 작성하여 올바른 데비안 패키지에서 원본 파일을 자동으로 검색하고 현재 파일을 비교합니다 : 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 : 감사합니다. 데비안 jessie로 시작하더라도 coreutils가`realpath '명령을 제공하고있는 것 같습니다.
a3nm

우분투에서 누락되었습니다.
Mxx

여기 내 꺼야
reinierpost

1
불행하게도, 이것은 Contents 파일이있는 리포지토리에서 온 패키지에만 적용됩니다. 그렇지 않으면 훌륭한 스크립트입니다!
Martijn Pieters

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.