如何根据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
相关产品推荐
相关产品推荐

