如何为控制台应用程序提供密码?

Posted

技术标签:

【中文标题】如何为控制台应用程序提供密码?【英文标题】:How can I supply a password to a console application? 【发布时间】:2014-02-23 07:17:15 【问题描述】:

当我在测试当前应用程序时遇到问题时,我经常需要调整应用程序使用的数据库。在多次丢失重要更改后,我编写了一个程序,将我的数据库备份到一个文件,然后将该文件检入 SubVersion。我发现那个备份应用程序不够好。

数据库是 PostgreSQL 数据库,我的备份应用程序调用 pg_dump 来创建备份文件。 pg_dump 在控制台窗口中执行。当数据库在我自己的机器上时,它运行良好。但是当我将数据库移动到我们的测试服务器时,pg_dump 要求输入密码。虽然没什么大不了的,但我希望能够自动提供密码,因为它在备份应用程序中可用。

我尝试按照我在这里找到的建议进行操作,但 pg_dump 仍然停止并要求输入密码。这是我认为应该提供密码的代码:

Process backupProcess = new Process();
backupProcess.StartInfo.UseShellExecute = false;
backupProcess.StartInfo.RedirectStandardInput = true;
backupProcess.StartInfo.FileName = dumpPath + "pg_dump.exe";
backupProcess.StartInfo.Arguments = " --host " + host + 
                                    " --port " + port + 
                                    " --username " + userName + 
                                    " --format custom --blobs --verbose --file " +
                                    "\"" + txtBackupFile.Text + "\" " + dbName;
backupProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
backupProcess.Start();
StreamWriter standardInput = backupProcess.StandardInput;
standardInput.WriteLine("mypassword");
backupProcess.WaitForExit();// Waits here for the process to exit.

感谢您的帮助。

罗伯R

【问题讨论】:

真的应该考虑使用 Path.Combine(dumpPath, "pg_dump.exe") 而不是 "dumpPath + "pg_dump.exe"。 谢谢。我没有意识到这种方法的存在。这比担心我是否有斜线要好得多。 【参考方案1】:

我已经通过使用解决了这个问题

backupProcess.EnvironmentVariables["PGPASSWORD"] = "password";

这样,我就避免了密码会存储在电脑上

【讨论】:

backupProcess.StartInfo.EnvironmentVariables["PGPASSWORD"]【参考方案2】:

也许它有点作弊(从某种意义上说,它并不能真正帮助您回答如何将输入提供给pg_dump 的问题),但您可以参考this answer,它建议使用@ 987654324@ 文件。当然可以动态地写入这个文件,而不是在程序提示时尝试与程序交互。

.pgpasshere 的信息。

【讨论】:

非常感谢该链接。我会看到有关设置 .pgpass 文件的信息,或者我可能会使用答案也建议的 Python 脚本。我还没有尝试过任何一个,但是当我在这里时,我会将其标记为可接受的答案。 在 .NET 中自动执行命令行交互(就像您可能使用“expect”工具或类似工具一样)听起来有点不可靠。顺便说一句,如果你编写一个 .NET 程序的虚拟“pg_dump.exe”,上述程序对我有用。

以上是关于如何为控制台应用程序提供密码?的主要内容,如果未能解决你的问题,请参考以下文章

服务器身份验证后如何为前端提供 JSON Web 令牌?

如何为 gradle 任务命令行参数提供 flyway 密码?

如何为bash中提示输入的命令提供密码?

如何为我的 ios 推送通知提供商续订 SSL 证书?

如何为winform C#应用程序实现密码恢复[关闭]

如何为 NetBeans 设置 Tomcat 管理器应用程序用户名和密码?