2013-02-04 2 views
1

Runtime.getRuntime(). exec() 메소드를 사용하여 Java 코드에서 PostrgeSQL 서버를 다시 시작하는 기능을 구현하려고합니다. 이 방법은 PostgreSQL 서버가 SSL을 사용할 수 없지만 PostreSQL 서버가 SSL을 사용할 수 있고 개인 키가 암호로 암호화되어있는 경우 Passphase를 전달해야하는 경우 제대로 작동합니다. 동일한 코드를 구현하기 위해 아래 코드로 시도했습니다.Runtime.getRuntime()에 암호 전달 exec

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."); 
     } 

그러나 서버가 시작되지 않았습니다. 나는 리눅스에서 노력하고있다. 콘솔에서 그 라인 아래로 삼진지고 나는 passohase가 제대로 보내지지 않은 것 같아요.

 Enter PEM pass phrase: 

누가 잘못되었는지, 왜 통과 신호가 전송되지 않는지 다른 사람이 나를 지적 할 수 있습니까? 모든 제안이나 도움은 정말 감사하겠습니다. 제발 도와주세요. 미리 감사드립니다.

편집 : Runtime.getRuntime(). exec (cmd)가 새 프로세스를 작성하고 있음을 알았을 때 ps.println ("password")이 상위 프로세스로 전달됩니다. 그러나 나는 나의 관찰이 의례인지 아닌지 잘 모르겠습니다. 제발 도와주세요.

답변

2

귀하가 고려하지 않은 것은 프로그램이 암호를 요청하기 전에 입력 버퍼를 플러시 ()하는 것입니다. 그렇지 않으면 사용자가 실수로 암호를 입력하기 전에 입력 한 추가 문자를 암호로 읽는 것이 매우 쉬울 것입니다.

암호 출력을 분석하고 암호 프롬프트를 실제로 본 후에 만 ​​stdin으로 인쇄하려면 코드의 복잡성 수준을 높여야합니다.

관련 문제