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
相关产品推荐
相关产品推荐

