1

我有一种情况,我想提升我在 Web 环境中的权限,以便我可以访问串行设备。

具体情况是我有一个用于配置调制解调器的 Web 界面/dev/ttyUSB[0-9]

最终用户将插入零个或多个调制解调器。我正在编写一些软件,该软件能够通过/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 或软件。
4

5 回答 5

2

在这种情况下,我会编写一个由系统用户运行的守护进程,它接受套接字连接并将它们中继到适当的设备,然后使用 Web 应用程序中的套接字与守护进程对话。这也有助于在打开尚未准备好与用户打交道的设备时防止 Web 应用程序阻塞,比使用 CGI 更理智地解决锁定等问题。

但是,如果您希望应用程序能够直接与设备对话,请授予它们与 null 相同的权限。

于 2009-03-10T07:48:12.573 回答
2

还有另一种方法:Unix/Linux 允许通过 Unix 套接字发送文件描述符。甚至还有一个 Perl 模块:PassAccessRights.pm。没有找到类似的 Python 模块,但可以轻松实现。

于 2009-03-10T10:18:07.177 回答
1

“对于应该拥有尽可能少权限的用户(例如 nobody )在 dev 中打开文件的最佳方式是什么?”

实际上,您最好在 Web 应用程序的守护程序模式下使用 mod_wsgi。mod_wsgi 用户可以是您提供的任何用户名(和组)。

您可以以具有适当定义权限的用户身份运行。

请参阅http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess

于 2009-03-10T09:54:11.087 回答
1

如果允许通过 Web 界面进行的每次访问都允许对设备进行相同的访问,则配置udev规则以将新设备chgrp为nobody 。这是我在文件 /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代替dialout。此特定规则假定设备名称为/dev/ttyUSB2,但您可以大大扩展该规则,请参阅udev文档。

于 2009-03-11T22:02:29.767 回答
-1

sudo 的想法是可能的。IIRC,您可以将特定命令设置为 sudo-able,但不需要密码。

另一种选择是放入nobody一个可以访问所需设备的组,或者将 Apache 作为可以访问的组启动。

如果您使用的是 fastcgi(或等效),我认为您可以让它以拥有用户的身份运行脚本(一些共享主机会这样做)。

要更改 中文件的权限/dev,只需 chmod 它们。

于 2009-03-10T05:34:16.577 回答