问题描述
当我们安装/删除/更新软件包或进行任何需要管理权限的更改时,系统会提示我们输入具有sudo
权限的admin用户的密码 – 这通过GUI和终端进行。
但是,如果我们尝试通过终端关闭并重新启动,它会抱怨我们需要root
:
$ reboot
reboot: Need to be root
$ shutdown now
shutdown: Need to be root
但是当我们通过右上方的cog-wheel执行这些操作时,我们永远不会要求输入密码。
为什么会出现这种差异?
最佳解决办法
cog-wheel上的关闭检查是否允许您关闭机器。这是通过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-Privileges为您调用shutdown命令。
如果希望能够通过命令行(shutdown, reboot, halt, ...
)以“旧方式”关闭机器,则需要将suid-Bit添加到这些命令中。但请注意,系统中有权访问shell的每个人都可以关闭您的计算机。
次佳解决办法
Ubuntu是GNU /Linux Operationg系统的发行版,后者又属于Unix系统系列 – 这是许多现代操作系统的通用架构。
传统上Unix曾经在大型计算机上运行。中央计算设备,通过远程终端为dozends或数百个用户提供服务。由于所有用户都依赖于大型机的可用性,因此不允许单个用户发出关闭命令。一个对Unix体系结构至关重要的想法 – 系统内核永远不会初始化关闭,除非超级用户进程调用相应的函数。
在当代桌面系统中,开发人员已经经历了某些痛苦,以便仅为桌面用户提供关闭。一种常见的技术是让登录管理器(通常在root用户的安全上下文中运行)处理关闭和重新启动。在这种情况下,图形shell向登录管理器发出请求以关闭计算机。这涉及使用进程间通信(IPC),通常通过dbus服务。
上面提到的策略包通过提供标准化框架来扩展此过程,通过该框架,登录管理器(或任何程序提供关闭服务)可以检查允许哪些用户导致关闭,并且管理员可以分别配置这些权限。
某些桌面环境不使用IPC-based服务,而是使用一组辅助程序来提供相同或类似的功能。这些帮助程序将通过机制调用,允许更改为超级用户上下文,如sudo,suid或类似于sudo的策略包机制。
在任何情况下,shell上的哑传统关闭程序都不会以这种方式工作,它要求您看到它在超级用户上下文中运行。
第三种解决办法
因为Linux通常用作服务器或类似服务器,并且SSH连接到Linux机箱,即使是普通的Ubuntu笔记本电脑也很常见。
事实上,您可能不希望具有SSH访问权限的人能够将其关闭,尤其是当可能有其他远程登录用户使用它时。有人可以访问GUI – 好吧,他可以通过物理电源按钮自行关闭它。
此外,远程登录用户将无法重新打开它。
第四种办法
When I reboot via the GUI I can do that without my
sudo
password.
仅当您是唯一登录的用户时。如果有其他用户(包括控制台用户),您可能需要输入root密码。在OS X和较新的Windows版本上也是如此。
Why is that? What’s happening internally of the ubuntu system there?
以下命令:
/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
D-Bus is an IPC mechanism – a medium for local communication between processes running on the same host.
D-Bus is “smarter” than low-level message-passing protocols such as UDP. On the other hand, it does carry messages as discrete items—not continuous streams of data.
D-Bus has a structured view of the data it carries, and deals with data in binary form; integral numbers of various widths, strings, and so on. Because data is not just “raw bytes” to D-Bus, messages can be validated.
为什么shutdown
命令只检查是否有人登录?说实话,这似乎是一种无私的特征。我可以想象它有时会节省时间,但通常首选一致的控制台。我不希望命令在运行后有时需要密码,有时则不需要。
第五种办法
您不需要root用户从GUI启动关闭的原因很大程度上是典型桌面用户的便利。系统知道您是在控制台上登录的用户,因此如果您错误地关闭了计算机,您可以将其重新打开。
对于shell中的用户,您可能会远程登录,因此系统要求您以root用户身份登录才能发出shutdown命令。这可以防止登录到服务器的普通用户在其他人正在使用它时将其关闭,并且在那里不一定有任何人在那里启动计算机备份。
关闭不提供super-user密码的GUI提示的原因可能只是在那里没有真正的实用工具 – 如果你在控制台上,出现提示,你可以只使用cog-wheeel菜单。如果您想要关闭super-user密码的命令行提示,那么”sudo shutdown”已经提供了该密码。
第六种办法
在multi-user系统中,您最不希望的是您的用户登录并能够随时随机重启服务器,因此Reboot的命令行版本是superuser-only命令,因此需要您是root用户或拥有sudo权限。
同样也有Halt和PowerOff命令。