2014-03-19 121 views
2

我正在使用ProcessBuilder运行postgresql psql命令。 但我不能在同一行给它密码,我必须传递参数,然后它会提示输入密码。 如何使用ProcessBuilder传递这个交互参数?如何使用ProcessBuilder进行交互式命令?

+1

试试这个:-http://stackoverflow.com/questions/3468987/executing-another-application-from-java – Divya

+2

当你调用'yourProcessBuilder.start()'时,它会返回一个'Process'对象。 'Process'具有'getOutputStream()'和'getInputStream()'方法,您可以使用它们读取/写入流程 – BackSlash

+0

@BackSlash请问您能解释一下吗? – Obtice

回答

3

问题的标题表示关于ProcessBuilder的一般问题,但由于OP特别提到了psql,因此有些特定的解决方案可以更好地工作,并且不需要读取过程输出并对其作出响应。

但是,需要记住的问题是,在命令行或环境变量中传递密码是完全不安全的,因为通过使用ps命令可以发现它们(至少在Unix上)。

解决方案1: 有一个选项,以pass the password in the PGPASSWORD environment variable但不推荐,因为机器的其他用户都可以看到它。

解决方案2:(推荐) 有虽然是更安全的选择,那就是create a .pgpass or pgpass.conf file包含在该帐户下,你要运行的程序psql的用户的密码。

该文件应包含行格式为:在上述PostgreSQL的文档了解更多信息文本

hostname:port:database:username:password 

我已经添加了链接。

你也可以告诉psql其中该pgpass.conf文件是使用环境变量PGPASSFILE磁盘上,并且可以调用psql之前写从Java文件。

这个片段应该给你一个想法如何做到这一点与ProcessBuilder

String hostname = "..."; 
int port = 5432; 
String database = "..."; 
String username = "..."; 
String password = "..."; 
File file = File.createTempFile("pgpass", "conf"); 
// TODO: ensure file permissions are correct 
try (Writer w = new FileWriter(file)) { 
    w.write(String.format("%s:%d:%s:%s:%s\n", hostname, port, database, username, password)); 
} 
ProcessBuilder processBuilder = new ProcessBuilder("psql"); // add other options to psql to the argument list 
processBuilder.environment().put("PGPASSFILE", file.getAbsolutePath()); 
processBuilder.start(); 
+0

感谢您的回答,但我们希望开发一个运行在50个或更多客户端的应用程序,我们不知道他们的postgresql环境如何。我们将获取用户的密码和其他参数作为参数。 – Obtice

+0

他们是运行Windows还是Unix? (或别的?) –

+0

第二个问题:为什么你需要专门启动'psql'?您也可以使用postgresql JDBC驱动程序对数据库执行命令。 –