为什么我们需要在终端root用于关闭和重启?

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

通过gui提示

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

 $ reboot reboot: Need to be root $ shutdown now shutdown: Need to be root 

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

齿轮菜单

为什么会出现这种差异?

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

  Stop the system System policy prevents stopping the system  no yes   

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的每个人都可以关闭您的计算机。

Ubuntu是GNU / Linux Operationg系统的发行版,后者又属于Unix系统系列 – 这是许多现代操作系统的通用架构。

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

在当代桌面系统中,开发人员已经经历了某些痛苦,以便仅为桌面用户提供关闭。 一种常见的技术是让登录管理器(通常在root用户的安全上下文中运行)处理关闭和重新启动。 在这种情况下,图形shell向登录管理器发出请求以关闭计算机。 这涉及使用进程间通信(IPC),通常通过dbus服务。

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

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

在任何情况下,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具有其携带的数据的结构化视图,并以二进制forms处理数据; 各种宽度,字符串等的整数。 因为数据不仅仅是D-Bus的“原始字节”,所以可以validation消息。

– 免费桌面

为什么shutdown命令只检查是否有人登录? 说实话,这似乎是一种无私的特征。 我可以想象它有时会节省时间,但通常首选一致的控制台。 我不希望命令在运行后有时需要密码,有时则不需要。

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

对于shell中的用户,您可能会远程登录,因此系统要求您以root用户身份登录才能发出shutdown命令。 这可以防止登录到服务器的普通用户在其他人正在使用它时将其关闭,并且在那里不一定有任何人在那里启动计算机备份。

关闭不提供超级用户密码的GUI提示的原因可能只是在那里没有真正的实用工具 – 如果你在控制台上,出现提示,你可以只使用cog-改为wheeel菜单。 如果您想要关闭超级用户密码的命令行提示符,那么“sudo shutdown”已经可以使用。

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

同样也有Halt和PowerOff命令。