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

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

实际上这个问题其实毫无意义,对于桌面系统而言,面向的使用者都是在物理接触机器的前提下进行的,实际上任何使用者都能关掉电源达到关机的作用。一直以来“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 进行重启和关机。

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 替换关机命令)

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

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

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

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

 

(待续)

3条评论

发表评论

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