如何使关机不需要管理员密码?

如果我的电脑上有多个用户登录,Ubuntu在关闭电脑时会要求超级用户进行身份验证。我该如何设置让任何用户都能在不需要密码的情况下关闭电脑?

3+1 我怀疑在家用电脑上输入密码来关机会让很多用户感到烦恼。 - Richard Holloway
7如果你在其他人登录的情况下关闭电脑,他们打开的窗口会怎样?他们打开的文档呢?我认为任何没有自动保存的内容都会被简单地丢失。这是值得考虑的事情。 - Torben Gundtofte-Bruun
Ubuntu在关闭计算机时需要超级用户身份验证。但在Ubuntu 11.10中,当使用菜单关机时,它不会要求超级用户授权,而只是像注销一样返回到登录页面。您可以参考这个问题:http://askubuntu.com/q/64073/11995。我想知道如何配置Ubuntu让我输入超级用户密码? - Mikl
1对于14.04及更高版本,请参考http://askubuntu.com/questions/454039/what-command-is-executed-when-shutdown-from-the-graphical-menu-in-14-04 - Takkat
9个回答

Richard Holloway's answer实际上并不是PolickKit授权的正确方式。安装在/usr/share/polkit-1/actions下的文件不应该被修改。相反,您应该修改/etc/polkit-1/localauthority/50-local.d/下的权限。

以下是如何针对此问题进行操作:

创建一个名为/etc/polkit-1/localauthority/50-local.d/allow_all_users_to_shutdown.pkla的文件,并使用sudoedit进行编辑,使其看起来像这样:

[Allow all users to shutdown]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.stop-multiple-users
ResultInactive=no
ResultActive=yes

然后在同一个目录中创建另一个名为.pkla的文件。可以使用任何以.pkla结尾的名称,例如allow_all_users_to_restart.pkla,并将其填充以下内容:
[Allow all users to restart]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.restart-multiple-users
ResultInactive=no
ResultActive=yes

参考资料:


这事实际上成为了一个非常奇怪问题的解决方案。在12.04版本中安装PowerBroker(用于认证到Active Directory)后,用户无法通过GUI重新启动或关闭计算机(无论是lightdm还是indicator-session都不起作用。它只会返回到登录界面)。在将这些权限添加到policykit后,一切正常运行。 - korylprince
人pklocalauthority在Ubuntu中有这个信息。 - Konstigt
8请注意,现在名称已更改!这是从14.04的内容:/usr/share/polkit-1/actions$ grep multiple * org.freedesktop.login1.policy: <action id="org.freedesktop.login1.power-off-multiple-sessions"> org.freedesktop.login1.policy: <action id="org.freedesktop.login1.reboot-multiple-sessions"> org.freedesktop.login1.policy: <action id="org.freedesktop.login1.suspend-multiple-sessions"> org.freedesktop.login1.policy: <action id="org.freedesktop.login1.hibernate-multiple-sessions"> - Konstigt
5对于16.04版本,除了@Konstigt所做的更改之外,我发现文件必须放在/var/lib/polkit-1/localauthority/50-local.d目录下,并且两个文件都需要添加额外的一行ResultAny=yes。现在我只会收到一个警告信息:“无法设置墙壁消息,忽略:需要交互式身份验证。”但是现在关机和重启功能正常运作。 - sigalor
1@sigalor的评论对我有用,但需要补充说明的是sysctl poweroff -i需要org.freedesktop.login1.power-off-multiple-sessions权限,所以我创建了一个单独的文件,其中包含相同的行,只是将Action=org.freedesktop.login1.power-off-multiple-sessions添加进去。 - wickedchicken

你不需要绕过,只需更改策略以允许您在多个用户登录时无需身份验证即可关闭和重启。

使用您喜欢的文本编辑器编辑文件 /usr/share/polkit-1/actions/org.freedesktop.consolekit.policy。您将需要root权限。

将与其他用户登录时关闭相关的部分更改为

  <action id="org.freedesktop.consolekit.system.stop-multiple-users">
    <description>Stop the system when multiple users are logged in</description>
    <message>System policy prevents stopping the system when other users are logged in</message>
    <defaults>
      <allow_inactive>no</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
  </action>

  <action id="org.freedesktop.consolekit.system.stop-multiple-users">
    <description>Stop the system when multiple users are logged in</description>
    <message>System policy prevents stopping the system when other users are logged in</message>
    <defaults>
      <allow_inactive>no</allow_inactive>
      <allow_active>yes</allow_active>
    </defaults>
  </action>

重新启动时,他人已登录的相关部分。
  <action id="org.freedesktop.consolekit.system.restart-multiple-users">
    <description>Restart the system when multiple users are logged in</description>
    <message>System policy prevents restarting the system when other users are logged in</message>
    <defaults>
      <allow_inactive>no</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
  </action>

  <action id="org.freedesktop.consolekit.system.restart-multiple-users">
    <description>Restart the system when multiple users are logged in</description>
    <message>System policy prevents restarting the system when other users are logged in</message>
    <defaults>
      <allow_inactive>no</allow_inactive>
      <allow_active>yes</allow_active>
    </defaults>
  </action>

这将允许您在多个用户登录时关闭和重新启动计算机。 是否要这样做是一个不同的问题。

