我在使用 PHP 的
exec
函数执行命令时遇到问题。我认为有两个不同的权限(或者可能是环境?)问题。
在这种情况下,我遇到问题的脚本是
whisper
(OpenAI 的耳语)。安装程序是 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。
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
. 都是如此
当我尝试使用命令提示符(首先确保输出文件被删除)以
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
都是如此。
但是,如果创建输出文件并使用
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
甚至无法从命令行 create 输出文件,而 PHP 可以以某种方式创建(空)输出文件,但我不确定该怎么做。)其次,我认为 PHP(即 www-data 用户)无法找到或运行 whisper
命令。
拜托,如果您有任何想法或解决方案,我将不胜感激。
编辑: 我发现 this 和 mz3 的回答表明
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>