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

wsewodh2  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(242)

我试图实现一个功能,以重新启动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”)被传递给父进程。但我不确定我的观察是否正确。

ztyzrc3y

ztyzrc3y1#

你没有考虑到的是,在程序要求输入密码之前,它们会刷新输入缓冲区。否则,很容易在密码提示符之前读取用户不小心键入的额外字符。
您必须提高代码的复杂性级别,以分析进程的输出,并在实际看到密码提示符后才打印到其stdin

相关问题