2010-08-03 4 views
1

목표 : 하나의 연결 및 다중 세션 또는 하나의 영구 세션을 가진 원격 제어 ssh 서버.Java 및 SSH : 연결 유지

문제 1 : 현재 SSH를 통해 일부 원격 제어를 수행하기 위해 sshj를 사용하고 있으며 제대로 작동하지만 제대로 작동하지 않는 것으로 보입니다. (호스트가 진정한 루트를 제공하지 못한다. 단지 sudo -i이므로 먼저 로그인해야한다). 문제 2 : 프롬프트를 처리하기 위해 ExpectJ를 다운로드했지만 로그인 한 상태에서 루트로 인증을받은 후 세션을 유지 관리하는 방법을 이해할 수 없습니다.

현재 해킹 솔루션

내가 모든 시간에 다시 로그온해야합니다 :

public class Expect { 
    Spawn shell; 
    ExpectJ exp; 
    String host; 
    int port; 
    String username; 
    String passwd; 
    boolean sudo = false; 
    public Expect(String host,int port,String username,String passwd) throws IOException, TimeoutException, ExpectJException{ 

     exp = new ExpectJ(5); 
     this.host = host; 
     this.port = port; 
     this.username = username; 
     this.passwd = passwd; 
     shell = exp.spawn(host, port, username, passwd); 
     shell.send("sudo netstat -natvp | grep Xtightvnc\n"); 
     System.out.println(shell.getCurrentStandardOutContents()); 
     try{ 
      shell.expect("[sudo] password for #######:"); 
      shell.send(passwd+"\n"); 
     } 
     catch (IOException ex){ 
      String err = ex.toString(); 
      if(!err.equals("java.io.IOException: End of stream reached, no match found")){ 
       throw new IOException(ex); 
      } 
     } 
    } 

질문 1 : 암호 프롬프트를 "기대"하는 데 사용할 수 sshj 수 있습니까? 나는 그 유형의 제어를 암시하는 문서를 찾을 수 없었다.

인용구 2 : 여러 통화를 할 수있는 영구 연결을 유지하기 위해 위의 Expect 코드를 어떻게 수정할 수 있습니까? 루트로 인증 된 상태에 도달했으나 초기 명령이 보내지면 Spawn이 항상 닫히면 상호 작용을 계속할 수 있기를 원합니다.

답변

1

질문 1 : 비밀번호 프롬프트를 "예상 하시겠습니까?"라는 질문에 sshj를 사용할 수 있습니까? 나는 그 유형의 제어를 암시하는 문서를 찾을 수 없었다.

주로 sshj가 제공하는 것은 쉘 또는 명령의 I/O 스트림에있는 핸들과 종료 상태와 같은 항목을 얻는 방법입니다.

인용구 2 : 여러 통화를 할 수있는 지속적인 연결을 유지하기 위해 위의 Expect 코드를 어떻게 수정할 수 있습니까? 루트로 인증 된 상태에 도달했으나 초기 명령이 보내지면 Spawn이 항상 닫히면 상호 작용을 계속할 수 있기를 원합니다.

다중 세션, 단일 SSH 연결을 통한 동시 세션조차도 지원됩니다. 그러나 하나의 쉘/명령/서브 시스템에 대해 하나의 세션 만 가질 수 있습니다.

Session.Shell (session.startShell을 통해) 또는 Session.Command (session.exec를 통해)와 같은 어떤 유형의 Session을 사용하고 있습니까? 후자의 경우 명령 실행이 완료되면 을 의미하며 예상되는 동작입니다.

일반적으로 Shell over Command는 권장하지 않지만 프롬프트와 관련하여 처리 할 수있는 ExpectJ가 장착되어 있으므로 해당 경로로 이동하는 것이 좋습니다. 문자 등이 울리는 데 문제가 있으면 (세션 번호 할당 애셋을 사용하는 session.allocateDefaultPTY 대신 session.allocatePTY 옵션을 사용하여 source for allocateDefaultPTY을 살펴보십시오.)

코드 예제 : Shell, Command

또한

당신이 sshj 버그 아래 문제를 좁힐 경우, 이슈 트래커에보고 할 :)