我在使用 PHP 的
exec
函数执行命令时遇到问题。我认为有两个不同的权限(或者可能是环境?)问题。
在这种情况下,我遇到问题的可执行文件是 OpenAI 的 Whisper。安装程序是 Ubuntu 22.04.2 LTS、Apache 2.4.52、PHP 8.1.5.
PHP 作为 Web 服务器用户
exec
运行 www-data
函数。 (我已经用exec('whoami')
确认了这一点。)
Whisper 是使用
pip
在我的常规用户名下安装的,我称之为 myrealusername
.
在我的常规用户名下的命令提示符下,如果我输入
whereis whisper
,我会得到答案whisper: /home/myrealusername/.local/bin/whisper
。但是,如果我尝试 sudo -u www-data whereis whisper
,我得到答案 whisper:
,这向我表明 Web 服务器用户 www-data
只是找不到 Whisper。
我尝试使用
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
. 都是如此
当我尝试使用命令提示符(首先确保输出文件被删除)以
sudo -u www-data whisper 'mediafilename.mp3' --model tiny --language English > 'outputfilename.txt'
的 Web 服务器用户运行上述命令时,我得到 outputfilename.txt: Permission denied
,并且 not 创建输出文件。无论我将 Whisper 指定为 whisper
还是 /home/myrealusername/.local/bin/whisper
都是如此。
但是,如果创建输出文件并将其权限手动更改为 rw-r--rw- 使用
sudo chmod 0646 outputfilename.txt
,然后,在命令行中,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
甚至无法从命令行 create 输出文件,而 PHP 可以以某种方式创建(空)输出文件,但我不确定该怎么做。)其次,我认为 PHP(即 www-data 用户)无法找到或运行 whisper
命令。
拜托,如果您有任何想法或解决方案,我将不胜感激。