当我们安装/删除/更新软件包或进行任何需要管理特权的更改时,系统会提示您输入具有sudo
特权的管理员用户的密码-这既通过GUI也通过终端进行。
但是,如果我们尝试通过终端关闭并重新启动,则会抱怨我们需要root
:
$ reboot
reboot: Need to be root
$ shutdown now
shutdown: Need to be root
但是,当我们通过右上角的齿轮执行这些操作时,从不要求输入密码。
为什么会有这种差异?
当我们安装/删除/更新软件包或进行任何需要管理特权的更改时,系统会提示您输入具有sudo
特权的管理员用户的密码-这既通过GUI也通过终端进行。
但是,如果我们尝试通过终端关闭并重新启动,则会抱怨我们需要root
:
$ reboot
reboot: Need to be root
$ shutdown now
shutdown: Need to be root
但是,当我们通过右上角的齿轮执行这些操作时,从不要求输入密码。
为什么会有这种差异?
Answers:
齿轮关闭会检查是否允许您关闭机器。这是通过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的每个人都可以随后关闭计算机。
sudo visudo
,添加%sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot
,保存和退出。这样,仍然需要命令行重新启动sudo reboot
,但是您不必输入密码。
Ubuntu是GNU / Linux操作系统的发行版,而GNU / Linux操作系统又属于Unix系统家族,它是许多现代操作系统的通用体系结构。
传统上,Unix曾经在大型机上运行。通过远程终端为数十或数百个用户提供服务的中央计算设施。由于所有用户都依赖于大型机的可用性,因此不允许单个用户发出关闭命令。这是Unix体系结构的基础思想-系统内核将永远不会初始化关闭,除非超级用户进程调用了相应的函数。
在当代台式机系统中,开发人员经历了某些痛苦的工作,以使仅台式机用户可以使用关机功能。一种常见的技术是让通常在root用户的安全上下文中运行的登录管理器处理关闭并重新启动。在这种情况下,图形外壳会向登录管理器发出关闭计算机的请求。这涉及通常通过dbus服务使用进程间通信(IPC)。
上面提到的策略工具包通过提供一个标准化的框架来扩展此过程,通过该框架,登录管理器(或提供关机服务的任何程序)可以检查允许哪些用户导致关机,并且管理员可以分别配置这些权限。
某些桌面环境不使用基于IPC的服务,而是使用一组帮助程序来提供相同或相似的功能。这些帮助程序将通过机制调用,从而允许更改为超级用户上下文,例如sudo,suid或类似于sudo的policykit机制。
无论如何,shell上笨拙的传统关机程序都无法通过这种方式工作,它需要您查看它是在超级用户上下文中运行的。
因为Linux通常被用作服务器或类似服务器,并且SSH进入Linux机器,甚至是普通的Ubuntu笔记本电脑,也很常见。
事实是,您可能不希望具有SSH访问权限的人能够将其关闭,尤其是当可能有其他远程登录的用户正在使用它时。可以访问GUI的人-可以通过物理电源按钮自行关闭它。
此外,远程登录的用户将无法重新打开它。
当我通过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
命令不只是检查是否有人登录?老实说,这似乎是非雇佣性质的。我可以想象有时会节省时间,但是通常首选一致的控制台。我不希望命令在运行后有时需要输入密码,有时却不需要。
我的代词是他/他
sudo
无论是通过GDM登录的其他用户还是通过tty登录的其他用户,都不会询问我的root /用户密码。
无需root用户即可从GUI启动关机,这在很大程度上是典型的台式机用户的便利问题。系统知道您是在控制台上登录的用户,因此,如果您错误地关闭了计算机,则可以将其重新打开。
对于Shell中的用户,您很可能是远程登录的,因此系统要求您以root用户身份登录才能发出shutdown命令。这样可以防止登录到服务器的普通用户在其他人使用服务器时关闭服务器,也不必一定要有人在现场启动服务器。
关机不提供超级用户密码的GUI提示的原因可能仅仅是因为那里没有真正的实用程序-如果您在控制台上出现提示,则可以使用cog-旋转菜单。如果您想在命令行中输入用于关闭的超级用户密码,“ sudo shutdown”已经可以使用。
在多用户系统中,您需要做的最后一件事是用户登录并能够随时随机重启服务器,因此,命令行版本的Reboot是仅超级用户的命令,因此您需要是root用户或拥有sudo权利。
同样也可以使用Halt和PowerOff命令。
sudo shutdown -h now
但问题是,没有shutdown
对它的访问权限就永远无法工作。 ..希望您了解我的处境.. :)