【问题标题】:Running system calls from webserver从网络服务器运行系统调用
【发布时间】:2023-05-26 01:19:01
【问题描述】:

我正在尝试从 cgi python 脚本运行标准的 python os.system 调用。 这是教程的一部分,因此脚本非常简单。我正在尝试使用 Raspberry Pi 相机拍照并将其显示在网页中。

import os, sys

os.system('raspistill -o /var/www/images/image.jpg')

print "Content-type:text/html\r\n\r\n"
print '<html>'
print '<head>'
print '<title>Hello Word - First CGI Program</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! This is my first CGI program</h2>'
print '<img src="/var/www/images/image.jpg"/>'
print '</body>'
print '</html>'

运行系统命令(在浏览器中打开)时遇到的错误是:
* 未能打开 vchiq 实例”

我看到了另一个关于此的问题,它说 http 守护程序以错误的用户身份运行,但我不确定这意味着什么。 当我以标准用户身份运行脚本时,脚本运行良好。

【问题讨论】:

    标签: python raspberry-pi lighttpd


    【解决方案1】:

    大多数网络服务器都与网络服务器的用户一起运行。例如,Apache2 作为 www-data 运行。 计算机中的所有文件都有所有权和权限数据,这些数据将允许或禁止来自不同用户的某些操作 - 例如,只有超级用户 (root) 可以运行poweroff 应用程序来关闭计算机。

    您应该做的是找到您尝试运行的可执行文件which raspistill。这将返回可执行文件的位置。接下来,您应该使用ls -l `which raspistill` 检查文件权限,并查看显示为-rwxr-xr-- 的所有者数据和文件权限(这是一个常见的权限集,您的可能会有所不同)。第一个 3 代表文件所有者的读写执行权限,接下来的 3 个字符仅代表用户组的读取和执行权限,最后 3 个字符仅代表“其他”用户的读取权限。

    如果文件的所有者不是 www-data,您可以执行几项操作,例如使用我不推荐的 chown &lt;user&gt; &lt;file&gt; 更改文件的所有权信息,或者将执行权限添加到“其他”用户集chmod o+x `which raspistill`.

    如果问题确实出在权限上 - 这应该可以解决您的问题。

    附加信息:

    http://www.computerhope.com/unix/uchmod.htm

    http://www.ss64.com/bash/chmod.html

    【讨论】:

      【解决方案2】:

      我修好了。

      Web 服务器可以访问 raspistill 命令,但该命令使用了它无权访问的视频设备。我将 www-data 用户添加到视频和音频组,这样我就可以播放音频和拍照了。我还必须为我的网络目录中的某些文件夹更改一些组。 我必须解决的最后一件事是 os.system() 调用返回了一些东西,这给浏览器显示网页带来了一些问题。它只显示文本。我现在使用 subprocess 模块,初始代码似乎可以工作。我的简单测试代码在这里:

      import os, sys
      
      import subprocess
      
      #output = subprocess.check_output("raspistill -o /var/www/images/image.jpg",     shell=True)
      #os.system('raspistill -v -o /var/www/images/image.jpg')
      
      # Import modules for CGI handling
      import cgi, cgitb
      
      # Create instance of FieldStorage
      form = cgi.FieldStorage()
      
      output = ""
      output2 = ""
      # Get data from fields
      if form.getvalue('speak_en'):
         output = subprocess.check_output("espeak \"%s\"" % (form.getvalue('speak')), shell=True)
      
      if form.getvalue('picture'):
         output2 = subprocess.check_output("raspistill -o /var/www/images/image.jpg", shell=True)
      
      
      print """\
      Content-type:text/html\n
      <html>
      <head>
      <title>Hello Word - First CGI Program</title>
      </head>
      <body>
      <h2>Select photo or speak</h2>
      <form action=\"/cgi-bin/hello.py\" method=\"post\">
      <input type=\"checkbox\" name=\"speak_en\" value=\"on\" />
      Speak: <input type=\"text\" name=\"speak\"><br />
      Take picture:
      <input type=\"checkbox\" name=\"picture\" value=\"on\" />
      <br />
      <input type=\"submit\" value=\"Submit\" />
      </form>
      <img src=\"../images/image.jpg\" width=640 height=480>
      <p>Speak output: %s</p>
      <p>Picture output: %s</p>
      </body>
      </html>
      """ % (output, output2)
      

      【讨论】:

      • 我遇到了同样的问题。将 www-data 用户添加到视频组并重新启动 lig​​httpd 即可解决问题。
      最近更新 更多