Linux 关机那些事(一):怎么让普通用户关机

事情的起因是最近USTC LUG群里讨论到了一个问题:如何让普通用户无法通过 shutdown 关机,一个简单的解决是(root 执行)

chmod 700 /sbin/shutdown

实际上这个问题其实毫无意义,对于桌面系统而言,面向的使用者都是在物理接触机器的前提下进行的,实际上任何使用者都能关掉电源达到关机的作用。一直以来“Linux 普通用户不能关机”作为初学者就需要知道的常识而广为人知,但是实际上这点并不是那么绝对的,关于这点引用一下 USTC LUG前会长尘光的观点(我表示十分赞同):

关键字:“帐号”和“用户”的区别。关机操作是可以由用户进行,而不是帐号进行的。
因此本质上这跟桌面系统还是服务器系统也没有关系。
服务器上不允许普通帐号关机,并不是为了保证帐号之间互不干扰,而是一种额外的保护机制。

* 对于一般情况下物理接触使用的终端,“限制只能由root帐号关机”是一个没有意义的限制
* 对于一般情况下非物理接触使用的主机,“限制只能有root帐号关机”是一个有意义的限制和保护措施
这跟操作系统无关,跟dm还是命令行无关。

长期以来使用的是 VPS 不需要关机,加之很早以前虚拟机都是用 halt 关机,以至于我看到 shutdown 都不记得有这个命令(记忆力捉鸡),于是打开虚拟机试了一下。但是我遇到了一个问题,我在自己的虚拟机里测试(14.04LTS)普通用户根本无法使用 shutdown 命令,因为这个命令位于/sbin/目录下,普通用户的 PATH 里是没有这个命令的,于是会提示
zsh: command not found: shutdown,虽然我不清楚15.04做出了什么方面的修改,可能是引入的 systemd 的区别。根据 ArchWiki ,普通用户可以通过 sysctl 不使用 sudo 进行重启和关机。

systemctl poweroff
systemctl reboot

PS.但是我特地跑去装了一个15.04还是发现提示 must be root,不知道那位哥们到底做了什么让普通用户能直接执行 shutdown。


UPDATE 2015.7.27 在另一台笔记本上装了 Ubuntu 15.04 之后在使用中发现 poweroff 是一个链接,指向 systemctl,也就是说15.04下的 poweroff 实际上是一个符号链接,还是调用的 systemd 而 systemd 是借助 polkit 实现的非 root 关机。


 

除了上述的 sysctl,ArchWiki 还提到了合理使用 sudo 命令和 alias,使得普通用户能直接使用命令关机(使用 sudo 指定命令免密码, alias 替换关机命令)

alias reboot="sudo systemctl reboot"
alias poweroff="sudo systemctl poweroff"
alias halt="sudo systemctl halt"
user hostname =NOPASSWD: /usr/bin/systemctl poweroff,/usr/bin/systemctl halt,/usr/bin/systemctl reboot

除了 systemd 之外,这应该是比较优雅的解决方案。

另外还搜到了一个比较有意思的东西:http://www.spencerstirling.com/computergeek/shutdown.html

在/etc/目录下建立一个 shutdown.allow 文件,和/etc/inittab 协同工作,在/etc/shutdown.allow文件里写的用户名可以使用 Ctrl+Alt+Del 组合键关机。(但是目前的几大主流发行版都没有了 inittab ,仅供参考吧)

然后想到了第二个问题:Linux 这么多关机命令,都有什么区别?

 

(待续)


本文链接:https://www.starduster.me/2015/06/16/sth-about-poweroff-on-linux-1/
本站基于 Creactive Commons BY-NC-SA 4.0 License 允许并欢迎您在注明来源和非商业使用前提下自由地对本文进行复制、分享或基于本文进行创作。
请注意:受限于笔者水平,本站内容可能存在主观臆断或事实错误,文中信息也可能因时间推移而不再准确,在此提醒读者结合自身判断谨慎地采纳。

5 条评论


  1. 虽然是两年前的文章……
    请教一下能不能直接setuid来赋予shutdown普通用户可执行的权限。这样会带来什么问题吗?

    回复

    1. 一是现在发行版都用systemd来关机了其实这么做现在没什么意义,二是我觉得这么做权限控制更难做了,好歹sudo和policykit都是自带认证的(自己个人电脑这么干估计问题不大)

      回复

回复 Stardust 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据