如何将输入数据发送到 Postgres psql.exe?

How to send input data into Postgres psql.exe?

我想为用户 MyUser 提供进入 psql.exe 的密码。不幸的是,我所有的尝试都失败了。请看以下代码:

        var psi = new ProcessStartInfo(@"c:\Program Files\PostgreSQL.5\bin\psql.exe", "-w -t -h localhost -p 5432 -U MyUser -c \"SHOW data_directory\"")
        {
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            RedirectStandardError = true,
            CreateNoWindow = true

        };

        using (var process = new Process { StartInfo = psi })
        {
            process.OutputDataReceived += (sender, e) =>
            {
                Console.WriteLine($"Output: {e.Data}");
            };
            process.ErrorDataReceived += (sender, e) =>
            {
                Console.WriteLine($"Error: {e.Data}");
            };

            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            process.StandardInput.WriteLine("Password");
            process.StandardInput.Flush();


            process.WaitForExit();
            Console.WriteLine($"Exit code: {process.ExitCode}");
        }

psql.exe 从不从重定向的标准输入中读取密码。因此进程挂在 WaitForExit 上。如果我使用 CreateNoWindow=false,那么我可以将密码写入控制台 window 并在 OutputDataReceived、ErrorDataReceived 中接收答案,但这不是我需要的。我需要在没有用户交互的情况下 运行 psql.exe。请注意,密码不应存储在 pgpass.conf.

基本上,psql 不从非终端输入源获取密码是一项安全措施。

从任何具有良好库的编程语言(例如 C#/.NET)对 postgreSQL 数据库执行某些操作的正确方法是简单地使用客户端库连接到数据库而不调用外部进程。

试一试:

proc.StartInfo.EnvironmentVariables["PGPASSWORD"] = "mypass";

对我有用。