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

0xC*_*22L 1 apt

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

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

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

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


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

sshd[5669]: error: Could not load host key: /etc/ssh/ssh_host_dsa_key
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 5

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

\n\n
pre-invoke=/usr/local/sbin/dpkg-pre-hook\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
#!/bin/bash\nIFS=$\'\\t\' read -a arguments < <(</proc/$PPID/cmdline tr \'\\0\' \'\\t\')\nshift arguments\ncase $DPKG_HOOK_ACTION in\n  remove|purge)\n    for x in "${arguments[@]}"; do\n      case $x in\n        openssh-server) \xe2\x80\xa6;;\n      esac\n    done\nesac\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n\n

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

\n\n

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

\n