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