![删除关机命令但保留重启的最佳方法](https://linux22.com/image/726707/%E5%88%A0%E9%99%A4%E5%85%B3%E6%9C%BA%E5%91%BD%E4%BB%A4%E4%BD%86%E4%BF%9D%E7%95%99%E9%87%8D%E5%90%AF%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95.png)
我在数据中心有一个 raspi 类型的设备,最近不小心把关机命令粘贴到了屏幕上错误的终端上。有没有办法保留shutdown -r
但删除#poweroff
#shutdown -P -H
选项?
我想保持shutdown -r
控制。如果我设法冻结系统,或者使用 ip 表规则将自己锁定,我喜欢在上面设置一个计时器。示例shutdown -r +10
答案1
您应该使用基于 systemd 的 Linux 发行版。在这种情况下,您应该能够面具poweroff 目标,这样 systemd 将拒绝执行它(并关闭电源)。例如:
systemctl mask poweroff.target
这使得除了重新启动之外完全无法关闭系统。看看是否没有发生任何事情:
在这种情况下,该虚拟机的虚拟电源开关甚至无法关闭系统。但它仍然可以完美地重新启动。
当然,要撤消更改,只需取消屏蔽目标即可。然后您就可以关闭系统了。
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