是否可以“安装”一个在删除包之前调用的钩子?

是否可以“安装”一个在删除包之前调用的钩子?

背景:在 Ubuntu 上,我喜欢在删除文件时sshd尝试加载文件时防止记录错误。ssh_host_dsa_key似乎没有配置选项可以sshd_config阻止sshd尝试此操作。因此,我chattr +i在清空文件后设置不可变属性。

现在,让我们openssh-server在答案中采用这个特定的示例(包)。

问题:如何安装在删除(清除)过程中包本身可能调用的任何内容之前运行的脚本?

可以想象,当 purging( apt-get --purge remove) 包时,由于不可变属性而失败。这样的挂钩将允许我删除不可变属性并允许包删除成功。


如果无法加载 DSA 密钥,日志中会出现以下错误:

sshd[5669]: error: Could not load host key: /etc/ssh/ssh_host_dsa_key

答案1

您可以为该dpkg命令添加一个钩子。创建一个包含以下内容的文件/etc/dpkg/dpkg.cfg.d/my_hook(如果目录不存在则创建该目录)

pre-invoke=/usr/local/sbin/dpkg-pre-hook

该程序在执行操作/usr/local/sbin/dpkg-pre-hook之前执行。dpkg环境变量包含正在执行的DPKG_HOOK_ACTION操作: 、、或其他几个dpkg之一。您无法知道正在操作的包的名称 - 这些钩子旨在更新系统状态(例如,保持包的索引或文档最新),而不是影响个人的行为包。尽管如此,您可以通过查看传递给 的参数来判断发生了什么。这并不完全可靠,但只要系统管理员不尝试破坏它就应该可以工作。installunpackconfigureremovepurgedpkg

#!/bin/bash
IFS=$'\t' read -a arguments < <(</proc/$PPID/cmdline tr '\0' '\t')
shift arguments
case $DPKG_HOOK_ACTION in
  remove|purge)
    for x in "${arguments[@]}"; do
      case $x in
        openssh-server) …;;
      esac
    done
esac

你的例子很奇怪。你是几乎肯定是找错了树ssh_host_ecdsa_key当您删除软件包时,Ubuntu 软件包不会创建新文件(这是多么奇怪的事情啊!)。它删除该密钥文件(以及其他密钥文件和其他配置文件)当您清除包裹。如果您不希望删除密钥文件,请删除软件包而不是清除它,或者备份密钥文件。

如果您不希望 SSH 服务器使用特定的密钥类型(这可能首先不是一个好主意),请不要摆弄文件属性。在配置文件中使用该选项即可达到此效果:HostKey为要使用的密钥显式传递该选项,并且将不使用默认密钥文件名。

对于包提供的文件(SSH 密钥文件不是这种情况,必须在每台计算机上生成),请使用dpkg-divert如果您不希望特定文件位于其包提供的位置。

答案2

prerm您可以通过 deb 包中的和脚本执行任意卸载操作postrm,您可以为此重建包,但它可能如果您编辑openssh-server.prerm(in /var/lib/dpkg/info/),也可以工作。 (这些与 RPM 规范文件%preun和部分类似%postun。)

当前的 OpenSSH 包使用这些来update-alternatives清理配置文件。例如你可以看到这些这里openssh_6.6p1-2ubuntu1.debian.tar.xzUbuntu 使用的软件包设置中。

https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html (特别是第 7.6 节)。

我对 Ubuntu 上 OpenSSH 包的安装和操作的理解是,各种密钥仅在新安装时创建,而不是像某些发行版那样在每次启动时按需创建。

我相信 Ubuntu 提供的唯一其他类型的“钩子”是崩溃检测同意,这在这里没有用。

sshd本身不会创建您引用的文件,但(sshd_config默认HostKey设置)会期望它存在。此时 OpenSSH 不允许您选择启用哪些主机密钥算法明确地,正如所说KexAlgorithms,它们已启用隐含地当在启动时找到每种类型(RSA、DSS、ECDSA)的可行主机密钥时。另一种方法是HostKey为您希望支持的每种类型的密钥指定一个覆盖默认值的密钥。

相关内容