2014-11-24 12 views
1

, 내가 암호를 입력하라는 메시지가 있어요 : 나는 프로그래밍 방식으로 아파치 코 몬즈 Exec을 사용하여 동일한 정보를 표시 할 때"git pull"exec 명령이 중단되어 인쇄되지 않는 이유는 무엇입니까? 다음 명령을 실행하면

$ git pull 
Enter passphrase for key (...) 

을, 프로그램이 걸리면 아무것도 인쇄되지 않습니다

CommandLine cmd = new CommandLine("git"); 
cmd.addArgument("pull"); 
DefaultExecutor executor = new DefaultExecutor(); 
executor.setStreamHandler(new PumpStreamHandler(System.out, System.err, System.in)); 
executor.execute(cmd); 

이 예가 아무 것도 인쇄하지 않고 멈추는 이유는 무엇입니까? 네이티브 콘솔을 사용하는 동안 git 암호를 입력하라는 메시지가 표시됩니까?

답변

2

이것은 STDIN이 아닌 pseudo terminal에서 SSH 암호문을 읽어야하기 때문에 발생합니다. 부모 (프로그램)와 자식 (자식) 프로세스 사이에 의사 tty 통신 스트림을 만들고 해당 스트림을 통해 전체 통신을 수행해야합니다. 아이디어를 얻으려면 Pseudo terminal to use with ssh in java을보십시오.

또한 git은 암호를 묻지 않습니다. git 자체는 ssh (물론 리포지토리에만 사용되며 ssh를 통해 액세스 할 수 있음)에 의존하여 인증을 수행하지 않습니다. 여기

  1. git가 주어진 저장소 ssh를 통해 액세스 및 SSH 인증 에이전트가 컴퓨터 여부에 실행되고 있는지 여부를 ssh를 전송 감지
  2. ssh를 전송에게 호출을 감지 일련의 작업입니다.
  3. 에이전트가 감지되지 않으면 (사용자의 경우) 전송은 기본 콘솔 기반 인증으로 전환됩니다. ssh는 "실제 콘솔"을 기대하므로 간단한 stdin/stdout 리디렉션으로는 충분하지 않습니다.
  4. 또는 ssh 에이전트가 실행중인 경우 모든 키 확인이 에이전트에 전달됩니다.
  5. 다른 대체 에이전트 구현이있을 수 있습니다. 일부는 단순히 사용자에게 ssh 키를 잠금 해제하기위한 암호를 요청하고, 다른 것은 메모리 등에서 미리 잠금 해제 된 키 세트를 유지합니다. 에이전트 본성에 따라 콘솔에 암호 프롬프트를 표시하거나 프롬프트가있는 새로운 별도의 창을 열 수 있습니다. this page을 확인하십시오. 특히 Windows에서 SSH 인증을 설정하는 방법에 대한 아이디어를 얻으려면 putty/pageant에 관한 부분을 참조하십시오.

터미널 및 프로세스 실행 저수준 항목을 구현하는 데 JNA를 사용하는 pty4j을 살펴보십시오. 또는 JGit을 살펴보십시오.이 명령은 git의 순수한 java 재 구현이며 명령 행 유틸리티는 전혀 호출하지 않습니다. JGit은 예를 들어 Eclipse Git plugin 또는 Gerrit Code review system의 기반이되므로 정교하고 세련됩니다.

+0

이런 저수준 항목을 이해하지 않고도 Java에서 git 처리와 관련된 모든 문제를 해결할 수있는 방법에 대한 아이디어는 무엇입니까? 아마 도서관? –

+0

편집 후 : JGit은 현재 내가 사용하고있는 것입니다 : D, 감사합니다! –

+0

Ok :) jgit은 [jsch] (http://www.jcraft.com/jsch/)를 사용하여'git push'와'git fetch'와 같은 모든 ssh 관련 작업을 수행한다는 것을 기억하십시오. SSH 키 인증을 처리하기 위해'ssh-agent' 또는'pageant'와 같은 인증 에이전트를 사용하려면 [JSch Agent proxy] (http://www.jcraft.com/jsch-agent-proxy/)가 필요합니다 원격 저장소와 상호 작용할 때마다 암호를 입력 할 필요가 없기 때문에) – user3159253