apache 无法使用PHP的exec()运行脚本,可能是权限问题

xqk2d5yq  于 2023-05-07  发布在  Apache
关注(0)|答案(1)|浏览(226)

我在使用PHP的exec函数执行命令时遇到问题。我认为有两个不同的权限(或者环境?)问题。
在本例中,我遇到麻烦的脚本是whisper(OpenAI的Whisper)。安装程序是Ubuntu 22.04.2 LTS,Apache 2.4.52,PHP 8.1.5。
PHP以Web服务器用户www-data的身份运行exec函数。(我已经用exec('whoami')证实了这一点。
Whisper是用我的常规用户名pip安装的,我称之为myrealusername
在我的命令提示符下,如果我输入whereis whisper,我会得到答案whisper: /home/myrealusername/.local/bin/whisper。然而,如果我尝试sudo -u www-data whereis whisper,我得到的答案是whisper:,这表明Web服务器用户www-data无法找到Whisper。
whisper的内容如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from whisper.transcribe import cli
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(cli())

我尝试使用exec运行的命令是whisper 'mediafilename.mp3' --model tiny --language English > 'outputfilename.txt'。(这个有点简化;实际上,mediafilename.mp3outputfilename.txt是用各自的路径指定的,这里就不重复了;我已经确保这些路径由www-data所有。)当使用我的常规用户名myrealusername运行时,如果输入和输出都由该用户名所有,那么这个命令可以很好地生成输出。
当我尝试使用PHP的exec函数运行上述命令时,outputfilename.txt被创建为一个空文件,该文件由www-data拥有,权限为0644(rw-r--r--)。无论Whisper在命令中仅指定为whisper还是指定为完整路径/home/myrealusername/.local/bin/whisper,都是如此。
当我尝试使用命令提示符(确保首先删除输出文件)作为Web服务器用户使用sudo -u www-data whisper 'mediafilename.mp3' --model tiny --language English > 'outputfilename.txt'运行上述命令时,我得到outputfilename.txt: Permission denied,并且输出文件 * 未 * 创建。无论我将Whisper指定为whisper还是/home/myrealusername/.local/bin/whisper,都是如此。
但是,如果创建了输出文件,并使用sudo chmod 0646 outputfilename.txt将其权限手动更改为rw-r--rw-,以便输出文件可由所有人写入,则在命令行中,sudo -u www-data whisper 'mediafilename.mp3' --model tiny --language English > 'outputfilename.txt'将给出错误whisper: command not foundsudo -u www-data /home/myrealusername/.local/bin/whisper 'mediafilename.mp3' --model tiny --language English > 'outputfilename.txt'将给出错误

Traceback (most recent call last):
  File "/home/myrealusername/.local/bin/whisper", line 5, in <module>
    from whisper.transcribe import cli
ModuleNotFoundError: No module named 'whisper'

所以,我想我可能有两个不同的问题。首先,尽管PHP能够创建输出文本文件outputfilename.txt,但它没有通过whisper命令写入该文件的适当权限。(对我来说很奇怪的是,www-data甚至不能从命令行 * 创建 * 输出文件,而PHP却能以某种方式创建一个(空)输出文件,但我不确定这是怎么回事。)其次,我认为PHP(即www-data用户)无法找到或运行whisper命令。
如果你有任何想法或解决方案,我将不胜感激。

**编辑:**我发现this与mz 3的答案表明,www-data不能读/写/执行Apache配置文件中设置的目录之外的任何内容。如何修改我的.conf文件,使www-data可以执行whisper,而不会让外部流量进入我的文件系统的这些部分?会不会像下面的工作?

<Directory /home/myrealusername/.local/bin>
    Options ExecCGI
    AllowOverride None
    Require all granted
    <Files "whisper">
      Require all granted
      SetHandler cgi-script
    </Files>
  </Directory>
ovfsdjhp

ovfsdjhp1#

我刚刚遇到了同样的问题,花了我们的钱在上面,非常令人沮丧。最后,我甚至chmod‘艾德目录到777,仍然得到同样的错误。
最后我做的是在whisper命令中包含文件类型和目录,并带有--output_format和--output_dir选项。所以说清楚
exec(“whisper/dirname/filename.mp3”);
。。。给了我权限拒绝错误,但是
exec(“whisper/目录名/文件名. mp3--output_format srt --output_dir /目录名”);
......没有任何故障,不知道为什么。
祝你好运!干杯。

相关问题