我有一台用于机器控制环境的 Linux 机器。操作要求规定,只要在专用(纸质)笔记本上记录了重新启动或关闭并在机器上执行了特定程序,重新启动就可以。
我想让reboot
和shutdown
命令向正在执行该命令的用户(最有可能是 root)显示一条自定义消息,如果该消息强制用户通过按 Enter 或其他键来确认它,那将会很有帮助。
网络上的大多数文档都侧重于定义此类消息以向其他登录用户显示,并预计关闭将安排在未来的某个时间。我需要几乎相反的信息:该消息应该停止 root 的跟踪并将它们发送到带有日志的桌子上;-)
可以在某处配置吗?
答案1
您可以创建一个函数reboot
并将其放入 root 的 shell 启动中,也许是这样的:
reboot () {
echo "Did you enter this in the logbook? Type yes if you did."
read answer
case $answer in
(Yes | YES | yes | Y | y) command reboot "$@" ;;
(*) echo "Sorry mate, not going to space today.";;
esac
}
请注意,这很容易规避(通过删除函数 或command reboot
),因此只能作为第一道防线。
有点困难但并非不可能的是重命名二进制文件并制作一个名为call 的reboot
脚本(如果问题得到肯定的回答)。然而,如果其他脚本或程序调用/分叉并且不准备回答问题,则这种方法会存在问题。他们可能会以有趣的方式挂起或行为不端。reboot
the_real_reboot
reboot
答案2
如何实现这一点取决于公开关闭功能的接口。如果没有本地或远程图形用户界面,也没有类似 webmin 的 Web 界面,并且这是一个物理实例而不是虚拟机或容器,那么您(可能)只需要担心 ACPI 关闭、关闭、重新启动、初始化、 telinit、systemctl 关机/重启命令。
我建议您不要干扰 ACPI 行为。将此作为应急措施(在拔掉电源之前)。
对于其他用户,为所有用户创建别名或函数(在使用 bash 的系统上,这应该位于 bashrc 而不是配置文件中)。在大多数 Linux 发行版上,默认配置是在 /etc 中拥有通用配置文件和 bashrc,以及 $HOME 中的每用户文件。在这种情况下,公共文件是从每个用户文件中调用的,因此应该很容易找出这种情况是否已经存在或实现它。
正如 Jens 所暗示的那样,如果 bash 函数定义为与 $PATH 上的命令(或内置命令)同名,那么在 shell 中键入此命令将触发该函数而不是该命令。在命令前面加上关键字command
可以抑制这种情况。请注意,指定完整路径还会运行存储的可执行文件而不是函数。
别名的行为类似。我不知道如果你同时有一个函数和一个别名,哪个会执行 - 但测试起来很简单。
关于 Jens 的代码,请注意 systemctl 可以用于许多其他事情以及关闭,因此您需要添加一些额外的逻辑检查。此外,如果我被要求实现这一点,那么我将为成功和不成功的尝试添加一些日志记录(请参阅 参考资料man logger
)。