问题描述
在 Ubuntu 20.04 上使用 USB 报警器(CH340 串口设备)时,遇到了以下问题:
- 通过
cutecom
发送指令无响应,可能与权限有关。 - 直接使用
echo
发送指令:
报错:echo -ne "\x7E\xFF\x06\x01\x02\x00\x00\xEF" > /dev/ttyUSB0
bash:/dev/ttyUSB0:权限不够
。 - 使用
sudo
可以成功发送指令:
但 每次开机后,第一次执行需要输入密码,影响自动化操作。echo -ne "\x7E\xFF\x06\xC2\x00\x00\x05\xEF" | sudo tee /dev/ttyUSB0 > /dev/null
解决方案
1. 让 sudo
执行特定命令时免密码(最终选择)
步骤 1:修改 sudoers
文件
运行以下命令:
sudo visudo
在文件底部添加:
yourusername ALL=(ALL) NOPASSWD: /usr/bin/tee /dev/ttyUSB0, /bin/chmod 666 /dev/ttyUSB0
⚠ 注意:
- 把
yourusername
替换为你的实际用户名(可通过whoami
获取)。 - 这样,每次运行
sudo tee /dev/ttyUSB0
或sudo chmod 666 /dev/ttyUSB0
都 不会再要求输入密码。
步骤 2:测试
执行以下命令,不应再要求输入密码:
sudo chmod 666 /dev/ttyUSB0
echo -ne "\x7E\xFF\x06\xC2\x00\x00\x05\xEF" | sudo tee /dev/ttyUSB0 > /dev/null
2. (可选)开机自动赋予 /dev/ttyUSB0
读写权限
如果希望 彻底无需 sudo
,可以让 /dev/ttyUSB0
在开机时自动拥有 666
权限。
方法 1:使用 udev
规则(推荐)
创建 udev 规则,确保设备 /dev/ttyUSB0
自动获得 666 权限。
步骤 1:创建规则文件
sudo nano /etc/udev/rules.d/99-usb-serial.rules
添加以下内容:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666"
⚠ 注意:
idVendor
和idProduct
需要与你的设备匹配,可用lsusb
查看。- 例如,执行
lsusb
后,可能得到:
则Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
idVendor="1a86"
,idProduct="7523"
。
步骤 2:应用规则
sudo udevadm control --reload-rules
sudo udevadm trigger
步骤 3:重新插拔 USB 设备或重启系统,/dev/ttyUSB0
现在应自动获得 666
权限。
方法 2:将用户加入 dialout
组(适用于所有串口设备)
sudo usermod -a -G dialout $USER
newgrp dialout
注销并重新登录,使更改生效。之后 /dev/ttyUSB0
可以直接访问,不再需要 sudo
。
总结
方案 | 适用情况 | 备注 |
---|---|---|
修改 sudoers (最终方案) | 只想省去 sudo 密码,仍用 sudo 执行 | 最快见效,适用于少量命令 |
udev 规则 | 彻底自动化,无需 sudo | 推荐,适用于 固定 USB 设备 |
dialout 组 | 适用于 所有串口设备 | 适合多设备管理,但需重新登录 |
最终,我选择了修改 sudoers
文件,使得 sudo tee /dev/ttyUSB0
不再需要输入密码,从而提升了使用效率。 🎉