Adi*_*tya 64 sudo shutdown restart privileges
当我们安装/删除/更新软件包或进行任何需要管理权限的更改时,系统会提示我们输入具有sudo权限的管理员用户的密码——这通过 GUI 和终端发生。

但是,如果我们尝试通过终端关闭并重新启动,它会抱怨我们需要root:
$ reboot
reboot: Need to be root
$ shutdown now
shutdown: Need to be root
Run Code Online (Sandbox Code Playgroud)
但是当我们通过右上角的齿轮执行这些操作时,我们永远不会被要求输入密码。

为什么会出现这种差异?
cha*_*aos 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>
Run Code Online (Sandbox Code Playgroud)
PolicyKit 触发dbus-send命令。如果关闭,它将是:
dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
Run Code Online (Sandbox Code Playgroud)
有一个守护进程在后台运行,具有 root-Privileges 为您调用关闭命令。
当您希望能够通过命令行 ( shutdown, reboot, halt, ...)以“旧方式”关闭机器时,您需要将 suid-Bit 添加到这些命令中。但请注意,您系统上有权访问 shell 的每个人都可以关闭您的机器。
Pau*_*sch 26
Ubuntu 是 GNU/Linux 操作系统的一个发行版,后者又属于 Unix 系统家族——许多现代操作系统的通用架构。
传统上 Unix 用于在大型计算机上运行。通过远程终端为数十或数百用户提供服务的中央计算设施。由于所有用户都依赖于大型机的可用性,因此不允许单个用户发出关机命令。Unix 体系结构的基本思想 - 除非超级用户进程调用相应的函数,否则系统内核永远不会初始化关闭。
在当代桌面系统中,开发人员已经经历了某些痛苦,以使单纯的桌面用户可以使用关机。一种常见的技术是让通常在 root 用户的安全上下文中运行的登录管理器处理关机和重启。在这种情况下,图形外壳向登录管理器发出关闭计算机的请求。这涉及使用进程间通信 (IPC),通常通过 dbus 服务。
上面提到的 policykit 通过提供一个标准化框架扩展了这个过程,登录管理器(或任何提供关闭服务的程序)可以通过该框架检查允许哪些用户导致关闭,并且管理员可以通过它分别配置这些权限。
一些桌面环境不使用基于 IPC 的服务,而是使用一组帮助程序来提供相同或相似的功能。这些帮助程序将通过机制调用,允许更改为超级用户上下文,如 sudo、suid 或类似于 sudo 的 policykit 机制。
无论如何,shell 上愚蠢的传统关闭程序不会以这种方式工作,它需要您看到它是在超级用户上下文中运行的。
Man*_*rth 14
因为 Linux 通常用作服务器或类似设备,并且通过 SSH 连接到 linux 机器,即使是普通的 Ubuntu 笔记本电脑,也很常见。
问题是,您可能不希望具有 SSH 访问权限的人能够关闭它,尤其是当可能有其他远程登录用户使用它时。可以访问 GUI 的人 - 好吧,他无论如何都可以使用物理电源按钮自行关闭它。
此外,远程登录的用户将无法重新打开它。
Tim*_*Tim 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
Run Code Online (Sandbox Code Playgroud)
D-Bus 是一种 IPC 机制——一种用于在同一主机上运行的进程之间进行本地通信的媒介。
D-Bus 比低级消息传递协议(如 UDP)“更智能”。另一方面,它确实将消息作为离散项目传送,而不是连续的数据流。
D-Bus对其承载的数据有结构化的视图,以二进制形式处理数据;各种宽度、字符串等的整数。因为数据不仅仅是 D-Bus 的“原始字节”,所以可以验证消息。
--免费桌面
为什么该shutdown命令不检查是否有人登录?老实说,这似乎是一个非雇佣兵的特征。我可以想象它有时会节省时间,但通常首选一致的控制台。我不希望命令在运行后有时需要密码,有时不需要。
我的代词是他/他
小智 9
您不需要 root 用户即可从 GUI 启动关机的原因主要是为了方便典型的桌面用户。系统知道您是登录控制台的用户,因此如果您错误地关闭了计算机,您大概可以将其重新打开。
对于 shell 中的用户,您很可能是远程登录的,因此系统要求您以 root 身份登录才能发出关闭命令。这可以防止登录到服务器的普通用户在其他人正在使用它时将其关闭,而不必有人亲自在那里启动计算机备份。
关闭没有为超级用户密码提供 GUI 提示的原因可能仅仅是因为那里没有真正的实用程序 - 如果您在控制台上,提示会出现,您可以使用 cog-轮式菜单代替。如果您想在命令行中提示关闭超级用户密码,那么“sudo shutdown”已经可以使用了。
在多用户系统中,您最不想要的是您的用户登录并能够随时随机重启服务器,因此命令行版本的 Reboot 是一个仅限超级用户的命令,因此需要您是 root 或有sudo权限。
Halt 和 PowerOff 命令也是如此。