我有一种情况,我希望提升我在Web环境中的权限,以便我可以访问串行设备。
具体情况是我有一个用于配置/dev/ttyUSB[0-9]
上出现的调制解调器的Web界面。
最终用户将插入零个或多个调制解调器。我正在编写一些能够识别USB无线调制解调器的软件,方法是阅读/sys/devices
并使用一些AT命令与调制解调器通信。
我希望能够打开设备并执行以下操作:
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正确执行此操作的说明,我们非常感谢!)答案 0 :(得分:2)
在这种情况下,我会编写一个由接受套接字连接并将它们转发到相应设备的系统用户运行的守护程序,然后使用Web应用程序中的套接字与守护进程通信。这也有助于防止Web应用程序在打开尚未准备好与用户打交道的设备时阻止,使用CGI等方式更好地解决锁定。
但是,如果您希望让应用程序能够直接与设备通信,请为其提供与null相同的权限。
答案 1 :(得分:2)
还有另一种方法:Unix / Linux允许通过Unix套接字发送文件描述符。甚至还有一个Perl模块:PassAccessRights.pm。没有为Python找到类似的模块,但它可以很容易地实现。
答案 2 :(得分:1)
“用户的最佳方式是什么,例如没有人应该拥有尽可能少的权限来在dev中打开文件?”
实际上,最好在守护进程模式下为web应用程序使用mod_wsgi。 mod_wsgi用户可以是您提供的任何用户名(和组)。
您可以以具有适当定义权限的用户身份运行。
请参阅http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess
答案 3 :(得分:1)
将 udev 规则配置为 chgrp 新设备 nobody ,如果允许通过Web界面进行的每次访问都是可接受的同样访问设备。以下是我在文件 /etc/udev/rules.d/99-bpw.rules 中的 eee-bpw 包中的内容。
# Sierra Wireless AirCard 880 U
BUS=="usb", KERNEL=="ttyUSB2*", ACTION=="add", \
PRODUCT=="1199/6855/0", DEVNAME=="/dev/tts/USB2", \
OWNER="root", GROUP="dialout", \
SYMLINK+="bpw", RUN="/usr/sbin/bpw"
替换 nobody 代替拨出。此特定规则假定设备名称为 / dev / ttyUSB2 ,但您可以大大扩展规则,请参阅 udev 文档。
答案 4 :(得分:-1)
sudo的想法是可能的。 IIRC,您可以将特定命令设置为sudo-able,但无需密码。
另一个选项是将nobody
放入可以访问所需设备的组中,或者将Apache作为具有访问权限的组启动。
如果您正在使用fastcgi(或者等效),我认为您可以让它作为拥有用户运行脚本(某些共享主机执行此操作)。
要更改/dev
中文件的权限,只需修改它们。