使用Runtime.getRuntime().exec在提示时传递参数

4

我正在使用以下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时,我们有没有提供传递keypassword的选项(例如PostgreSQL -d data/dir/ -keyPass password start)?


https://dev59.com/6FHTa4cB1Zd3GeqPTq09 - Jayan
3个回答

4
您可以打开进程的OutputStream,并传递密码短语,服务器将读取它,就好像您从STDIN键入了它一样。
final Process startServer = Runtime.getRuntime().exec("PostgreQL -D data/dir/ start");
PrintStream ps = new PrintStream(startServer.getOutputStream());
ps.println(passPhrase);

Vikdor:感谢您的时间。那么ps.println(passPhrase)会将密码传递给命令行吗? - Lolly
还有一个问题,这个参数(ps.println(passPhrase))可以一开始就传递吗?还是只能在提示时传递?如果是后者,那我应该读取输入流并检查何时提示,只有在那时才传递对吗?请给我解释一下。 - Lolly

1

以上提供的答案之一是创建一个密码文件。

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

hostname:port:database:username:password

这个密码不是 PostgreSQL 服务器的密码,而是私钥的密码,与 PostgreSQL 服务器的密码完全不同。我想你可能误解了。 - Lolly

1

首先看一下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...

1
不要忘记使用redirectErrorStream()或者// Create a seperate thread to deal with the error as needed...。我猜想,由于使用了PostgreQL(而不是PostgreSQL),我们可能会看到后者的情况。 ;) - Andrew Thompson
@AndrewThompson 你为什么想知道什么时候出了问题?或者报告这个事实呢?;) +1 不错的观点 - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接