我正在使用ProcessBuilder来运行postgresql psql
命令。
但我不能在同一行给它密码,我必须传递参数然后它会提示输入密码。
如何使用ProcessBuilder传递此交互式参数?
答案 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.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();