繁体   English   中英

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

[英]How to use ProcessBuilder for interactive commands?

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

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

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

解决方案1:可以选择PGPASSWORD环境变量中传递密码,但是不建议这样做,因为该机器的其他用户可以看到它。

解决方案2 :(推荐)不过,还有一个更安全的选择,那就是创建一个.pgpasspgpass.conf文件,其中包含要在其下运行psql程序的用户帐户的密码。

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

hostname:port:database:username:password

我在上面的文本中添加了指向PostgreSQL文档的链接,以获取更多详细信息。

您还可以使用环境变量PGPASSFILE告诉psqlpgpass.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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM