我有一种情况,我想提升我在网络环境中的权限,以便我可以访问串行设备。
具体情况是我有一个用于配置 /dev/ttyUSB[0-9]
上出现的调制解调器的 Web 界面。
最终用户将插入零个或多个调制解调器。我正在编写一些软件,能够通过读取 /sys/devices
并使用一些 AT 命令与调制解调器通信来辨别哪个是 USB 无线调制解调器。
我希望能够打开设备并执行如下操作:
ser = serial.Serial(tty, baudrate=115200, timeout=10)
ser.write('AT+CGSN\r\n')
imei = ser.readline()
问题是 pyserial
这样做:self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK)
到打开串行端口,其中 portstr 是 /dev/ttyUSB0
,但它是以 nobody
用户身份执行的,这是无特权的。
此系统上的串行端口由 root:uucp 拥有并设置为 0660(即 rw-rw-----
)。
对于像 nobody
这样应该拥有尽可能少的权限的用户来说,在 dev 中打开文件的最佳方式是什么?
我会考虑的想法:
- 使用
sudo
在子进程中执行操作。 - 更改
/dev/
中文件的权限(有关如何使用 udev 正确执行此操作的说明非常感谢!) - 使用我未考虑过的其他 API 或软件。
最佳答案
在这种情况下,我会编写一个由系统用户运行的守护程序,它接受套接字连接并将它们中继到适当的设备,然后使用 Web 应用程序中的套接字与守护程序对话。这也有助于防止 Web 应用程序在打开尚未准备好与用户打交道的设备时发生阻塞,比使用 CGI 等更理智地解决锁问题。
但是,如果您希望应用程序能够直接与设备对话,请为它们提供与 null 相同的权限。
关于python - Web 环境中的文件访问权限提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/628956/