我正在编写一个访问 /dev/ttyS0 的 python 应用程序。脚本运行时,它会拒绝访问 /dev/ttyS0 的权限。
PermissionError:[Errno 13] 权限被拒绝:'/dev/ttyS0'
我尝试修改权限,但仍然出现错误。我在 Ubuntu 22.04 和 python3 上运行此脚本。如果我切换到 sudo su,但不想以 su 身份运行,脚本就会起作用
lrwxrwxrwx 1 root root 10 Jan 1 20:35 /dev/ttyS0 -> /dev/pts/4
我也尝试将用户添加到 root 组
getent group 0
root:x:0:tk
我还遗漏了什么?
Python 脚本
import serial
ser = serial.Serial(
port='/dev/ttyS0',
baudrate=115200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.SEVENBITS,
)
ser.isOpen()
答案1
你已经看过了符号链接权限,而您需要查看目标权限。这些权限将是“ 0660 root:dialout
”。将用户放入dialout
组将允许他们访问全部系统上的 TTY 设备。
这可能太多了,这取决于您的需求和安全要求。如果您想精确定位/dev/ttyS0
,您需要添加自己的udev 规则这将为该设备分配所需的权限,而不是使用默认值。定义默认权限的现有机器位于/lib/udev/rules.d/50-udev-default.rules
:
...
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
KERNEL=="tty[A-Z]*[0-9]|ttymxc[0-9]*|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"
...
您可以创建一个专用组和一个/etc/udev/rules.d/99-your-name.rules
包含以下行的文件:
KERNEL=="ttyS0", GROUP="dedicated-group", MODE="0666"
这将在该设备上设置自定义权限。我懒得彻底测试,但这是应该采取的方式。
请注意。不同的设备可能会收到此名称,具体取决于初始化期间的随机竞争。依赖始终正确的设备并不安全ttyS0
。更安全的是参考其他属性,如序列号、PCI 总线地址等。