![是否可以“安装”一个在删除包之前调用的钩子?](https://linux22.com/image/64110/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E2%80%9C%E5%AE%89%E8%A3%85%E2%80%9D%E4%B8%80%E4%B8%AA%E5%9C%A8%E5%88%A0%E9%99%A4%E5%8C%85%E4%B9%8B%E5%89%8D%E8%B0%83%E7%94%A8%E7%9A%84%E9%92%A9%E5%AD%90%EF%BC%9F.png)
背景:在 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
之一。您无法知道正在操作的包的名称 - 这些钩子旨在更新系统状态(例如,保持包的索引或文档最新),而不是影响个人的行为包。尽管如此,您可以通过查看传递给 的参数来判断发生了什么。这并不完全可靠,但只要系统管理员不尝试破坏它就应该可以工作。install
unpack
configure
remove
purge
dpkg
#!/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.xz
Ubuntu 使用的软件包设置中。
看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
为您希望支持的每种类型的密钥指定一个覆盖默认值的密钥。