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

问题描述 投票:0回答:0

我在使用 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>
php apache ubuntu permissions openai-whisper
© www.soinside.com 2019 - 2024. All rights reserved.