如何通过PHP的proc_open()执行mysqldump避免弹出密码输入提示
解决方案
你现有代码失效的核心原因是 mysqldump 的 Enter password: 提示默认不会从标准输入读取内容,而是直接访问当前终端TTY获取输入,因此往标准输入写入密码的逻辑无效。
符合你所有限制条件的最优实现是通过 proc_open 的环境变量参数传递密码,MYSQL_PWD 是MySQL官方原生支持的读取密码的环境变量,该变量仅作用于当前创建的子进程,不会暴露到全局环境、进程列表或外部配置文件,完全满足你的要求。
修改后代码
// 命令行去掉-p参数,避免触发密码输入提示 $cmd = "mysqldump -u ".$db_user." -h ".$db_host." ".$db_name." > /files/database-backups/db-backup.sql"; $desc = []; // 不需要额外管道配置 // 第五个参数传入仅对子进程生效的环境变量 $p = proc_open($cmd, $desc, $pipes, null, [ 'MYSQL_PWD' => $db_pass ]); proc_close($p);
方案优势
- 无明文泄露风险:密码不会出现在进程命令参数中,系统其他用户无法通过
ps等命令查看密码 - 无额外依赖:不需要创建外部配置文件,也不需要执行
export修改全局环境 - 逻辑更简洁:不需要手动处理标准输入写入密码的逻辑
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

