【问题标题】:Runtime.getRuntime().exec to pass parameter when promptedRuntime.getRuntime().exec 在提示时传递参数
【发布时间】:2013-01-16 09:18:28
【问题描述】:

我正在使用下面的 Java 语句从 Java 代码启动 PostgreSQL 服务器。我正在使用Runtime.getRuntime().exec() 方法来实现这一点。

 final Process startServer = Runtime.getRuntime().exec("PostgreQL -D data/dir/ start");

当服务器启用 SSL 并且密钥受密码保护时,在命令行中会提示输入密码(请参见下面的行)。在这种情况下,我该如何传递密码。

Is server running?
starting server anyway
waiting for server to start......Enter PEM pass phrase:....

当出现提示时,我们是否可以选择将密码作为参数传递?或者在 PostgreSQL 中,我们是否有任何规定可以传递密码(例如 PostgreSQL -d data/dir/ -keyPass password start)?

【问题讨论】:

标签: java database postgresql process runtime.exec


【解决方案1】:

您可以打开进程的 OutputStream 并传递将由服务器读取的密码,就好像您输入的密码来自 STDIN。

final Process startServer = Runtime.getRuntime().exec("PostgreQL -D data/dir/ start");
PrintStream ps = new PrintStream(startServer.getOutputStream());
ps.println(passPhrase);

【讨论】:

  • 维克多:谢谢你的时间。所以 ps.println(passPhrase) 会将密码传递给命令行是吗?
  • 还有一个问题,这个参数(ps.println(passPhrase))是否可以在开始时自己传递,或者只有在提示时才传递,如果是那么我应该读取输入流并检查当它被提示时,只有到那个时候我才应该通过是吗?请澄清一下。
【解决方案2】:

上面提供的答案的另一种选择是创建一个password 文件。

(例如~/.pgpass 文件(Windows 上的%APPDATA%\postgresql\pgpass.conf)格式为:

hostname:port:database:username:password

【讨论】:

  • 此密码不是PostgreSQL服务器密码,这是私钥密码,与PostgreSQL服务器密码完全不同。猜你误会了。
【解决方案3】:

先看看ProcessBuilder,它会让你的生活更轻松......

ProcessBuilder pb = new ProcessBuilder("PostgreQL", "-D", "data/dir/" "start");
Process p = pb.start();

InputStream is = p.getInputStream();
OutputStream os = p.getOutputStream();

// Create a separate thread to read the input as needed...
// Create a seperate thread to deal with the output as needed...

【讨论】:

  • 别忘了redirectErrorStream()// Create a seperate thread to deal with the error as needed...。我猜考虑到PostgreQL(而不是PostgreSQL),我们可能会看到后者。 ;)
  • @AndrewThompson 为什么你想知道什么时候出了问题?还是报告事实? ;) +1 好点
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 2015-08-28
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2018-08-20
相关资源
最近更新 更多