删除关机命令但保持重启状态的最佳方法


27

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

我要保持shutdown -r 命令。如果我想冻结系统或使用ip table规则来锁定自己,我喜欢在其上放置一个计时器。例shutdown -r +10

Answers:


39

您应该使用基于系统的Linux发行版。在这种情况下,您应该能够屏蔽掉电源目标,以便systemd将拒绝执行它(并关闭电源)。例如:

systemctl mask poweroff.target

这使得完全不可能通过重启来关闭系统。看到什么都没有发生:

Debian9动画演示

在这种情况下,该VM的虚拟电源开关甚至无法再用于关闭系统。但是它仍然可以很好地重启。

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

systemctl unmask poweroff.target

2
是否有systemd命令列出所有服务/目标/设备及其描述(如果可用)?我最近开始阅读此书,很想探索各种可能性。
hjpotter92 '18

1
@ hjpotter92 systemctl不带参数运行。它将列出所有活动单元,它们的状态和描述。添加--all,它还会列出无效的单位。
迈克尔·汉普顿

2
@ hjpotter92看看man systemd.special
TooTea

16

有几种方法可以实现此目的。一种是使用普通的非特权帐户,这将需要使用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 shutdown -r +10)之前键入sudo ,则将以下内容添加到.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升级。


1
很好,除了sudo的默认配置会在第一次调用后一段时间内缓存凭据。当重复执行root用户会话中要求的命令时,这可能很方便。在这样的会话中(或者实际上,如果root外壳正在运行),完全有可能执行该命令shutdown并绕过检查。
Cosmic Ossifrage

感谢您的输入。然而,在这种情况下,我们配置shutdown -r使用sudo运行的时候,因此,如果他跑提示输入密码sudo shutdown -r ...的凭据不会被缓存,因为他们不会进入。看一下我在上面给出的示例,您可以看到我先运行它,然后运行,然后sudo shutdown -H提示输入密码。
John Doe

3
确实,这是可以理解的。但是,请考虑最后一个命令带有前缀sudo而不是NOPASSWD操作的情况;例如,以根用户身份编辑配置文件的调用。在这种情况下,密码将被缓存,随后的调用sudo shutdown -H将通过。sudo为避免这种情况,需要禁用的密码缓存。
Cosmic Ossifrage

2
在这种情况下,您是对的,+ 1表示禁用密码缓存。用建议编辑了我的评论。谢谢!
John Doe

2
我实际上根本不喜欢这种方式,因为它依赖于sudo密码提示来提示用户不要执行他们不应该执行的操作。但是密码提示确实不能达到这个目的。我们经常要求sudo输入密码,然后继续输入密码。有关使用sudo的另一种方法,请参见此处(尽管不是很好,但可能会好很多)。
迈克尔·汉普顿

10

有一个名为molly-guard的工具,要求您说明要关闭或重新引导的计算机的主机名。

如果您不使用Debian,考虑到程序相当原始,从源代码编译它应该很简单。


9

为了防止已设置为别名事故RHEL基于分布rmcp并且mv由根用户执行时其可以是稍微更具破坏性。

您可以添加自己的示例,例如:

#/root/.bashrc
alias poweroff='echo  "poweroff: Command disabled - THINK before you type.
  Use /usr/sbin/poweroff if you really want to drive to the DC to restore power."'

2
这如何保持shutdown -r禁用状态shutdown -P -H
MSalters

3

将关闭可执行文件重命名为无法意外调用的名称。

然后别名shutdown(whatever) -r


1
您能解释一下如何重命名可执行文件吗?将来能否中断软件包升级?
AL

2
@AL将来能否中断软件包升级? 是的,可以。它也可能破坏已经安装的东西。通常,弄混部分OS安装是一个非常糟糕的主意。
安德鲁·亨利

1
同意。别名shutdown就足够了/sbin/shutdown -r。重命名是没有必要的;由于别名扩展是指绝对路径,因此无需递归别名扩展。
MSalters

一个警告-我会认为“没有什么不可能” -只是不大可能
JosephDoggie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.