[英]How to use ProcessBuilder for interactive commands?
我正在使用ProcessBuilder运行postgresql psql
命令。 但是我不能在同一行上给它密码,而我必须传递参数,然后它将提示输入密码。 如何使用ProcessBuilder传递此交互式参数?
该问题的标题表示有关ProcessBuilder的一般问题,但是由于OP特别提到了psql
,因此有一些特定的解决方案可以更好地工作,并且不需要您阅读过程输出并做出响应。
但是,您需要牢记的问题是,在命令行或环境变量中传递密码是完全不安全的,因为可以使用ps
命令发现密码(至少在Unix上如此)。
解决方案1:可以选择在PGPASSWORD
环境变量中传递密码,但是不建议这样做,因为该机器的其他用户可以看到它。
解决方案2 :(推荐)不过,还有一个更安全的选择,那就是创建一个.pgpass
或pgpass.conf
文件,其中包含要在其下运行psql
程序的用户帐户的密码。
该文件应包含以下格式的行:
hostname:port:database:username:password
我在上面的文本中添加了指向PostgreSQL文档的链接,以获取更多详细信息。
您还可以使用环境变量PGPASSFILE
告诉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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.