我正在尝试使用Runtime.getRuntime()。exec()方法实现从Java代码重启PostrgeSQL服务器的功能。如果PostgreSQL服务器未启用SSL但如果PostreSQL服务器启用了SSL并且私钥使用密码加密,则该方法正常工作,则需要传递passphase。我尝试用下面的代码实现相同的,
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。在控制台中,它被下面的线击中,我猜passohase没有正确发送。
Enter PEM pass phrase:
有人能指出我哪里出错了,为什么不发送passphase?任何建议或帮助将非常感激。请帮帮我。提前谢谢。
编辑:在进一步挖掘后,我发现Runtime.getRuntime()。exec(cmd)正在创建新进程,我的ps.println(“password”)被传递给父进程。但我不确定,我的观察是否是仪式。请帮帮我。答案 0 :(得分:2)
您没有考虑的是,在程序要求输入密码之前,他们刷新输入缓冲区。否则,为密码输入额外的字符将非常容易,用户在密码提示之前不小心输入了该字符。
您必须提高代码的复杂程度以分析流程的输出,并在实际见证密码提示后才打印到stdin
。