当 运行 Python 脚本来自 PHP 时出现 PermissionError

PermissionError when running Python script from PHP

我想 运行 来自 PHP 的 Python 脚本(长话短说),但我收到了 PermissionError。 运行 Python 直接从命令行与 PHP 用户一起使用的脚本似乎工作正常。

服务器正在 运行宁作为用户 967(nginx),是组 pygroup 的成员。

python文件(/var/www/py)目录的权限如下:

-rwxrwxr-x. 1 homeuser pygroup   119 Mar 22 15:18 test.py
-rw-rw-r--. 1 homeuser pygroup     2 Mar 22 15:24 x.txt

以下 Python 脚本 test.py 在同一目录中打开一个文件进行写入:

#!/usr/bin/env python3
import sys
import os

print("UID:", os.getuid())
print("EUID:", os.geteuid())

with open(os.path.join(sys.path[0],"x.txt"), "w") as f:
    pass

运行 它与 sudo -u nginx /var/www/py/test.py 一起工作正常:

UID: 967
EUID: 967

但是,如果我尝试使用来自另一个目录的以下 PHP 脚本执行它:

<?php
echo "UID: " . posix_getuid() . "\n";
echo "EUID: " .  posix_geteuid() . "\n";
echo "Name: " . posix_getpwuid(posix_getuid())['name'] . "\n\n";
echo "Running python:\n";
echo shell_exec("/var/www/py/test.py 2>&1");

然后我得到以下输出:

UID: 967
EUID: 967
Name: nginx

Running python:
UID: 967
EUID: 967
Traceback (most recent call last):
  File "/var/www/py/test.py", line 8, in <module>
    with open(os.path.join(sys.path[0],"x.txt"), "w") as f:
PermissionError: [Errno 13] Permission denied: '/var/www/py/x.txt'

确认 PHP 脚本正在 运行 以用户 nginx 身份运行。但是它会抛出一个错误,而 运行 从命令行使用它,因为这个用户工作正常。

SELinux 设置为宽容。 Nginx 和 SELinux 日志中也没有错误。我可能错过了什么?

更新 2021-03-23:它似乎工作不规律。当从 PHP 调用 python 脚本时,每 10 次左右尝试写入工作。可能是什么问题?

不仅偶尔允许写入,而且 SELinux 有时也会报告错误。

解决方案:安装了大部分软件包更新,执行了SELinux 日志的所有故障排除建议,并重新启动了机器。之后,我不得不再次将 SELinux 设置为 permissive。

这并不能解释为什么写入只是有时有效,但现在总是有效。