【问题标题】:PermissionError when running Python script from PHP从 PHP 运行 Python 脚本时出现 PermissionError
【发布时间】:2021-06-19 07:17:16
【问题描述】:

我想从 PHP 运行 Python 脚本(说来话长),但我得到了 PermissionError。但是,使用 PHP 用户直接从命令行运行 Python 脚本似乎可以正常工作。

服务器以用户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 次左右尝试写入工作。可能是什么问题?

【问题讨论】:

  • 不确定。按此处的设计工作 - 但这是在 Ubuntu 上使用 www-data 而不是 Centos/RHEL/... 和 nginx。您确定您是以同一用户的身份调用 PHP 位吗?
  • @tink 感谢您的测试。当 UID 的输出相同时,我怎么能以不同的用户身份调用 PHP 位?我不知道怎么检查。

标签: python php linux nginx permission-denied


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多