You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据KDE登录及屏幕锁定状态自动调整kernel.deny_new_usb参数

如何根据KDE登录及屏幕锁定状态自动调整kernel.deny_new_usb参数

嘿,我完全懂你的需求——不想靠一直轮询来切换USB的禁用状态,毕竟那样太费电池了,尤其是用笔记本的时候。其实KDE本身就提供了DBus信号来传递登录、登出、屏幕锁定/解锁的状态,咱们可以利用这个来做触发,只有状态变化时才执行操作,完美解决省电的问题!

核心思路

不用定时轮询检查状态,而是监听KDE通过DBus发送的状态变化信号:当收到「用户登录」「屏幕解锁」信号时,把kernel.deny_new_usb设为0;收到「用户登出」「屏幕锁定」信号时,设为1。这种事件驱动的方式几乎不消耗额外资源,完全不用担心电池问题。

第一步:编写状态监听脚本

先创建一个shell脚本,比如/usr/local/bin/usb-auto-control.sh,内容如下:

#!/bin/bash

# 定义设置USB禁用状态的函数
set_usb_deny() {
    local status=$1
    # 记录操作日志到系统日志文件,方便排查问题
    echo "$(date): Setting kernel.deny_new_usb=$status" >> /var/log/usb-control.log
    sysctl -w kernel.deny_new_usb=$status
}

# 处理不同信号的回调逻辑
handle_signal() {
    local signal=$1
    case $signal in
        "SessionLoggedIn")
            set_usb_deny 0
            ;;
        "SessionLoggedOut")
            set_usb_deny 1
            ;;
        "ScreenLocked")
            set_usb_deny 1
            ;;
        "ScreenUnlocked")
            set_usb_deny 0
            ;;
    esac
}

# 监听KDE的DBus信号:屏幕锁定/解锁、会话登录/登出
dbus-monitor --session "type='signal',interface='org.kde.ScreenSaver'" "type='signal',interface='org.kde.SessionManager'" | while read -r line; do
    if echo "$line" | grep -q "SessionLoggedIn"; then
        handle_signal "SessionLoggedIn"
    elif echo "$line" | grep -q "SessionLoggedOut"; then
        handle_signal "SessionLoggedOut"
    elif echo "$line" | grep -q "Locked"; then
        handle_signal "ScreenLocked"
    elif echo "$line" | grep -q "Unlocked"; then
        handle_signal "ScreenUnlocked"
    fi
done

然后给脚本加上可执行权限:

sudo chmod +x /usr/local/bin/usb-auto-control.sh

第二步:配置systemd服务让脚本开机自启

因为修改kernel.deny_new_usb需要root权限,咱们用systemd来管理这个脚本,让它以root身份开机自动运行。

创建一个systemd服务文件/etc/systemd/system/usb-auto-control.service,内容如下:

[Unit]
Description=Auto adjust kernel.deny_new_usb based on KDE session state
After=graphical.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/usb-auto-control.sh
Restart=on-failure
# 把日志输出到systemd日志系统,方便查看
StandardOutput=journal+console

[Install]
WantedBy=graphical.target

然后执行以下命令启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable usb-auto-control.service
sudo systemctl start usb-auto-control.service

一些额外注意事项

  • 初始状态:开机时默认没有用户登录,kernel.deny_new_usb会保持你在/etc/sysctl.d/params.conf里设置的1,符合你的需求;当用户登录后,脚本会收到SessionLoggedIn信号,自动把参数改成0。
  • 测试验证:你可以手动运行脚本,然后尝试登录/登出、锁定/解锁屏幕,通过sysctl kernel.deny_new_usb命令查看参数是否变化,也可以用journalctl -u usb-auto-control.service查看服务日志。
  • DBus依赖:dbus-monitor一般是KDE桌面默认安装的,如果你的系统里没有,可以用包管理器安装(比如Debian/Ubuntu系用sudo apt install dbus-x11)。

备注:内容来源于stack exchange,提问作者deniable_encryption

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:44:28