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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:45:36