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

Python脚本命令行可运行,PHP传参调用异常求助

问题分析与解决方案

你的核心问题是Python脚本在命令行正常运行,但通过PHP调用时仅重复用户场景能返回结果,其他场景无输出无写入。结合代码和运行环境,主要原因集中在异常未捕获、Python环境依赖不一致、文件写入逻辑错误、命令参数未转义这几个点,以下是具体修复步骤:

1. 捕获签名验证异常,避免脚本崩溃

Python的pynacl库在签名验证失败时会抛出BadSignatureError,当前代码未处理该异常,导致脚本直接终止,无任何输出。添加异常捕获逻辑,设置对应的错误码7:

修改后的Python关键代码:

from nacl.exceptions import BadSignatureError  # 新增导入

# ... 省略其他代码 ...

if match == 0: # 检查完所有用户后未发现重复
    try:
        verify_key = VerifyKey(KEY, encoder=HexEncoder)
        signature_bytes = HexEncoder.decode(SIG)
        # 验证签名,失败则抛出异常
        verify_key.verify(MSG.encode('utf-8'), signature_bytes)
        error_code = 0
        # 用a+b模式追加写入,避免覆盖原有内容
        with open("/var/www/html/src/registrations.bin", "a+b") as f:
            f.write(binascii.unhexlify(MSG))
    except BadSignatureError:
        error_code = 7

2. 统一Python环境依赖

命令行使用的Python和PHP调用的/usr/bin/python3可能不是同一环境,导致pynacl库未安装。执行以下命令为PHP使用的Python安装依赖:

sudo /usr/bin/pip3 install pynacl

3. 修复文件写入模式,避免覆盖原有数据

原代码使用rb+模式打开文件,默认指针在文件开头,写入会覆盖原有内容。改为a+b模式实现追加写入,确保新注册信息添加到文件末尾。

4. PHP命令参数转义,避免特殊字符干扰

未转义的参数若包含空格、引号等特殊字符,会导致命令执行异常。使用escapeshellarg()对每个参数进行转义:

修改后的PHP关键代码:

if(isset($_GET["SIG"])){
    $USER = $_GET["USER"];
    $UUID = $_GET["UUID"];
    $KEY = $_GET["KEY"];
    $SIG = $_GET["SIG"];
    // 转义所有参数,避免命令执行错误
    $command = "/usr/bin/python3 /scripts/register.py " 
             . escapeshellarg($USER) . " " 
             . escapeshellarg($UUID) . " " 
             . escapeshellarg($KEY) . " " 
             . escapeshellarg($SIG)
             . " 2>&1"; // 新增:捕获错误输出,方便调试
    echo shell_exec($command);
}

5. 强制输出刷新,避免缓冲问题

Python的print函数可能存在缓冲,导致PHP无法及时获取输出。替换为sys.stdout.write并强制刷新:

在Python脚本末尾修改:

# print(error_code)
import sys
sys.stdout.write(str(error_code) + '\n')
sys.stdout.flush()

6. 确认文件与目录权限

确保Apache运行用户(通常是www-data)拥有/var/www/html/src目录的读写权限:

sudo chown -R www-data:www-data /var/www/html/src
sudo chmod 755 /var/www/html/src
sudo chmod 644 /var/www/html/src/registrations.bin

调试技巧

如果问题仍存在,保留命令中的2>&1,可以将Python脚本的错误输出(如模块缺失、异常信息)打印到页面,快速定位问题。


内容的提问来源于stack exchange,提问作者Brad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:54:57