假设您安装了一个桌面环境,比如 ubuntu 或 debian。您可以以普通用户身份单击系统菜单上的某个按钮来关闭系统。您无需切换到超级用户即可完成此操作。
然而,在同一个桌面环境中,如果我以普通用户身份打开一个终端(比如 gnome-terminal),然后输入
shutdown -h now
我会受到提示
shutdown: need to be root
关机的唯一方法是在命令前面加上 sudo。
谁能解释一下为什么会这样?
谢谢KC
答案1
K.Chen 提出的问题是:为什么我从 CLI 执行此操作时需要 sudo 权限,而从 GUI 执行此操作时不需要这样的权限。
答案的第一部分是,设计桌面环境(如 Gnome、KDE、Xfce、Mate、Cinnamon 等)的人试图简化用户的工作,他们配置关机和重启时不需要 sudo 凭据。顺便说一句,这意味着必须有一个关机序列,它确实不是涉及程序关闭,这确实需要 sudo 权限(没有办法解决这个问题)。
我不知道每个 DE 是如何做到的,但我知道有一种温和的方法可以关闭或重启/关闭/休眠你的系统,而不需要 root 权限。你可以找到原始帖子在 Arch Linux 论坛帖子中。本质上,它相当于发出这些命令:
停
#!/bin/bash
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit"/org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
重启
#!/bin/bash
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart
dbus-暂停
#!/bin/bash
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
休眠
#!/bin/bash
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Hibernate
我猜 GUI 按钮大概使用这些命令。要确定,应该查看代码,但我相信这是安全的选择。
答案2
此设计决策背后的原因不是技术性的(您可以shutdown
在 GUI 中使用非特权命令或要求输入密码)。
当使用桌面环境时,用户应该能够物理访问机器。那么最好允许干净关机,而不是让用户按下电源按钮或拔掉电源线。
当使用 shell 时,用户可以是远程用户,为了避免远程关机,需要请求更多权限。
这些不是规则只是默认值基于假设:您可以让本地用户使用 shell,让远程用户使用桌面环境。如果您想选择默认行为,您可以相应地配置您的系统。
答案3
Sudo(超级用户执行)允许系统管理员授予某些用户(或用户组)以 root 身份运行某些(或所有)命令的能力,同时记录所有命令和参数。shutdown -h 命令或 init 0 命令可用于关闭机器。但这两个命令都需要 root 权限才能执行。
位于 /sbin 中的命令必须具有 root 权限才能执行。要查找关机命令的位置,
类型哪个关闭在终端。
希望现在你的疑问已经消除了:)
答案4
以 root 身份,您可以尝试在关机命令上设置粘滞位权限,如下所示:
chmod u+s /sbin/shutdown
完成后,您应该能够以具有以下权限的普通用户身份关机:
/sbin/shutdown