apt-get升级后如何运行命令

apt-get升级后如何运行命令

最近我遇到了一个不错的checkrestart工具,用于检查正在运行的进程是否使用最近更新的库的过时版本,并且需要重新启动才能使用更新的库加载它们。目前,checkrestart每次使用apt-get upgrade或 时,我都必须手动调用aptitude upgrade

有没有办法在升级某些软件包apt-get后自动调用此类命令?aptitude如果解决方案也适用于 则加分unattended-upgrades

答案1

经过更多搜索后,发现了我已经怀疑的内容:apt它本身提供了一组钩子来在某些事件中调用命令,许多工具都使用它,但似乎几乎没有记录。

checkrestart在软件包升级后调用工具相当简单。只需将以下代码行放入/etc/apt/apt.conf现有文件之一或新文件中/etc/apt/apt.conf.d/

DPkg::Post-Invoke-Success { '/usr/sbin/checkrestart';};

checkrestart每次dpkg被调用apt(当然还有依赖于 的任何其他工具apt,例如aptitude)并成功完成时,都会调用该函数。

答案2

有几种方法可以做到这一点。

使用脚本

一个快速而肮脏的解决方案是编写一个名为apt-getor的脚本aptitude,并使其调用实际程序,如下所示:

#!/bin/bash
# filename: apt-get

# '$@' is all of the arguments passed to the script
/usr/bin/apt-get-bin "$@"
# or /usr/bin/aptitude-bin "$@"

if [[ $1 == *upgrade* ]] ; then
    checkrestart
fi

使脚本可执行:chmod +x apt-get.您可能还想让该脚本归 root: 所有chown root apt-get; chgrp root apt-get。请小心不要在脚本上设置 setuid 位,因为如果攻击者获得了对该脚本的写入权限,他们可以快速轻松地修改它以获取 root shell。

当然,此方法需要您将实际的二进制文件移动到另一个位置,并将 shell 脚本移动到路径中的某个位置。放置用户脚本的正确位置是/usr/local/bin.但在这种情况下,您应该将脚本放在移动二进制文件之前实际所在的位置,以便保持组织有序。

以这种方式用脚本替换二进制文件是相当具有侵入性的,并且会影响计算机上的所有用户。作为替代方案,您可以将脚本命名为类似的名称apt-get-cr,只需记住调用该脚本而不是apt-get.您还可以编写一个 shell 函数。

使用外壳函数

使用 shell 函数可以保留命令名称,apt-get而无需移动二进制文件。

apt-get() {
    # 'command' makes sure this function doesn't call itself.
    # You could also use a direct path the binary as shown above.
    command apt-get "$@"

    if [[ $1 == *upgrade* ]] ; then
        checkrestart
    fi
}

将此函数放在 shell 配置中的某个位置(~/.bashrc~/.zshrc等)

这种方法通常比脚本方法的侵入性要小很多。此外,它不需要移动二进制文件,这通常只有 root 用户才能做到。

不利的一面是,shell 函数方法在 shell 之间并不总是非常可移植,并且本质上不能像脚本方法那样与图形界面(例如启动器栏)很好地配合(您几乎总是可以将脚本视为可执行二进制文件。 )

相关内容