Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Web环境中文件访问的权限提升_Python_Linux_Permissions_Serial Port_Cgi - Fatal编程技术网

Python Web环境中文件访问的权限提升

Python Web环境中文件访问的权限提升,python,linux,permissions,serial-port,cgi,Python,Linux,Permissions,Serial Port,Cgi,我想提升我在web环境中的权限,以便可以访问串行设备 具体情况是,我有一个web界面,用于配置出现在/dev/ttyUSB[0-9]上的调制解调器 最终用户将插入零个或多个调制解调器。我正在编写一些软件,通过读取/sys/devices并使用一些AT命令与调制解调器通话,能够识别哪一个是USB无线调制解调器 我希望能够打开设备并执行以下操作: ser = serial.Serial(tty, baudrate=115200, timeout=10) ser.write('AT+CGSN\r\n'

我想提升我在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
,但它是作为
无人
用户来做的,这是没有特权的

此系统上的串行端口归root:uucp所有,并设置为0660(即
rw-rw--


对于像
nobody
这样应该拥有尽可能少的权限在dev中打开文件的用户来说,最好的方法是什么

我会考虑以下建议:

  • 使用
    sudo
    在子流程中执行操作
  • 更改
    /dev/
    中文件的权限(非常感谢有关如何正确使用udev执行此操作的说明!)
  • 使用我没有考虑过的另一个API或软件

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

      另一个选项是将
      nobody
      放入有权访问所需设备的组中,或者启动Apache作为有权访问的组

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


      要更改
      /dev
      中文件的权限,只需对其进行chmod。

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

      另一个选项是将
      nobody
      放入有权访问所需设备的组中,或者启动Apache作为有权访问的组

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


      要更改
      /dev
      中文件的权限,只需对其进行chmod。

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


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

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

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

      对于用户来说,什么是最好的方法,例如没有人应该拥有尽可能少的权限在dev中打开文件

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

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

      请参阅

      “对于像nobody这样的用户来说,在dev中打开文件的权限应该尽可能少的最好方法是什么?”

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

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


      请参见

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

      还有另一种方法:Unix/Linux允许通过Unix套接字发送文件描述符。甚至还有一个Perl模块用于此:。没有找到类似的Python模块,但它可以很容易地实现。

      如果允许通过web界面进行的每次访问都可以对设备进行相同的访问,则可以配置一个udev规则,使新设备不被任何人访问。下面是我在文件/etc/udev/rules.d/99-bpw.rules中放入eee bpw包的内容

      无人代替拨号。此特定规则假定设备名称为/dev/ttyUSB2,但您可以大大扩展此规则,请参阅udev文档。

      配置udev规则,以向任何人共享新设备,前提是允许通过web界面进行的每次访问都对设备进行相同的访问。下面是我在文件/etc/udev/rules.d/99-bpw.rules中放入eee bpw包的内容


      无人代替拨号。此特定规则假定设备名为/dev/ttyUSB2,但您可以对该规则进行相当大的扩展,请参阅udev文档。

      糟糕,其目的是让用户保持无特权。如果我想以不同的用户身份运行web脚本,我会这样做。这个想法是给用户尽可能少的功能。正确。使用mod_wsgi用户名和组,您可以给他们尽可能少的权限。我已经有了一个权限很少的用户。我想在单个上下文中给他们稍微多一点权限,而不是提升每个python web脚本的权限。我不明白你为什么认为这是
      # 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"