将密码传递给Runtime.getRuntime()。exec

时间:2013-02-04 10:47:00

标签: java postgresql process runtime.exec postgresql-8.4

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

1 个答案:

答案 0 :(得分:2)

您没有考虑的是,在程序要求输入密码之前,他们刷新输入缓冲区。否则,为密码输入额外的字符将非常容易,用户在密码提示之前不小心输入了该字符。

您必须提高代码的复杂程度以分析流程的输出,并在实际见证密码提示后才打印到stdin