我正在使用ProcessBuilder运行postgresql psql
命令。 但我不能在同一行给它密码,我必须传递参数,然后它会提示输入密码。 如何使用ProcessBuilder传递这个交互参数?如何使用ProcessBuilder进行交互式命令?
回答
问题的标题表示关于ProcessBuilder的一般问题,但由于OP特别提到了psql
,因此有些特定的解决方案可以更好地工作,并且不需要读取过程输出并对其作出响应。
但是,需要记住的问题是,在命令行或环境变量中传递密码是完全不安全的,因为通过使用ps
命令可以发现它们(至少在Unix上)。
解决方案1: 有一个选项,以pass the password in the PGPASSWORD
environment variable但不推荐,因为机器的其他用户都可以看到它。
解决方案2:(推荐) 有虽然是更安全的选择,那就是create a .pgpass
or pgpass.conf
file包含在该帐户下,你要运行的程序psql
的用户的密码。
该文件应包含行格式为:在上述PostgreSQL的文档了解更多信息文本
hostname:port:database:username:password
我已经添加了链接。
你也可以告诉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();
感谢您的回答,但我们希望开发一个运行在50个或更多客户端的应用程序,我们不知道他们的postgresql环境如何。我们将获取用户的密码和其他参数作为参数。 – Obtice
他们是运行Windows还是Unix? (或别的?) –
第二个问题:为什么你需要专门启动'psql'?您也可以使用postgresql JDBC驱动程序对数据库执行命令。 –
- 1. 使用processBuilder执行shell命令并与它进行交互
- 2. 如何交互使用php命令行?
- 3. ProcessBuilder getOutputStream并与进程进行交互
- 4. 与命令行进程交互
- 5. 使用java的交互式命令Runtime.getRunTime.exec()
- 6. 如何应对交互式Linux命令?
- 7. 使用Java ProcessBuilder与SQLite shell进行交互
- 8. 使用Ruby的命令行交互
- 9. 在Paramiko中运行交互式命令
- 10. 交互命令行模式emacs
- 11. 真正的交互式命令行
- 12. 交互式shell脚本命令行php
- 13. 使用c运行交互式命令行exe#
- 14. Java:如何使用命令行打开程序并进行交互
- 15. 执行交互shell命令
- 16. 我可以使用交互式命令行进行Squeak/Pharo开发吗?
- 17. 使用ProcessBuilder执行需要命令行输入的命令
- 18. Emacs如何在交互命令行模式下运行命令elisp
- 19. 如何在交互式环境中使用bash命令?
- 20. 如何使用python的交互式输入运行命令行程序?
- 21. textfield如何使用livecode进行交互?
- 22. 使用命令行非交互式拼写检查文件
- 23. 我可以使用Fabric来执行交互式shell命令吗?
- 24. Java应用程序与命令行进行交互
- 25. 使用Fabric.js进行交互式绘图
- 26. 如何以交互模式运行sbt multiple命令作为一个命令?
- 27. 如何从命令行向交互式telnet/ssh会话发送多个命令?
- 28. 如何执行PHP的交互式命令?
- 29. 如何自动执行交互式telnet命令?
- 30. 用apache commons运行交互命令exec
试试这个:-http://stackoverflow.com/questions/3468987/executing-another-application-from-java – Divya
当你调用'yourProcessBuilder.start()'时,它会返回一个'Process'对象。 'Process'具有'getOutputStream()'和'getInputStream()'方法,您可以使用它们读取/写入流程 – BackSlash
@BackSlash请问您能解释一下吗? – Obtice