You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:06:26