Nhận thay đổi khác nhau giữa các tệp gốc được cài đặt với các tệp apt và hiện tại


19

Tôi đã cài đặt php5-fpmgói bằng cách sử dụng apt; sau đó tôi đã thực hiện một số thay đổi cho các tệp cấu hình PHP.

Bây giờ tôi sẽ nhận được các khác biệt giữa các phiên bản tệp gốc (các phiên bản của gói được cài đặt) và các phiên bản hiện tại (do tôi sửa đổi). Làm thế nào để làm nó?


Thật khó để hiểu chính xác những gì bạn muốn biết. Nó thậm chí không rõ tình hình của bạn là gì.
Hauke ​​Laging

Tôi không biết nếu apt có thể nói với bạn rằng, nhưng những gì tôi khuyên bạn nên là đặt /etcdưới sự kiểm soát sửa đổi (tôi sử dụng nhanh nhẹn cho rằng) và addcommitmột cách thường xuyên. Bằng cách đó, bạn có thể quay lại các tệp gốc hoặc chuyển sang trạng thái thay đổi trung gian và với hg diffbạn có thể thấy các thay đổi. Nếu bạn không thể tìm ra cách để làm điều này apt, hãy sao lưu các tệp đã thay đổi, cài đặt lại gói (es), mang các tệp cấu hình dưới sự kiểm soát sửa đổi và sao chép lại các thay đổi của bạn. Sau đó, bạn có thể làm một khác.
Anthon

@HaukeLaging Tôi không giỏi tiếng Anh, tôi xin lỗi
mdesantis


1
@reinierpost không, không. Tôi muốn khác biệt.
mdesantis

Câu trả lời:


12

Hãy thử một cái gì đó như thế này:

# 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

Theo đề xuất của người khác, chắc chắn đặt các tệp cấu hình của bạn dưới sự kiểm soát sửa đổi. Bằng cách đó, bạn có thể thấy chính xác những gì bạn đã thay đổi và khi bạn thay đổi nó.


Cảm ơn bạn! Tôi đã phải sửa đổi một chút mã: gist.github.com/ProGNOMmers/5404609 nếu bạn cập nhật câu hỏi của mình bằng mã làm việc, tôi sẽ vui lòng chấp nhận nó
mdesantis

Tôi rất vui vì giải pháp của tôi đã làm việc cho bạn. Tôi đã bao gồm các thay đổi và sửa lỗi của bạn trong mã của tôi.

2
tar xzf data.tar.gznên tar xf data.tar.xzdành cho Ubuntu gần đây
Znarkus

3
Bạn có thể sử dụng dpkg-deb -x ${package}_*.deb .thay vì sử dụng artar. Cũng apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)sẽ đảm bảo bạn lấy phiên bản hiện được cài đặt thay vì mới nhất, ví dụ nếu bạn đang thực hiện việc này ngay trước khi thực hiện nâng cấp.
pix

Tôi đã sửa một lỗi không có data.tar.gz nhưng data.tar.xz github.com/rubo77/apt-etc-diff - cũng đã cải thiện tập lệnh một chút
rubo77

8

thư mục vv

Để theo dõi các thay đổi đối với /etcthư mục của bạn, bạn có thể làm như @Anthon đã đề xuất và sử dụng git, lật đổ, đồng bóng, v.v. để kiểm soát phiên bản thư mục đó. Bạn cũng có thể sử dụng một công cụ như etckeeper . Có một hướng dẫn ở đây cũng như ở đây .

etckeeper là một tập hợp các công cụ để cho phép / etc được lưu trữ trong kho git, mercurial, bazaar hoặc darcs. Nó móc vào apt để tự động cam kết thay đổi được thực hiện cho / etc trong quá trình nâng cấp gói. Nó theo dõi siêu dữ liệu tệp mà git thường không hỗ trợ, nhưng điều đó rất quan trọng đối với / etc, chẳng hạn như các quyền của /etc/shadow. Nó khá mô-đun và cấu hình, trong khi cũng đơn giản để sử dụng nếu bạn hiểu những điều cơ bản khi làm việc với kiểm soát phiên bản.

tập tin gói

Theo hiểu biết của tôi aptkhông có cách nào để kiểm tra các tệp trên đĩa so với các tệp trong thực tế .deb. Không dpkg, công cụ aptthực sự đang sử dụng để quản lý các tập tin.

Tuy nhiên, bạn có thể sử dụng một công cụ như debsumsđể so sánh một số tệp bạn đã cài đặt, nó chỉ xem xét tổng kiểm tra của họ (md5sum) về những gì trong .debtệp so với những gì trên đĩa hệ thống của bạn.

Xem câu hỏi về serverfault này để biết thêm chi tiết về debsumdpkgkiểm tra, cũng như câu hỏi về vấn đề này .

debsum thí dụ

% 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

cảm ơn bạn rất nhiều! Tôi không biết về việc thực hành để /etckiểm soát sửa đổi và etckeeperdường như là giải pháp phù hợp để quản lý nó; Tôi sẽ chấp nhận nó
mdesantis

2
Lưu ý rằng OP sẽ cần phải chạy debsums -a, nếu không các tệp cấu hình sẽ bị loại khỏi kiểm tra.
Dmitry Grigoryev

1
@DmitryGrigoryev debums -celà hoàn hảo để tìm tập tin (cấu hình) nào để xem.
0xC0000022L

5

Tôi đã viết tập lệnh đơn giản sau đây để tự động truy xuất tệp gốc từ gói Debian đúng và khác với tệp hiện tại so với tệp đó: https://a3nm.net/git/mybin/tree/debdiffconf

Sử dụng nó như sau: 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

Kịch bản của bạn cũng yêu cầu realpathgói cài đặt.
Mxx

@Mxx: cảm ơn, thêm một kiểm tra cho gói này, mặc dù bắt đầu với Debian jessie, có vẻ như coreutils đang cung cấp lệnh 'realpath'.
a3nm

Nó đã bị mất trên Ubuntu.
Mxx

Đây là của tôi
Revierpost

1
Thật không may, điều này chỉ hoạt động đối với các gói đến từ kho lưu trữ với tệp Nội dung. Nếu không, kịch bản xuất sắc!
Martijn Pieters

0

Nếu bạn muốn xem sự khác biệt giữa php.initệp gốc và tệp đã cài đặt , hãy sử dụng

diff -W COLUMNS --suppress-common-lines -y /usr/share/php5/php.ini-development /etc/php5/apache2/php.ini -W $COLUMNS

nếu bạn không quan tâm đến những dòng bình luận đưa nó vào

| egrep -v '^;.*<$|\s*>.;.*|;.*\|.;'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.