2016-11-26 1 views
0

원격 시스템에 SSH를 통해 java를 사용하여 일부 명령을 보내려고합니다.sshxcute 세션이 다운되었습니다

나는 원격 시스템에서 SSHD 설정 파일을 조정하여 작업 코드의 다음 코드를 얻기 위해 관리했습니다 :

ConnBean connection = new ConnBean("remote.machine", "user", "password"); 
SSHExec ssh = SSHExec.getInstance(connection); 
ssh.connect(); 
ExecCommand cmd = new ExecCommand("echo 123"); 
ssh.exec(cmd); 

이 코드는 새로운 자바 프로젝트에 완벽하게 잘 작동합니다. 그러나 내 안드로이드 응용 프로그램 (Java로 작성된)에서 똑같은 코드를 사용하여 똑같은 sshxcute 항아리를 사용하면 JSchException이 세션이 종료되었음을 알게됩니다. 이는 ssh.connect() 단계가 실패했기 때문입니다.

그래서 새로운 Java 프로젝트에서 이것을 실행하고 Java 기반 Android 응용 프로그램에서 실행하는 것의 차이점은 무엇입니까?

나는과 같이 대신 JSch 연결을 사용하여 시도 :

JSch jsch = new JSch(); 
Session session = jsch.getSession("user", "remote.machine", 22); 
session.setPassword("password"); 
Properties prop = new Properties(); 
prop.put("StrictHostKeyChecking", "no"); 
prop.put("Compression", "no"); 
session.setConfig(prop); 

ChannelExec channel = (ChannelExec) session.openChannel("exec"); 
BufferedReader in=new BufferedReader(new InputStreamReader(channel.getInputStream())); 
channel.setCommand("echo 123"); 
channel.connect(); 
session.connect(); 

다시이 과정이 새로운 자바 프로젝트에서 작동하지만 내가 같은 예외가 안드로이드 응용 프로그램에서.

W/System.err: com.jcraft.jsch.JSchException: session is down 
W/System.err:  at com.jcraft.jsch.Session.openChannel(Session.java:752) 
W/System.err:  at net.neoremind.sshxcute.core.SSHExec.exec(SSHExec.java:164) 
W/System.err:  at pi.picontroller.MainControl.launchFifa(MainControl.java:28) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
W/System.err:  at android.view.View.performClick(View.java:5610) 
W/System.err:  at android.view.View$PerformClick.run(View.java:22260) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:751) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:154) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6077) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

내가 연결을 테스트에 추가하는 방법 :

private static boolean isReachable(String addr, int openPort, int timeOutMillis) { 
    try { 
     try (Socket soc = new Socket()) { 
      soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); 
     } 
     return true; 
    } catch (IOException ex) { 
     return false; 
    } 
} 
+0

차이점은 네트워크 구성이나 방화벽 또는 사용 권한과 관련이 있습니다. "원인"체인 (있는 경우)을 포함하여 예외에 대한 전체 스택 추적을 보여줍니다. –

+0

그것이 그것이 잘되어야한다고 생각한 것입니다. 스택 트레이스에는 출력이 거의 없습니다. 편집에서 stacktrace를 추가하여 아무 것도 만들 수 있는지 확인했습니다. – Tom

답변

0

내가 문제가 pi.picontroller.MainControl에 있어야한다고 생각

다음은 스택 트레이스입니다. JCshnet.neoremind.sshxcute 소스 코드를 보면 MainControl.launchFifa이 "연결되지 않음"상태의 세션을 사용해야한다는 것을 알 수 있습니다. 아무런 통보없이 그 상태에 들어가기 위해, MainControl은 예외를 부추 렀거나 리턴 코드를 무시했을 가능성이 큽니다.

네트워킹 환경의 (의심되는) 차이가 실제로 문제의 원인 일뿐만 아니라 문제 자체가 아니라고 생각됩니다.


당신이 우리를 보여 SSHExec를 사용하여 코드의 버전에서 상대 :

ssh.connect(); 

이 호출은 연결이 성공했는지 여부를 말할 부울을 반환합니다. 너는 그것을 확인하지 않고있다. 너해야 해.

예외가있는 연결이 실패하면 SSHExec.connect()은 예외를 기록하고 false를 반환합니다.

그래도 도움이되지 않으면 로깅 수준을 DEBUG로 설정하십시오.

+0

감사합니다. 그것은 문제가 sshxcute가 아니라 실제로 연결 자체와 함께있을 수있는 루트를 지적했습니다. 연결을 테스트하기 위해 질문에 추가 한 클래스를 작성했는데 실패했다. 이제 여기에서 디버깅을 계속할 수 있습니다. – Tom

관련 문제