我意识到有关电源按钮选项有几个问题,但这有点不同。
在我与家人共享的系统上,我已从设备菜单禁用关机,用户只能注销。电源是单独管理的,以防止在 SSH 处于活动状态或有人正在流式传输到电视等情况下意外关机。相反,计算机会监控登录和连接,并在 20 分钟不活动后进入睡眠状态。我已通过添加以下内容禁用关机:
[Disable lightdm PowerMgmt]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot;org.freedesktop.login1.reboot-multiple-sessions;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;org.freedesktop.login1.suspend;org.freedesktop.login1.suspend-multiple-sessions;org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=no
ResultInactive=no
ResultActive=no
到 /etc/polkit-1/localauthority/50-local.d/disable-shutdown.pkla
一切按预期进行。
然而,我想在按下电源按钮本身时覆盖此策略 - 有时有人希望计算机立即关闭或重新启动或挂起,而忽略管理软件。我想电源按钮不是您可能会意外按下的东西。我可以更改 Polkit 策略中的某些内容以在按下电源按钮时允许这些操作,但在其他情况下禁止这些操作?用户通常不是管理员帐户,因此他们无法使用 sudo 进行身份验证以强制关机。我知道我可以让电源按钮立即触发关机,但我仍然希望 Ubuntu 菜单询问用户要执行哪些操作(关机、重新启动、睡眠,就像未禁用时的菜单中一样),而不仅仅是立即关机。
如果在 Polkit 中无法实现,有没有办法在按下电源按钮时显示正常的 Ubuntu 电源选项菜单,但以超级用户身份运行它?
答案1
好吧,我找到了一个效果很好的解决方案,至少对我来说是这样。我运行的是 Ubuntu 14.04。我还没有对它进行广泛的测试,但它似乎能完成工作。如果您发现问题,请发表评论。
创建 Polkit 规则
在终端中运行此命令:
gksudo gedit /etc/polkit-1/localauthority/50-local.d/disable-shutdown.pkla
并将其复制到其中:
[Disable shutdown/reboot]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot;org.freedesktop.login1.reboot-multiple-sessions;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;
ResultAny=no
ResultInactive=no
ResultActive=no
保存并关闭,然后运行此命令:
gksudo gedit /etc/polkit-1/localauthority/50-local.d/disable-suspend.pkla
并将其粘贴到其中:
[Disable suspend/hibernate]
Identity=unix-user:*
Action=org.freedesktop.upower.suspend;org.freedesktop.upower.hibernate;org.freedesktop.login1.suspend;org.freedesktop.login1.suspend-multiple-sessions;org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=no
ResultInactive=no
ResultActive=no
保存并关闭。
这两个文件将告诉 Ubuntu 不允许任何用户启动关机、重启、挂起或休眠操作。如果需要,可以修改这些文件以仅禁用其中一些操作。
编辑 powerbtn.sh
运行此命令来编辑按下电源按钮时运行的脚本:
gksudo gedit /etc/acpi/powerbtn.sh
在第 6 行左右插入以下内容:
initctl emit power-button-press
该文件的顶部现在应如下所示:
#!/bin/sh
# /etc/acpi/powerbtn.sh
# Initiates a shutdown when the power putton has been
# pressed.
initctl emit power-button-press
[ -r /usr/share/acpi-support/power-funcs ] && . /usr/share/acpi-support/power-funcs
# If logind is running, it already handles power button presses; desktop
# environments put inhibitors to logind if they want to handle the key
# themselves.
if pidof systemd-logind >/dev/null; then
exit 0
fi
这样做的目的是发出一个信号,Upstart 将使用该信号(我们接下来会讲到)来更改关机操作的权限。它不会阻止正常的电源按钮按下过程,因此您仍然会看到通常的 Ubuntu Unity 关机菜单(或者至少我看到了 :P )
保存并关闭 gedit。
创建 Upstart 作业
我读到过一篇文章,说 Ubuntu 会在接下来的几个版本中转向 systemd 而不是 Upstart,所以这在 14.04 上是可行的,但可能不适用于此后的版本
在终端中运行此命令:
gksudo gedit /etc/init/power-button-pressed.conf
这将创建一个新文件,该文件将成为按下电源按钮时运行的任务。
将以下内容复制到其中:
description "Allow shutdown when power button is pressed"
start on power-button-press
stop on shutdown
emits power-button-timeout
task
script
mv /etc/polkit-1/localauthority/50-local.d/disable-shutdown.pkla /etc/polkit-1/localauthority/50-local.d/disable-shutdown.ignore 2> /dev/null
mv /etc/polkit-1/localauthority/50-local.d/disable-suspend.pkla /etc/polkit-1/localauthority/50-local.d/disable-suspend.ignore 2> /dev/null
sleep 1m
initctl emit power-button-timeout
end script
pre-stop script
initctl emit power-button-timeout
end script
保存并关闭,然后运行:
gksudo gedit /etc/init/power-button-restore.conf
并将其粘贴到其中:
description "Re-disable shutdown, on boot or when signalled"
start on (power-button-timeout or local-filesystems)
task
script
mv /etc/polkit-1/localauthority/50-local.d/disable-shutdown.ignore /etc/polkit-1/localauthority/50-local.d/disable-shutdown.pkla 2> /dev/null
mv /etc/polkit-1/localauthority/50-local.d/disable-suspend.ignore /etc/polkit-1/localauthority/50-local.d/disable-suspend.pkla 2> /dev/null
end script
这些将临时重命名安全策略文件,以便忽略它们,从而允许用户关机、重启、挂起和休眠。当然,您可以根据需要修改它,只启用其中一些。一分钟后,文件将重命名为它们应该有的名称,从而再次禁用用户电源管理。预停止部分应在关机时恢复权限。如果没有,第二个 Upstart 作业将在启动时运行以恢复策略。
就这些了!对于这台机器上的用户,我还从设备菜单中隐藏了关机选项,因此用户只能看到“注销”选项。运行dconf-editor
,导航到“应用程序”>“指示器会话”,然后勾选“suppress-restart-menuitem”和“suppress-shutdown-menuitem”。这对权限没有任何作用,只是有助于避免人们在按下“关机”时感到困惑,而它不起作用。
因此,需要澄清的是,现在按下电源按钮时,用户将看到 Ubuntu 电源菜单,如果已抑制关机和重启,则只会显示注销选项。选择注销,然后从登录屏幕,关机菜单将起作用,计算机可以关闭,仅一分钟。