我试图实现一个功能,以重新启动PostgreSQL服务器从Java代码使用Runtime.getRuntime().exec()方法。如果PostgreSQL服务器未启用SSL,但如果PostgreSQL服务器启用SSL,并且私钥使用密码加密,则该方法工作正常,需要传递密码。我尝试用下面的代码来实现相同的,
String postgreSQLRestartCMD =
"/u/postgreSQL/pg_ctl -D /u/postgreSQL/data restart -w";
//-w option waits until the passphase is sent
final Process restartPosgreSQLServer = Runtime.getRuntime().exec(postgreSQLRestartCMD);
PrintStream ps = new PrintStream(restartPosgreSQLServer.getOutputStream());
ps.println("keyPassword"); // sending passphasse here
new Thread(new Runnable() {
@Override
public void run() {
try {
IOUtils.copy(restartPosgreSQLServer.getInputStream(), logWriter);
}
catch (final IOException e) {
logWriter.println("Error occurred while reading InputStream.");
e.printStackTrace(logWriter);
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
IOUtils.copy(restartPosgreSQLServer.getErrorStream(), logWriter);
}
catch (final IOException e) {
logWriter.println("Error occurred while reading ErrorStream.");
e.printStackTrace(logWriter);
}
}
}).start();
int returnStatus = restartPosgreSQLServer.waitFor();
if (returnStatus == 1) {
logWriter.println("Error has occured while running PostgreSQL server.");
} else {
logWriter.println("PostgreSQL has started successfully.");
}
但是服务器没有启动。我在Linux上尝试。在控制台,它被下面的一行卡住了,我猜密码没有正确发送。
Enter PEM pass phrase:
这是哪里出了问题,为什么没有发送密码?
编辑
在进一步挖掘时,我发现Runtime.getRuntime().exec(cmd)正在创建新进程,我的ps.println(“password”)被传递给父进程。但我不确定我的观察是否正确。
1条答案
按热度按时间ztyzrc3y1#
你没有考虑到的是,在程序要求输入密码之前,它们会刷新输入缓冲区。否则,很容易在密码提示符之前读取用户不小心键入的额外字符。
您必须提高代码的复杂性级别,以分析进程的输出,并在实际看到密码提示符后才打印到其
stdin
。