PHP中捕获7z解压错误:检测密码错误并触发通知
PHP调用7z解压时捕获密码错误并发送通知
要实现捕获7z解压的密码错误并通知管理员,你需要改造现有代码,改用能捕获命令输出和退出状态的函数,同时利用7z的错误特征来判断:
核心改造思路
- 替换
system()为exec(),这样可以捕获命令的输出内容和退出状态码 - 用
escapeshellarg()转义所有外部参数,避免命令注入风险 - 7z密码错误时,退出码通常为
2,且输出中会包含ERROR: Wrong password--,通过这两个特征判断密码错误 - 触发密码错误时,调用
mail()函数发送通知邮件
完整代码示例
$zippath = '/filepath/name.zip'; $password = 'current_password'; $targetFile = 'file.name'; // 转义参数,避免命令注入 $safeZippath = escapeshellarg($zippath); $safePassword = escapeshellarg($password); $safeTargetFile = escapeshellarg($targetFile); // 构造7z命令,-bsp1确保错误信息输出到标准输出 $command = "7z e $safeZippath -p$safePassword $safeTargetFile -bsp1"; // 捕获命令输出和退出状态 exec($command, $outputLines, $exitCode); $fullOutput = implode(PHP_EOL, $outputLines); // 判断是否为密码错误 $isBadPassword = ($exitCode === 2) && str_contains($fullOutput, 'ERROR: Wrong password--'); if ($isBadPassword) { // 发送通知邮件 $to = 'admin@yourdomain.com'; $subject = '[紧急] 解压密码失效,请更新'; $message = "尝试解压文件 {$zippath} 时检测到密码错误,请及时更新密码。\n\n错误详情:\n{$fullOutput}"; $headers = "From: system-notice@yourdomain.com\r\n" . "X-Mailer: PHP/" . phpversion(); // 发送邮件(注意:需要确保PHP的mail函数已正确配置) mail($to, $subject, $message, $headers); }
注意事项
- 命令注入防护:必须用
escapeshellarg()处理所有来自外部的变量(比如$zippath、$password),防止恶意构造的参数执行危险命令 - 错误输出捕获:添加
-bsp1参数可以让7z将错误信息输出到标准输出流,确保exec()能捕获到完整的错误内容 - 双重判断:同时检查退出码和错误字符串,避免因其他类型的错误(如文件损坏)误触发通知
内容的提问来源于stack exchange,提问作者Matt Morrison
相关产品推荐
相关产品推荐