1这里有一个链接,详细介绍了PolicyKit:http://hal.freedesktop.org/docs/PolicyKit/polkit-conf.html - Richard Holloway
这是为了解决在Gnome中关闭系统时被要求输入密码的问题。 - Richard Holloway
5每当重新安装或升级polkit时,你的更改不会被清除吗? - Ryan C. Thompson
哇,天啊,太棒了!我之前完全不知道有关PolicyKit的事情。 - jathanism
@Ryan,那完全取决于它的包装方式。个人而言,我不太清楚,但我怀疑你是对的。 - Richard Holloway
每当我需要修改属于某个软件包的文件时,我会使用apt-src获取其源代码,然后在源代码中进行修改,接着编译它,最终生成的软件包就会包含我所需的更改。 - Ryan C. Thompson
3@Ryan,根据https://wiki.ubuntu.com/SecurityTeam/PolicyKitPermissions/12.04,你可以在/etc/polkit-1/localauthority目录下编写一个.pkla文件,但是我对它的语法不太确定 :)(这里有一些信息https://wiki.archlinux.org/index.php/PolicyKit#Authorities)。 - Joril
1以下来自Flimm的答案更好,在更新期间不会被覆盖。 - Konstigt
1如何在不重新启动的情况下重新加载规则? - Suncatcher

有一种更好的方法。如果你已经安装了dbus-send,你可以通过dbus关机而无需提升为root权限
我记不清文档所在的页面了,但是有一个Archlinux用户找到了这个方法。
关机:
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
          /org/freedesktop/Hal/devices/computer \
          org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

重启:
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
          /org/freedesktop/Hal/devices/computer \
          org.freedesktop.Hal.Device.SystemPowerManagement.Reboot

挂起:
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
          /org/freedesktop/Hal/devices/computer \
          org.freedesktop.Hal.Device.SystemPowerManagement.Suspend int32:1

休眠:

dbus-send --system --print-reply --dest=org.freedesktop.Hal \
          /org/freedesktop/Hal/devices/computer \
          org.freedesktop.Hal.Device.SystemPowerManagement.Hibernate

致敬。


哇,那真是...有点粗糙。厉害,但有点粗糙... - jathanism
1关机和重启在11.10中似乎不再起作用了。 - Mikl
@Mikl 试着安装hal(sudo apt-get install hal) - esamatti

HAL 似乎已经过时,并且在最新的 Ubuntu 发行版中没有安装。

您必须使用 ConsoleKitUPower dbus 服务来管理电源状态

关机:

dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

重新启动:
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart

暂停:
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend

休眠:
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Hibernate

感谢Arch Linux的支持论坛
目前在Precise和Quantal版本上运行良好,但不确定能持续多久,因为Freedesktop似乎将重点从ConsoleKit转移到systemd。不知道Canonical是否关心这个问题...

这适用于14.04版本。这是之前那个正确的Flimm的回答的更新版本,我个人认为。
sudo mkdir -p /etc/polkit-1/localauthority/50-local.d
sudoedit /etc/polkit-1/localauthority/50-local.d/allow_all_users_to_shutdown_reboot_suspend.pkla 

将此粘贴到内部:

[Allow all users to shutdown]
Identity=unix-user:*
Action=org.freedesktop.login1.power-off-multiple-sessions
ResultActive=yes

[Allow all users to reboot]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot-multiple-sessions
ResultActive=yes

[Allow all users to suspend]
Identity=unix-user:*
Action=org.freedesktop.login1.suspend-multiple-sessions
ResultActive=yes

[Allow all users to ignore inhibit of shutdown]
Identity=unix-user:*
Action=org.freedesktop.login1.power-off-ignore-inhibit
ResultActive=yes

[Allow all users to ignore inhibit of reboot]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot-ignore-inhibit
ResultActive=yes

[Allow all users to ignore inhibit of suspend]
Identity=unix-user:*
Action=org.freedesktop.login1.suspend-ignore-inhibit
ResultActive=yes

3我必须在Ubuntu 18.04上将ResultActive替换为ResultAny - lights0123
我还需要添加Action=org.freedesktop.login1.power-offAction=org.freedesktop.login1.rebootAction=org.freedesktop.login1.suspend的块。 - klugerama

在其他用户登录的情况下重新启动,除非打开一个终端窗口并以root身份输入reboot命令,否则无法绕过超级用户密码提示:

sudo reboot

即便如此,如果未配置绕过用户帐户的密码提示,sudo 也会要求您输入密码。
不用担心,这些都是好事。重新启动应该很少发生,而简单的管理员密码提示可以避免意外损坏!

你还可以编辑visudo,让你的用户在输入sudo时不需要输入密码。 - Da1T


我相信这只是在通过命令行执行时出现的问题。
如果是这样,这里有一个链接可以帮助解决你的问题。

不,如果在关闭计算机时有其他用户登录,则会弹出一个窗口要求输入管理员密码。使用图形用户界面。 - Isaiah

显然,你可以从图形界面关闭计算机而不需要root权限,因为gdm是以root身份运行的。Gnome告诉gdm关闭计算机,然后gdm执行关闭操作。
使用脚本也可以实现类似的功能。我不确定你对BASH的熟悉程度如何,但我相信可以编写一个作为root运行的脚本,在接收到特定信号时执行关机命令。
请记住,这可能存在安全问题。

我认为他可能遇到的问题是出现的提示,提示其他人仍然登录,并需要sudo密码来启用关机/重启。 - David Thomas