1

我正在尝试使用 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") 被传递给父进程。但我不确定,我的观察是否正确。

4

1 回答 1

2

您没有考虑到的是,在程序要求输入密码之前,它们会刷新输入缓冲区。否则,很容易读入额外的密码字符,用户在密码提示之前不小心输入了这些字符。

您必须提高代码的复杂程度才能分析进程的输出并stdin仅在实际见证密码提示后打印到它。

于 2013-02-04T11:36:37.980 回答