为什么我们需要成为终端的root用户才能关闭并重新启动?


65

当我们安装/删除/更新软件包或进行任何需要管理特权的更改时,系统会提示您输入具有sudo特权的管理员用户的密码-这既通过GUI也通过终端进行。

通过gui提示

但是,如果我们尝试通过终端关闭并重新启动,则会抱怨我们需要root

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

但是,当我们通过右上角的齿轮执行这些操作时,从不要求输入密码。

齿轮菜单

为什么会有这种差异?


5
好问题..你知道我要问同样的问题。我的情况是使用快捷键关闭Ubuntu。即,每当我按下某些指定的键(例如ctrl + super + s)时,它都会执行命令,sudo shutdown -h now但问题是,没有shutdown对它的访问权限就永远无法工作。 ..希望您了解我的处境.. :)
Saurav Kumar


Answers:


50

齿轮关闭会检查是否允许您关闭机器。这是通过PolicyKit完成的。如果关闭,/usr/share/polkit-1/actions/org.freedesktop.consolekit.policy则检查文件中的此语句:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

PolicyKit触发dbus-send命令。如果关闭,它将是:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

有一个在后台运行的root特权守护程序,可以为您调用shutdown命令。

如果希望通过命令行(shutdown, reboot, halt, ...)以“旧方式”关闭计算机,则需要将suid-Bit添加到这些命令中。但是请注意,系统上有权访问Shell的每个人都可以随后关闭计算机。


14
一个更安全的选择是允许sudoers无密码关闭等。这很容易实现:输入sudo visudo,添加%sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot,保存和退出。这样,仍然需要命令行重新启动sudo reboot,但是您不必输入密码。
塞巴斯蒂安·蒂尔施密特

27

Ubuntu是GNU / Linux操作系统的发行版,而GNU / Linux操作系统又属于Unix系统家族,它是许多现代操作系统的通用体系结构。

传统上,Unix曾经在大型机上运行。通过远程终端为数十或数百个用户提供服务的中央计算设施。由于所有用户都依赖于大型机的可用性,因此不允许单个用户发出关闭命令。这是Unix体系结构的基础思想-系统内核将永远不会初始化关闭,除非超级用户进程调用了相应的函数。

在当代台式机系统中,开发人员经历了某些痛苦的工作,以使仅台式机用户可以使用关机功能。一种常见的技术是让通常在root用户的安全上下文中运行的登录管理器处理关闭并重新启动。在这种情况下,图形外壳会向登录管理器发出关闭计算机的请求。这涉及通常通过dbus服务使用进程间通信(IPC)。

上面提到的策略工具包通过提供一个标准化的框架来扩展此过程,通过该框架,登录管理器(或提供关机服务的任何程序)可以检查允许哪些用户导致关机,并且管理员可以分别配置这些权限。

某些桌面环境不使用基于IPC的服务,而是使用一组帮助程序来提供相同或相似的功能。这些帮助程序将通过机制调用,从而允许更改为超级用户上下文,例如sudo,suid或类似于sudo的policykit机制。

无论如何,shell上笨拙的传统关机程序都无法通过这种方式工作,它需要您查看它是在超级用户上下文中运行的。


14

因为Linux通常被用作服务器或类似服务器,并且SSH进入Linux机器,甚至是普通的Ubuntu笔记本电脑,也很常见。

事实是,您可能不希望具有SSH访问权限的人能够将其关闭,尤其是当可能有其他远程登录的用户正在使用它时。可以访问GUI的人-可以通过物理电源按钮自行关闭它。

此外,远程登录的用户将无法重新打开它。


当时我问这个问题时,我没有想到,但是我想它们是Ubuntu中的选项,可以在远程服务器上安装GUI软件包,并通过GUI而不是命令行使用远程服务器。(类似于Windows远程桌面或Teamviewer的工作方式)。因此,这将使使用基于GUI的Ubuntu的用户可以使用物理电源按钮关闭的假设无效。
阿迪亚

@aditya需要以这种方式设置服务器,管理员必须决定这样做
Manishearth,2016年

是。它将需要root特权才能安装软件包并根据需要进行配置。但是,在昨天阅读您的答案时,我想到了这种情况,我想与您分享:-)
阿迪亚

14

当我通过GUI重新启动时,无需sudo密码即可执行此操作。

仅当您是唯一登录的用户时。如果还有其他用户(包括控制台用户),则可能必须输入root密码。在OS X和更新的Windows版本上相同。

这是为什么?那里的ubuntu系统内部发生了什么?

以下命令:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus是IPC机制-一种用于在同一主机上运行的进程之间进行本地通信的介质。

D-Bus比诸如UDP之类的低级消息传递协议“更智能”。另一方面,它确实将消息作为离散项承载,而不是连续的数据流。

D-Bus具有所携带数据的结构化视图,并以二进制形式处理数据。各种宽度,字符串等的整数。因为数据不只是D-Bus的“原始字节”,所以可以验证消息。

- 免费桌面

为什么shutdown命令不只是检查是否有人登录?老实说,这似乎是非雇佣性质的。我可以想象有时会节省时间,但是通常首选一致的控制台。我不希望命令在运行后有时需要输入密码,有时却不需要。

我的代词是他/他


通过qdbus应用程序还有更短的版本
Sergiy Kolodyazhnyy 2016年

从DE(在这种情况下为GNOME)关闭/注销时,sudo无论是通过GDM登录的其他用户还是通过tty登录的其他用户,都不会询问我的root /用户密码。
kos

@kos hu,这很奇怪。该屏幕快照是Gnome 3的,并且我已登录gui和tty
Tim

我的意思是我收到相同的消息,但是单击“关闭电源”只会继续并关闭系统。我还请Fabby对此进行测试,它对他也有相同的效果,不确定是怎么回事。
kos

@kos哦。胡挂了
蒂姆(Tim)

9

无需root用户即可从GUI启动关机,这在很大程度上是典型的台式机用户的便利问题。系统知道您是在控制台上登录的用户,因此,如果您错误地关闭了计算机,则可以将其重新打开。

对于Shell中的用户,您很可能是远程登录的,因此系统要求您以root用户身份登录才能发出shutdown命令。这样可以防止登录到服务器的普通用户在其他人使用服务器时关闭服务器,也不必一定要有人在现场启动服务器。

关机不提供超级用户密码的GUI提示的原因可能仅仅是因为那里没有真正的实用程序-如果您在控制台上出现提示,则可以使用cog-旋转菜单。如果您想在命令行中输入用于关闭的超级用户密码,“ sudo shutdown”已经可以使用。


5

在多用户系统中,您需要做的最后一件事是用户登录并能够随时随机重启服务器,因此,命令行版本的Reboot是仅超级用户的命令,因此您需要是root用户或拥有sudo权利。

同样也可以使用Halt和PowerOff命令。


2
感谢您的回答,我确实理解我作为数十名用户使用的计算机的用户不应该能够重新引导计算机,但是当我选择通过鼠标重新引导时,Ubuntu(或几乎所有台式机发行版)会做什么?而不是键盘?他们允许没有特权。
asco 2016年

3
诸如systemctl,loginctl,systemd,系统策略之类的组件均允许当前登录的用户访问某些root功能,而无需显式要求root访问以使桌面体验更加用户友好,但是这些不一定调用命令行执行这些任务的命令。
杰夫·塞雷诺
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.