获取随apt安装的原始文件和当前文件之间的差异更改


19

我安装了php5-fpm软件包apt;然后我对PHP配置文件进行了一些更改。

现在,我将获得原始文件版本(已安装的软件包的版本)和当前版本(由我修改)之间的差异。怎么做?


很难理解您到底想知道什么。甚至不清楚您的情况。
Hauke Laging

我不知道是否恰当可以告诉你,不过现在我不建议是把/etc版本控制(我用水银为)下add,并commit定期。这样,您可以回滚到原始文件或中间更改状态,并hg diff可以看到更改。如果您找不到解决方法,请apt备份已更改的文件,重新安装packag,将配置文件置于版本控制下,然后复制您的更改。之后,您可以进行比较。
Anthon

@HaukeLaging我英语不好,对不起
mdesantis 2013年


1
@reinierpost不,不是。我想要差异。
mdesantis 2015年

Answers:


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 2013年

我很高兴我的解决方案为您服务。我已将您的更改和修复包含在我的代码中。

2
tar xzf data.tar.gz应该是tar xf data.tar.xz最近的Ubuntu
Znarkus

3
您可以使用dpkg-deb -x ${package}_*.deb .而不是artar。此外,还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目录的更改,您可以按照@Anthon的建议进行操作,并使用git,subversion,mercurial等对目录进行版本控制。您也可以使用etckeeper之类的工具。这里这里都有一个教程。

etckeeper是一组工具,可以将/ etc存储在git,mercurial,bazaar或darcs存储库中。它倾向于在软件包升级期间自动提交对/ 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:谢谢,为此包添加了一个检查,尽管从Debian jessie开始,看来coreutils提供了一个“ realpath”命令。
2014年

它在Ubuntu上不见了。
Mxx

是我的。
reinierpost 2015年

1
不幸的是,这仅适用于来自带有Contents文件的存储库的软件包。否则,优秀的脚本!
Martijn Pieters'4

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*>.;.*|;.*\|.;'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.