2013-02-01 122 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

相關問題