Answers:
您应该使用基于系统的Linux发行版。在这种情况下,您应该能够屏蔽掉电源目标,以便systemd将拒绝执行它(并关闭电源)。例如:
systemctl mask poweroff.target
这使得完全不可能通过重启来关闭系统。看到什么都没有发生:
在这种情况下,该VM的虚拟电源开关甚至无法再用于关闭系统。但是它仍然可以很好地重启。
当然,要撤消更改,只需取消屏蔽目标即可。然后,您可以关闭系统。
systemctl unmask poweroff.target
systemctl
不带参数运行。它将列出所有活动单元,它们的状态和描述。添加--all
,它还会列出无效的单位。
man systemd.special
。
有几种方法可以实现此目的。一种是使用普通的非特权帐户,这将需要使用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升级。
sudo
的默认配置会在第一次调用后一段时间内缓存凭据。当重复执行root
用户会话中要求的命令时,这可能很方便。在这样的会话中(或者实际上,如果root
外壳正在运行),完全有可能执行该命令shutdown
并绕过检查。
shutdown -r
以不使用sudo运行的时候,因此,如果他跑提示输入密码sudo shutdown -r ...
的凭据不会被缓存,因为他们不会进入。看一下我在上面给出的示例,您可以看到我先运行它,然后运行,然后sudo shutdown -H
提示输入密码。
sudo
而不是NOPASSWD
操作的情况;例如,以根用户身份编辑配置文件的调用。在这种情况下,密码将被缓存,随后的调用sudo shutdown -H
将通过。sudo
为避免这种情况,需要禁用的密码缓存。
有一个名为molly-guard的工具,要求您说明要关闭或重新引导的计算机的主机名。
如果您不使用Debian,考虑到程序相当原始,从源代码编译它应该很简单。