E.2 功能齐全的维护者脚本配置处理

E.2 功能齐全的维护者脚本配置处理

我有一个运行 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

dpkgD如果您的配置文件发生了更改, 应该会提示并允许您查看差异(带有):

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

它:

  1. 循环遍历备份副本;
  2. 删除最后 8 个字符以获取新文件的名称;
  3. 回显文件名(这样我们就可以看到哪个包含每个更改);以及
  4. 比较新旧文件

相关内容