C#中如何通过StandardInput向pg_dump传递密码?
问题根因
pg_dump属于PostgreSQL官方命令行工具集,它的密码输入默认直接读取关联控制台的终端输入,不会从重定向的标准输入流读取密码,这是通过StandardInput写入密码不生效的核心原因。
另外参数中添加的-W参数作用是强制触发密码提示,哪怕已经配置了其他密码传递渠道也会弹出输入要求,非交互场景下必须去掉这个参数。
可行解决方案
优先选择前两种官方支持的非交互传密方案,稳定无兼容问题:
- 方案1:通过
PGPASSWORD环境变量传密码(实现最简单)
pg_dump启动时会自动读取同名环境变量作为密码,不需要做任何输入重定向,修改后的代码如下:
var processStartInfo = new ProcessStartInfo { // 去掉了-W参数,避免强制弹密码提示 Arguments = @"-U postgres -f D:\postgres\test123_dump.sql postgres", CreateNoWindow = true, FileName = @"C:\PostgreSQL\bin\pg_dump.exe", UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden }; // 注入密码环境变量 processStartInfo.EnvironmentVariables["PGPASSWORD"] = "123"; Process process = new Process() { StartInfo = processStartInfo, EnableRaisingEvents = true }; process.Start(); // 等待备份执行完成 process.WaitForExit();
- 方案2:使用pgpass密码文件(适合不想硬编码密码的场景)
在当前执行用户的%APPDATA%\postgresql\目录下创建名为pgpass.conf的文件,按以下格式写入连接信息:
localhost:5432:postgres:postgres:123
文件格式为主机地址:端口:数据库名:用户名:密码,pg_dump启动时会自动匹配对应连接配置读取密码,代码里不需要传密码、也不需要重定向输入,只要去掉-W参数即可正常运行。
- 不推荐方案:通过Windows控制台API向pg_dump的控制台窗口发送输入
这种方式需要手动处理进程控制台附着、输入事件模拟,实现复杂且容易受系统权限、窗口状态影响,没有特殊需求不要使用。
内容的提问来源于stack exchange,提问作者MTS
相关产品推荐
相关产品推荐

