我安装了php5-fpm
软件包apt
;然后我对PHP配置文件进行了一些更改。
现在,我将获得原始文件版本(已安装的软件包的版本)和当前版本(由我修改)之间的差异。怎么做?
/etc
版本控制(我用水银为)下add
,并commit
定期。这样,您可以回滚到原始文件或中间更改状态,并hg diff
可以看到更改。如果您找不到解决方法,请apt
备份已更改的文件,重新安装packag,将配置文件置于版本控制下,然后复制您的更改。之后,您可以进行比较。
我安装了php5-fpm
软件包apt
;然后我对PHP配置文件进行了一些更改。
现在,我将获得原始文件版本(已安装的软件包的版本)和当前版本(由我修改)之间的差异。怎么做?
/etc
版本控制(我用水银为)下add
,并commit
定期。这样,您可以回滚到原始文件或中间更改状态,并hg diff
可以看到更改。如果您找不到解决方法,请apt
备份已更改的文件,重新安装packag,将配置文件置于版本控制下,然后复制您的更改。之后,您可以进行比较。
Answers:
尝试这样的事情:
# 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
正如其他人所建议的,绝对要对您的配置文件进行修订控制。这样,您可以准确看到更改的内容以及更改的时间。
tar xzf data.tar.gz
应该是tar xf data.tar.xz
最近的Ubuntu
dpkg-deb -x ${package}_*.deb .
而不是ar
和tar
。此外,还apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)
可以确保获取当前安装的版本而不是最新版本,例如,如果您只是在升级之前执行此操作。
为了跟踪对/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问题,以获取有关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
似乎是管理它的正确解决方案。我会采用它
debsums -a
,否则配置文件将从检查中排除。
debums -ce
非常适合查找要查看的(配置)文件。
我编写了以下简单脚本,以自动从正确的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
安装软件包。