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

Java 如何使用ProcessBuilder执行交互式命令?,java,psql,Java,Psql,我正在使用ProcessBuilder运行postgresqlpsql命令。 但我不能在同一行给它密码,我必须传递参数,然后它会提示输入密码。 如何使用ProcessBuilder传递此交互参数?问题的标题表示有关ProcessBuilder的一般问题,但由于OP特别提到了psql,因此有一些特定的解决方案效果更好,不需要您阅读流程输出并对其作出响应 但是,您需要记住的问题是,在命令行或环境变量中传递密码是完全不安全的,因为使用ps命令可以发现密码(至少在Unix上) 解决方案1: 可以选择,但

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

问题的标题表示有关ProcessBuilder的一般问题,但由于OP特别提到了
psql
,因此有一些特定的解决方案效果更好,不需要您阅读流程输出并对其作出响应

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

解决方案1: 可以选择,但不建议这样做,因为机器的其他用户可以看到它

解决方案2:(推荐) 不过,还有一个更安全的选项,那就是在运行
psql
程序的用户帐户中包含密码

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

hostname:port:database:username:password
我在PostgreSQL文档中添加了以上文本中的链接,以了解更多详细信息

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

尝试以下操作:-当您调用
您的ProcessBuilder.start()
时,它将返回一个
进程
对象
Process
具有
getOutputStream()
getInputStream()
方法,您可以使用它们读取/写入process@BackSlash您能再解释一下吗?谢谢您的回答,但我们想开发一个在50个或更多客户机上运行的应用程序,我们不知道他们的postgresql环境如何。我们将从用户处获取密码和其他参数作为参数。它们运行的是Windows还是Unix?(或者其他什么?)还有第二个问题:为什么需要特别启动
psql
?您也可以使用postgresql JDBC驱动程序对数据库执行命令。它们都是windows,我需要将其与shp2pgsqlI一起运行。我添加了一个idea和一个代码片段,您可以使用从Java编写的pgpass.conf文件将密码传递到
psql
,然后使用环境变量
PGPASSFILE
传递到
psql