如何在PHP中以正确权限运行Python脚本?问题排查
问题排查与修复方案
现有代码存在3个核心问题,按优先级修复即可:
- 未向Python脚本传递入参
当前PHP代码仅执行了Python脚本,没有把获取到的$ip作为命令行参数传入,Python代码读取sys.argv[1]时会直接抛出索引越界错误,脚本执行中断。
修复后的PHP代码:<?php $ip = $_SERVER['REMOTE_ADDR']; $script = '/var/www/public_html/cgi-bin/test.py'; // 拼接命令时同步传入转义后的参数,同时捕获标准错误输出方便排查 $command = escapeshellcmd($script) . ' ' . escapeshellarg($ip) . ' 2>&1'; $output = shell_exec($command); echo $output; - Python脚本存在逻辑bug
第一次打开文件调用readlines()后,文件指针已经移动到文件末尾,后续调用file.read()永远返回空字符串,会导致IP重复写入.htaccess的问题。
修复后的Python脚本:#!/usr/bin/python3 import sys ip = sys.argv[1] htaccess_path = '/var/www/public_html/images/.htaccess' # 读取文件内容并统一处理换行 with open(htaccess_path, 'r', encoding='utf-8') as f: lines = [line.rstrip() for line in f.readlines()] print(lines) target_rule = f' Require ip {ip}' # 规则不存在时再写入 if target_rule not in lines: lines.insert(-1, target_rule) with open(htaccess_path, 'w', encoding='utf-8') as f: for line in lines: f.write(f'{line}\n') - Web进程权限不匹配
你在Shell中手动运行Python脚本,使用的是当前登录用户的权限;PHP调用脚本时使用的是Web服务(Apache/PHP-FPM/Nginx)的运行用户权限(常见为www-data/apache/nginx),需要给该用户分配目标文件的写权限:# Debian/Ubuntu 系统执行 chown -R www-data:www-data /var/www/public_html/images/ # CentOS/RHEL 系统执行,把上面命令的www-data替换为apache即可 chmod 755 /var/www/public_html/images/ chmod 644 /var/www/public_html/images/.htaccess
如果上述配置修改后仍无法写入,检查系统是否开启SELinux,默认SELinux策略会禁止HTTP服务进程写入web目录文件,可临时执行setenforce 0测试,确认是SELinux限制后再配置对应永久规则即可。
内容的提问来源于stack exchange,提问作者imperato
相关产品推荐
相关产品推荐

