树莓派:无HDMI显示器时用键盘控制Bash脚本的方案问询
无HDMI连接时用本地键盘控制Bash脚本的解决方案
核心问题分析
你的脚本依赖read命令读取终端输入,但通过SSH启动时,脚本绑定的是远程终端;systemd/rc.local启动时,脚本没有关联到本地键盘对应的输入源,导致无法识别按键或接收无效输入。USB键盘的输入并非通过传统tty设备,而是位于/dev/input/目录下的事件设备。
可行解决方案
1. 定位本地键盘的输入设备
首先找到键盘对应的事件设备路径:
- 安装工具:
sudo apt install evtest - 运行
evtest,会列出所有输入设备,找到标注为你的Jing-Mold键盘的条目,记录对应的/dev/input/eventX(X为数字) - 或者通过
cat /proc/bus/input/devices查找,找到包含ID 05af:8277的段落,Handlers字段中的eventX即为设备路径
2. 修改脚本直接读取键盘事件
替换原有的read命令,直接从键盘输入设备读取按键事件,示例脚本:
#!/bin/bash # 替换为你的键盘设备路径,或后续用udev固定的路径 KEYBOARD_DEV="/dev/input/eventX" # 需root权限读取input设备 while true; do # 读取24字节的输入事件(标准input事件结构) read -r -n 24 EVENT < "$KEYBOARD_DEV" # 解析事件类型、按键码、状态(按下/释放) TYPE=$(echo "$EVENT" | od -t u4 -An | awk '{print $2}') CODE=$(echo "$EVENT" | od -t u4 -An | awk '{print $3}') VALUE=$(echo "$EVENT" | od -t u4 -An | awk '{print $4}') # 仅处理按键按下事件(TYPE=1为按键事件,VALUE=1为按下) if [ "$TYPE" -eq 1 ] && [ "$VALUE" -eq 1 ]; then case "$CODE" in 10) # 这里替换为你的VFD控制逻辑,比如发送串口命令 echo "触发回车操作" ;; 2) echo "触发数字1操作" ;; # 更多按键码参考/usr/include/linux/input-event-codes.h esac fi done
按键码可查看/usr/include/linux/input-event-codes.h,比如KEY_UP为103,KEY_DOWN为108等。
3. 配置systemd服务稳定运行脚本
创建/etc/systemd/system/vfd-keyboard.service文件:
[Unit] Description=VFD Display Keyboard Controller After=multi-user.target [Service] Type=simple User=root ExecStart=/path/to/your/script.sh Restart=always RestartSec=2 [Install] WantedBy=multi-user.target
执行以下命令启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable vfd-keyboard.service sudo systemctl start vfd-keyboard.service
4. 固定键盘设备路径(可选)
为避免重启后设备路径变化,创建udev规则:
新建/etc/udev/rules.d/99-vfd-keyboard.rules:
SUBSYSTEM=="input", ATTRS{idVendor}=="05af", ATTRS{idProduct}=="8277", SYMLINK+="input/vfd-keyboard"
重启后键盘会被固定映射到/dev/input/vfd-keyboard,脚本中可直接使用该路径。
替代方案:绑定到本地虚拟终端
如果偏好使用read命令,可将脚本绑定到本地tty1:
- 修改systemd服务的
ExecStart:
ExecStart=/bin/bash -c "exec /path/to/your/script.sh < /dev/tty1 > /dev/tty1 2>&1"
- 配置tty1自动登录,创建
/etc/systemd/system/getty@tty1.service.d/autologin.conf:
[Service] ExecStart= ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM
重启后脚本会在本地tty1自动运行,键盘输入可直接被read命令捕获。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

