如何在Ubuntu中将USB HID条码扫描器输出重定向至/dev/tty设备?
嘿,这个需求我之前帮朋友折腾过,其实核心是把模拟键盘的USB-HID扫描器输入重定向到指定tty设备,下面分步骤给你讲清楚怎么实现:
第一步:定位你的USB-HID扫描器对应的输入设备
这类扫描器本质是个虚拟键盘,系统会把它识别为一个输入事件设备,先找到它的路径:
- 运行
ls /dev/input/by-id/,找带kbd或usb关键字的设备(比如usb-XXX-event-kbd),这个就是扫描器对应的事件设备。 - 或者装个
evtest工具(sudo apt install evtest),运行后会列出所有输入设备,逐个选择测试,扫描条码时能看到事件输出的就是目标设备,记下它的路径(比如/dev/input/eventX)。
第二步:将扫描器输入重定向到目标tty
这里有几种实用方法,根据你的场景选:
方法1:用evemu工具(推荐,稳定可靠)
evemu专门用来处理输入事件的转发,能完美把扫描器的键盘事件转换成字符流输出到tty:
- 先安装evemu:
sudo apt install evemu - 确认目标tty设备存在(比如
/dev/ttyUSB0或/dev/ttyS0),如果权限不够,临时给读写权限:sudo chmod 666 /dev/ttyXXX,或者把当前用户加入dialout组(sudo usermod -aG dialout $USER,需重新登录)。 - 运行转发命令:
把sudo evemu-record /dev/input/eventX | evemu-play /dev/ttyXXXeventX换成你找到的扫描器设备路径,ttyXXX换成目标tty路径就行。
方法2:直接重定向字符流(适合简单场景)
如果你的扫描器会直接输出ASCII字符到stdout(部分扫描器支持这种模式),可以直接用cat重定向:
sudo cat /dev/input/eventX > /dev/ttyXXX
⚠️ 注意:/dev/input/eventX是原始事件流,不是直接的ASCII字符,所以这种方法可能需要额外转码工具(比如input-event-codes配合脚本),不如evemu省心。
方法3:用udev规则实现自动转发(开机/插设备自动生效)
如果需要扫描器一插入就自动重定向,写个udev规则:
- 创建规则文件:
sudo nano /etc/udev/rules.d/99-barcode-scanner.rules - 写入以下内容(替换成你的扫描器厂商ID、产品ID和目标tty):
厂商ID和产品ID可以用SUBSYSTEM=="input", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="YYYY", RUN+="/usr/bin/evemu-record /dev/input/%k | evemu-play /dev/ttyUSB0 &"lsusb命令查到(比如Bus 001 Device 005: ID XXXX:YYYY ...)。 - 重新加载udev规则:
sudo udevadm control --reload-rules && sudo udevadm trigger
第三步:验证重定向效果
用阻塞模式打开目标tty(比如cat /dev/ttyXXX,或者你的程序),然后扫描条码,应该能看到条码内容正常出现在tty的输出里。
额外注意事项
- 如果扫描器同时输出到终端和tty,你可以禁用它作为系统键盘的功能:在X环境下用
xinput disable <device-id>(xinput list找设备ID),或者在udev规则里添加ENV{ID_INPUT_KEYBOARD}="0"来阻止系统识别它为键盘。 - 无GUI的服务器环境下,evemu的转发效果最稳定,不需要处理X窗口的输入事件干扰。
内容的提问来源于stack exchange,提问作者WallPoster




