我有一个运行 Ubuntu 14.04.4 LTS 的 VPS;它由 OVH 和 Plesk 一起安装。我刚刚做了一个apt-get upgrade
,在某个时候我收到了一条关于 PAM 的消息。该系统是法语的,但基本上是这样的:
/etc/pam.d/common-{auth,account,password,session} 中至少有一个文件在本地被修改。请指出是否应放弃本地更改并坚持使用标准配置。否则,您将不得不自行配置身份验证系统。
我决定保留本地更改,APT 也报告说:
pam-auth-update: Local modifications to /etc/pam.d/common-*, not updating.
pam-auth-update: Run pam-auth-update --force to override.
我想知道本地更改和更新要设置的文件之间有什么区别。我该怎么做?
答案1
因为我不想改变系统上 PAM 的实时配置,所以我最终使用 jailchroot
来设置默认 PAM 配置,以便我可以查看差异:
# lsb_release --codename
Codename: trusty
# debootstrap trusty /tmp/foo
I: Retrieving Release
I: Retrieving Release.gpg
...
查看差异:
for f in common-{account,auth,password,session,session-noninteractive}; do
echo ==== $f ====
diff --unified /etc/pam.d/$f /tmp/foo/etc/pam.d/$f
done
答案2
dpkg
D如果您的配置文件发生了更改, 应该会提示并允许您查看差异(带有):
Configuration file `/etc/bash.bashrc'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
*** bash.bashrc (Y/I/N/O/D/Z) [default=N]
更新:从下面的评论可以看出,问题出在那些没有删除完整配置文件的软件包上(这是触发上述行为的地方),但使用脚本方法生成配置文件的文件上。Debian 政策手册描述为:
E.2 功能齐全的维护者脚本配置处理
对于包含站点特定信息(如主机名和网络详细信息等)的文件,最好创建文件在包的
postinst
脚本中。这通常涉及检查系统其余部分的状态以确定值和其他信息,并且可能涉及提示用户输入一些无法通过其他方式获得的信息。
使用此方法时,应考虑几个重要问题:
如果您发现生成配置文件的程序中存在错误,或者文件的格式从一个版本变为另一个版本,则必须安排脚本
postinst
执行一些合理的操作 - 通常这意味着编辑已安装的配置文件以消除问题或更改语法。您必须非常小心地执行此操作,因为用户可能已更改文件,也许是为了修复脚本试图处理的问题 - 您必须检测这些情况并正确处理它们。如果你确实要走这条路,那么最好将生成配置文件的程序制作成一个单独的程序
/usr/sbin
,按照惯例称为packageconfig
然后,如果合适,从安装后脚本中运行该脚本。packageconfig
程序不应该毫无疑问地覆盖现有的配置——如果它的操作模式是针对第一次设置包(而不是以后进行任何任意的重新配置),你应该让它检查配置是否已经存在,并要求--force
标志来覆盖它。
这意味着你需要依靠packageconfig
程序,针对 PAM /usr/sbin/pam-auth-update
,提供试运行或预览选项。
据我所知, /usr/sbin/pam-auth-update
它没有提供这样的功能。
答案3
您可以复制整个目录,然后对每个文件运行 diff 来检查差异
cp -r /etc/pam.d/ /home/<user>/
pam-auth-update --force
diff /etc/pam.d/ /home/<user>/pam.d
仔细检查每个差异后,您就可以决定是否要保留更改或恢复到旧更改。恢复非常简单,只需将文件复制回原来的位置即可
答案4
我刚遇到过这个问题。最后,我pam-auth-update --force
更改了文件——然后发现它还保存了旧文件的副本(例如 /etc/pam.d/common-foo.pam.old)。下面的一行代码向我展示了差异:
for old in *.pam-old; do new="${old:0:-8}"; echo "=== $new ==="; diff $old $new; done
它:
- 循环遍历备份副本;
- 删除最后 8 个字符以获取新文件的名称;
- 回显文件名(这样我们就可以看到哪个包含每个更改);以及
- 比较新旧文件