当 运行 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。
这并不能解释为什么写入只是有时有效,但现在总是有效。
我想 运行 来自 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。
这并不能解释为什么写入只是有时有效,但现在总是有效。