2014-03-19 2 views
2

Postgresql psql 명령을 실행하기 위해 ProcessBuilder를 사용하고 있습니다. 하지만 암호를 줄 수는 없지만 매개 변수를 전달해야 암호를 입력하라는 메시지가 나타납니다. ProcessBuilder를 사용하여이 대화 형 매개 변수를 전달하려면 어떻게해야합니까?대화 형 명령에 ProcessBuilder를 사용하는 방법은 무엇입니까?

+1

이 시도 :

이 조각은 어떻게 ProcessBuilder으로 그렇게하는 당신에게 아이디어를 줄 것이다 //stackoverflow.com/questions/3468987/executing-another-application-from-java – Divya

+2

'yourProcessBuilder.start()'를 호출하면, 그것은'Process' 객체를 리턴 할 것입니다. 'Process'는'getOutputStream()'과'getInputStream()'메소드를 가지고 있습니다.이 메소드를 사용하여 프로세스를 읽고 쓸 수 있습니다. – BackSlash

+0

@BackSlash 좀 더 설명해 주시겠습니까? – Obtice

답변

3

질문 제목은 ProcessBuilder에 대한 일반적인 질문이지만, OP에는 구체적으로 psql이 나와 있기 때문에 더 잘 작동하는 특정 솔루션이 있으며 프로세스 출력을 읽고 응답 할 필요가 없습니다.

그러나 염두에 두어야 할 문제는 ps 명령을 사용하여 (적어도 유닉스에서) 발견 될 수 있기 때문에 명령 줄이나 환경 변수에서 암호를 전달하는 것이 완전히 안전하지 않다는 것입니다.

해결 방법 1 :이 pass the password in the PGPASSWORD environment variable의 옵션이지만 기계의 다른 사용자가 볼 수있는이 권장되지 않습니다 .

해결 방법 2 :가 (권장) 이 생각보다 안전한 옵션이며, 그것은 당신이 psql 프로그램을 실행하려고하는 사용자의 계정에 암호를 포함 create a .pgpass or pgpass.conf file이다.

파일은 다음 형식 라인을 포함해야합니다 : 자세한 내용은 PostgreSQL의 문서에 대한 위의 텍스트

hostname:port:database:username:password 

내가 추가 한 링크를.

또한이 pgpass.conf 파일이 환경 변수 PGPASSFILE을 사용하여 디스크에있는 위치를 알 수 있으며 psql을 호출하기 전에 Java에서이 파일을 쓸 수 있습니다. -http :

String hostname = "..."; 
int port = 5432; 
String database = "..."; 
String username = "..."; 
String password = "..."; 
File file = File.createTempFile("pgpass", "conf"); 
// TODO: ensure file permissions are correct 
try (Writer w = new FileWriter(file)) { 
    w.write(String.format("%s:%d:%s:%s:%s\n", hostname, port, database, username, password)); 
} 
ProcessBuilder processBuilder = new ProcessBuilder("psql"); // add other options to psql to the argument list 
processBuilder.environment().put("PGPASSFILE", file.getAbsolutePath()); 
processBuilder.start(); 
+0

답변 해 주셔서 감사합니다.하지만 50 개 이상의 클라이언트에서 실행되는 응용 프로그램을 개발하고자하며 postgresql 환경이 어떻게되는지 알지 못합니다. 암호와 다른 인수를 사용자로부터 매개 변수로 가져옵니다. – Obtice

+0

Windows 또는 Unix를 실행하고 있습니까? (또는 다른 무엇입니까?) –

+0

두 번째 질문 : 왜 psql을 구체적으로 시작해야합니까? postgresql JDBC 드라이버를 사용하여 데이터베이스에 대해 명령을 실행할 수도 있습니다. –

관련 문제