如何授予用户或应用程序访问 /dev/ttyS0 的权限而无需切换到 sudo

如何授予用户或应用程序访问 /dev/ttyS0 的权限而无需切换到 sudo

我正在编写一个访问 /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 总线地址等。

相关内容