如何使用ProcessBuilder进行交互式命令?

时间:2014-03-19 09:43:34

标签: java psql

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

1 个答案:

答案 0 :(得分:3)

问题的标题表示关于ProcessBuilder的一般性问题,但由于OP专门提到psql,因此有一些特定的解决方案可以更好地工作,并且不需要您阅读流程输出并回复它

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

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

解决方案2:(推荐) 但是有一个更安全的选项,那就是create a .pgpass or pgpass.conf file包含用户帐户中的密码,您将在该帐户下运行psql程序。

该文件应包含以下格式的行:

hostname:port:database:username:password

我已将上述文本中的链接添加到PostgreSQL文档中以获取更多详细信息。

您还可以使用环境变量psql告知pgpass.confPGPASSFILE文件在磁盘上的位置,并且可以在调用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();