python脚本script.py位于/usr/bin/monitor/scripts中,它的主要功能是使用subprocess.check_call()和{}来调用各种管理工具(这两个c程序都位于专门为机器创建的/usr/bin/monitor/中,以及{}中的linux可执行文件,如fdisk -l和{})。它被编写成以root的形式运行,并以一种有用的方式将这些程序的输出打印到命令行。

我的项目是使这个脚本的输出可以通过网页查看。我在Beaglebone Black上使用Apache2,它以用户www-data的身份从其DocumentRoot/var/www/html/执行文件。网页设置如下:index.html使用iframe显示python CGI脚本的输出,该脚本也位于/var/www/html/

script.cgi尝试使用subprocess模块调用/显示来自script.py输出的输出

问题是脚本.py被打电话很好,但是每一个电话脚本.py失败并返回脚本.py的错误消息,因为我假定当apache以用户www-data运行它们时,它们需要以root身份运行。

为了解决这个问题,我创建了一个名为bbb的新组,将www-data添加到该组中,然后运行chown :bbb script.py将其组更改为bbb。不幸的是,它仍然导致同样的问题,所以我尝试将权限从755更改为775,但也没有成功。我尝试在脚本.py使用,也无济于事。另外,一些可执行文件脚本.py用法在/sbin中,我很谨慎地只给它一个像这样的目录的总根访问权限。

由于我试图解决所有权问题有点像1000个猴子代码,所以我创建了一个脚本的新版本,在这个版本中,我创建了一个html输出列表,在原始代码中的每个print语句之后,我将同一行文本作为一个带有html标记的字符串附加到html输出列表中,然后在脚本的末尾(whatami)我得到了它在/var/www/html/中创建并写入一个.txt文件,然后调用os.chmod("/var/www/html/data.txt", 0o755)以授予apache访问权限。然后CGI调用subprocess.check_call()脚本.py,然后打开、读取并将带有html格式的每一行打印到网页中的iframe。这一尝试至少产生了准确的输出,但是。。。它只在以根用户身份在终端中运行时更新,而不是重新运行脚本.py每次刷新页面时,都会破坏网页的重点。我假设这意味着CGI脚本中的subprocesscheck_调用不能正常工作,但是由于某些原因,子进程调用本身不会抛出任何错误或失败指示,但是文本文件返回时没有更新。即使在“try”块中的子进程调用被“print('call successful')”成功,它也会返回成功消息,然后返回未更新的文本文件。

我有点不知所措,想知道如何强制脚本在后台运行,这样文件就可以更新,而不需要给apache根用户访问权限。我读过一些关于将python脚本包装在shell中以root用户身份运行的内容,或者更改sudoers以赋予www-data sudo特权的内容,但我不想引入安全问题,也不想让原本打算成为一个简单脚本的内容变得比现在更加复杂。任何建议或指示将不胜感激。