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

fox*_*t22 27 linux command-line-interface

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

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

Mic*_*ton 40

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

systemctl mask poweroff.target
Run Code Online (Sandbox Code Playgroud)

这使得除了重新启动之外完全不可能关闭系统。看到什么都没有发生:

Debian9 动画演示

在这种情况下,此 VM 的虚拟电源开关甚至无法再关闭系统。但它仍然很好地重新启动。

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

systemctl unmask poweroff.target
Run Code Online (Sandbox Code Playgroud)

  • 是否有 systemd 命令列出所有服务/目标/设备及其描述(如果可用)?我最近开始阅读这方面的内容,并很想探索各种可能性。 (2认同)
  • @hjpotter92 看看`man systemd.special`。 (2认同)

Joh*_*Doe 16

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

## user is allowed to execute reboot -r only
jdoe ALL=NOPASSWD: /sbin/shutdown -r *
Run Code Online (Sandbox Code Playgroud)

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

Defaults timestamp_timeout=0
Run Code Online (Sandbox Code Playgroud)

这将防止凭据缓存,以防您之前使用 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:
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的示例中,我在运行时不需要输入密码sudo shutdown -r +10,但其余时间我需要输入密码。如果您不想在命令 ( sudo shutdown -r +10)之前键入 sudo ,请将以下内容添加到您的 .bash_profile 或 .bashrc:

alias shutdown="sudo shutdown"
Run Code Online (Sandbox Code Playgroud)

例子:

[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:
Run Code Online (Sandbox Code Playgroud)

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

  • 原来如此,明白了。但是,请考虑最后一个命令以“sudo”为前缀而不是“NOPASSWD”操作的场景;例如,调用以 root 身份编辑配置文件。在这种情况下,密码将被缓存,随后对 `sudo shutdown -H` 的调用将通过。需要禁用 `sudo` 的密码缓存以避免这种情况。 (3认同)
  • 在这种情况下,您是对的,+1 用于禁用密码缓存。用建议编辑了我的评论。谢谢! (2认同)
  • 我实际上根本不喜欢这个,正是因为它依赖于 sudo 密码提示的存在,以提醒用户不要做他们不应该做的任何事情。但是密码提示确实不能用于此目的。`sudo` 经常要求我们输入密码,然后继续。有关使用 sudo 的替代方法,请参见 [此处](https://serverfault.com/q/36759/126632)(尽管不是很好,但可能要好得多)。 (2认同)

Sim*_*ter 10

有一个名为molly-guard的工具,它要求您说明要关闭或重新启动的机器的主机名。

如果您不使用 Debian,考虑到程序相当原始,从源代码编译它应该是微不足道的。


HBr*_*ijn 9

为防止意外,基于 RHEL 的发行版已经为 设置了别名rm,当由 root 用户执行时cpmv这可能更具破坏性。

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

#/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."'
Run Code Online (Sandbox Code Playgroud)

  • 这如何在禁用“shutdown -P -H”的同时保持“shutdown -r”? (2认同)