รับการเปลี่ยนแปลงต่าง ๆ ระหว่างไฟล์ต้นฉบับที่ติดตั้งด้วย apt และไฟล์ปัจจุบัน


19

ผมติดตั้งphp5-fpmแพคเกจการใช้apt; ฉันทำการเปลี่ยนแปลงบางอย่างกับไฟล์การกำหนดค่า PHP

ตอนนี้ฉันจะได้รับความแตกต่างระหว่างเวอร์ชันดั้งเดิมของไฟล์ (ที่ติดตั้งอยู่ในแพ็คเกจ) และเวอร์ชันปัจจุบัน (แก้ไขโดยฉัน) ทำอย่างไร?


เป็นการยากที่จะเข้าใจในสิ่งที่คุณต้องการรู้ ยังไม่ชัดเจนว่าสถานการณ์ของคุณคืออะไร
Hauke ​​Laging

ผมไม่ทราบว่ามีแนวโน้มที่จะบอกคุณว่า แต่สิ่งที่ฉันจะแนะนำคือการวาง/etcภายใต้การควบคุมการแก้ไข (ผมใช้ปรอทสำหรับที่) และaddและcommitเป็นประจำ ด้วยวิธีนี้คุณสามารถย้อนกลับไปที่ไฟล์ต้นฉบับหรือเปลี่ยนสถานะไปเป็นสื่อกลางและhg diffคุณสามารถเห็นการเปลี่ยนแปลงได้ หากคุณไม่สามารถหาวิธีดำเนินการดังaptกล่าวได้ให้สำรองไฟล์ที่ถูกเปลี่ยนแปลงติดตั้งแพ็กเกจติดตั้งใหม่นำไฟล์ config ไปไว้ใต้การควบคุมการแก้ไขและคัดลอกการเปลี่ยนแปลงของคุณ หลังจากนั้นคุณสามารถทำสิ่งที่แตกต่าง
Anthon

@HaukeLaging ฉันไม่เก่งภาษาอังกฤษฉันขอโทษ
mdesantis


1
@reierierpost ไม่ ฉันต้องการความแตกต่าง
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.xzUbuntu ล่าสุด
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ไดเรกทอรีของคุณคุณสามารถทำได้ตามที่ @Anon ได้แนะนำและใช้ git, subversion, mercurial และอื่น ๆ เพื่อควบคุมเวอร์ชันของไดเรกทอรีนั้น นอกจากนี้คุณยังสามารถใช้เครื่องมือเช่นetckeeper มีการกวดวิชาที่เป็นที่นี่เช่นเดียวกับที่นี่

etckeeper คือชุดเครื่องมือที่ให้ / etc เก็บไว้ในที่เก็บคอมไพล์, Mercurial, bazaar หรือ darcs มันเชื่อมต่อกับ apt เพื่อยอมรับการเปลี่ยนแปลงที่ทำกับ / etc โดยอัตโนมัติในระหว่างการอัพเกรดแพ็คเกจ จะติดตามข้อมูลเมตาของแฟ้มที่คอมไพล์ไม่ปกติสนับสนุน แต่นั่นเป็นสิ่งสำคัญสำหรับ / etc /etc/shadowเช่นสิทธิ์ของ มันค่อนข้างจำเพาะและสามารถกำหนดค่าได้ในขณะที่ยังใช้งานง่ายถ้าคุณเข้าใจพื้นฐานของการทำงานกับการควบคุมเวอร์ชัน

ไฟล์แพ็คเกจ

ความรู้ของฉันไม่ได้มีวิธีการตรวจสอบไฟล์บนดิสก์เทียบกับไฟล์ที่อยู่ในที่เกิดขึ้นจริงapt .debไม่dpkgเช่นนั้นเครื่องมือที่aptใช้จริงในการจัดการไฟล์

อย่างไรก็ตามคุณสามารถใช้เครื่องมือเช่นdebsumsเพื่อเปรียบเทียบไฟล์บางไฟล์ที่คุณติดตั้งมันจะดูที่ checksums (md5sum) ของสิ่งที่อยู่ใน.debไฟล์เทียบกับสิ่งที่อยู่ในดิสก์ระบบของคุณ

ดูคำถามผิดพลาดของเซิร์ฟเวอร์นี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับdebsumและการdpkgตรวจสอบรวมถึงคำถาม 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

ฉันเขียนสคริปต์ง่าย ๆ ต่อไปนี้เพื่อดึงไฟล์ต้นฉบับจากแพ็คเกจ Debian ที่ถูกต้องโดยอัตโนมัติและ diff ไฟล์ปัจจุบันตรงกับมัน: 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: ขอบคุณเพิ่มการตรวจสอบสำหรับแพคเกจนี้ถึงแม้ว่าเริ่มต้นด้วย Debian jessie ดูเหมือนว่า coreutils ให้คำสั่ง `realpath '
a3nm

มันหายไปจาก Ubuntu
Mxx

นี่คือของฉัน
reinierpost

1
น่าเสียดายที่นี่ใช้งานได้กับแพ็คเกจที่มาจากที่เก็บที่มีไฟล์เนื้อหาเท่านั้น มิฉะนั้นสคริปต์ที่ยอดเยี่ยม!
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.