如何在 KDE Plasma 5 中通过脚本解锁屏幕?

如何在 KDE Plasma 5 中通过脚本解锁屏幕?

我使用 pam_usb,希望在拔出/插入 USB 时锁定/解锁计算机。对于锁定,我使用它qdbus org.freedesktop.ScreenSaver /ScreenSaver Lock,它工作得很好。对于解锁,我尝试了一系列我找到的命令(其中大部分是汇总的这里),但它们不起作用。具体来说,如果我们排除那些使用 KDE 4 语法的,它们分为两类:那些使用qdbus (relevant path here, several variations exists) /MainApplication quit完全挂起我的 Xorg 的,以及那些使用killall屏幕锁定进程的,但进程在那之后会立即重新启动!

所以,我的问题是:如何以编程方式解锁使用其标准储物柜锁定的 KDE5 屏幕?

答案1

这不是我的答案,但对其他人来说可能也有用。
它来自https://forum.kde.org/viewtopic.php?f=289&t=130691#p350000它可以在最新的 archlinux 和 kde 5.7 上运行

loginctl lock-session
loginctl unlock-session

答案2

屏幕锁已损坏,无法解锁。要解锁,请切换到虚拟终端(例如 Ctrl+Alt+F2),登录并执行命令:loginctl unlock-sessions 然后切换回正在运行的会话(Ctrl+Alt+F7)。

上述消息有时会出现在我的笔记本电脑上,该笔记本电脑运行 Gentoo Stable 和 Plasma 5、OpenRC 和 ConsoleKit。我从 TTY1 启动以下脚本成功解锁了 TTY7 上的 X11 会话:

fitzcarraldo@clevow230ss ~ $ cat unlockKDEsession.sh
#!/bin/bash

# Screen locker broken in KDE with ConsoleKit
# See https://forums.gentoo.org/viewtopic-t-1046566.html
# and https://forums.gentoo.org/viewtopic-t-1054134.html

# Find which session is locked
session=Session$(ck-list-sessions | grep -B10 "x11-display = ':0" | grep -o -P '(?<=Session).*(?=:)')

# Create Bash script to unlock session
echo "#!/bin/bash" > /unlock.sh
echo "su -c 'dbus-send --system --print-reply --dest=\"org.freedesktop.ConsoleKit\" /org/freedesktop/ConsoleKit/$session org.freedesktop.ConsoleKit.Session.Unlock'" >> /unlock.sh
chmod +x /unlock.sh

# Run Bash script in another TTY
openvt -s -w /unlock.sh

答案3

在现代 KDE Plasma 上,该命令显然是:

qdbus --system org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/$session Unlock

会话名称可以从

qdbus --literal --system org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Manager \
org.freedesktop.ConsoleKit.Manager.GetSessions | sed 's/^.*\(Session[0-9]*\).*$/\1/'

请注意,可能会有多个会话!GetSession*不过,有多种函数可用于不同的用例。

问题是,所有这些功能当然需要 root!

我不知道如何loginctl规避这种情况,但这表明这是可能的。否则也许你可以使用sudo并允许执行此操作的脚本无需输入密码即可运行

答案4

我已经使用 Evi1M4chine 的配方很长一段时间来在盖子关闭时锁定会话(作为复杂脚本的一部分),如下所示:

for SESSION in $(qdbus --literal --system org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.GetSessions | sed 's/^.*\(Session[0-9]*\).*$/\1/'); do
  dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/$SESSION org.freedesktop.ConsoleKit.Session.Lock
done

但是现代 KDE5/Plasma 放弃了org.freedesktop.ConsoleKit这种方法,导致该方法无效。我花了一些时间试图弄清楚如何将其应用于实际 dbus - 但没有成功。有什么想法可以让它在现代 KDE5/Plasma 上工作吗?

相关内容