1

Runtime.getRuntime().exec() メソッドを使用して Java コードから PostrgeSQL サーバーを再起動する機能を実装しようとしています。PostgreSQL サーバーで SSL が有効になっていない場合でも、このメソッドは正常に機能しますが、PostreSQL サーバーで 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で試しています。コンソールでは、以下の行が表示され、passohase が適切に送信されていないと思います。

     Enter PEM pass phrase:

これはどこで問題が発生し、パスフェーズが送信されないのはなぜですか?

編集

さらに掘り下げると、Runtime.getRuntime().exec(cmd) が新しいプロセスを作成していることがわかりました。私の ps.println("password") は親プロセスに渡されます。しかし、私の観察が正しいかどうかはわかりません。

4

1 に答える 1

2

考慮していないのは、プログラムがパスワードを要求する前に、入力バッファーをフラッシュすることです。そうしないと、ユーザーがパスワード プロンプトの前に誤って入力した余分な文字がパスワードとして読み取られる可能性が非常に高くなります。

プロセスの出力を分析し、stdin実際にパスワード プロンプトを確認した後にのみ出力するために、コードの複雑さのレベルを上げる必要があります。

于 2013-02-04T11:36:37.980 に答える