删除关机命令但保留重启的最佳方法

删除关机命令但保留重启的最佳方法

我在数据中心有一个 raspi 类型的设备,最近不小心把关机命令粘贴到了屏幕上错误的终端上。有没有办法保留shutdown -r但删除#poweroff #shutdown -P -H选项?

我想保持shutdown -r 控制。如果我设法冻结系统,或者使用 ip 表规则将自己锁定,我喜欢在上面设置一个计时器。示例shutdown -r +10

答案1

您应该使用基于 systemd 的 Linux 发行版。在这种情况下,您应该能够面具poweroff 目标,这样 systemd 将拒绝执行它(并关闭电源)。例如:

systemctl mask poweroff.target

这使得除了重新启动之外完全无法关闭系统。看看是否没有发生任何事情:

Debian9 动画演示

在这种情况下,该虚拟机的虚拟电源开关甚至无法关闭系统。但它仍然可以完美地重新启动。

当然,要撤消更改,只需取消屏蔽目标即可。然后您就可以关闭系统了。

systemctl unmask poweroff.target

答案2

有几种方法可以实现这一点。一种方法是使用常规的非特权帐户,这将需要使用 sudo 运行命令并输入密码。然后,您可以将以下内容附加到 /etc/sudoers(通过运行 visudo):

## user is allowed to execute reboot -r only
jdoe ALL=NOPASSWD: /sbin/shutdown -r *

此外,要禁用 sudo 凭据缓存,还请添加以下内容:

Defaults timestamp_timeout=0

如果您之前使用 sudo 调用命令,这将阻止凭据缓存。

例子:

[root@ops ~]# su - jdoe
[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:
[jdoe@ops ~]$ sudo shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 18:51:13 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ sudo shutdown -H
[sudo] password for jdoe:
^[[A[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:

请注意,在上面的例子中,运行 时不需要输入密码sudo shutdown -r +10,但其余部分则需要输入。如果您希望在命令 ( ) 前无需输入 sudo sudo shutdown -r +10,请将以下内容添加到 .bash_profile 或 .bashrc 中:

alias shutdown="sudo shutdown"

例子:

[jdoe@ops ~]$ source ~/.bash_profile
[jdoe@ops ~]$ shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 19:03:14 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ shutdown -c
[sudo] password for jdoe:

请注意,最佳做法是使用非特权帐户,并在需要时使用 sudo 升级。

答案3

有一种工具叫molly 守卫这要求您说明要关闭或重新启动的机器的主机名。

如果您不使用 Debian,那么从源代码编译它应该很简单,因为该程序相当原始。

答案4

将关机可执行文件重命名为不可能意外调用的名称。

然后别名shutdown(whatever) -r

相关内容