2013-02-01 49 views
2

我正在使用下面的java语句从java代码启动PostgreSQL服务器。我使用Runtime.getRuntime()。exec()方法来实现这一点。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”)?

请帮我一把。任何帮助或建议将非常感激。提前致谢。

+0

http://stackoverflow.com/questions/4112470/java-how-to-both-read-and-write-to-from-process-thru-pipe-stdin-stdout – Jayan

回答

2

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

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

Vikdor:为感谢你的时间。那么ps.println(passPhrase)会传递密码到命令行吗? – Mojoy

+0

@annonymous , 对。 – Vikdor

+0

还有一个问题,这个参数(ps.println(passPhrase))可以在开始时传递,或者只在提示时传递,如果是这样,那么我应该读取输入流并检查它何时提示,那次我应该通过吗?请澄清我。 – Mojoy

1

上面提供的答案的一种替代方法是创建一个password文件。

(如~/.pgpass文件(%APPDATA%\ PostgreSQL的\ Windows上pgpass.conf)格式为:由具有看看ProcessBuilder

hostname:port:database:username:password 
+0

此密码不是PostgreSQL服务器密码,这是与PostgreSQL服务器密码完全不同的私钥密码。猜猜你误解了。 – Mojoy

1

开始,它会让你的生活更容易....

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()'](http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#redirectErrorStream%28%29)或'/ /根据需要创建一个单独的线程来处理错误...'。我猜测给定'PostgreQL'(而不是'PostgreSQL'),我们可能会看到后者中的一些。 ;) –

+0

@AndrewThompson为什么你会想知道什么时候出现问题?或者报道事实? ;)+1好点 – MadProgrammer

相关问题