2017-02-25 286 views
4

我正在嘗試使用JSch通過ssh連接到我的計算機,然後運行命令。JSchException超時:套接字未建立

但是,當我運行代碼時,我從未連接到計算機。和以下錯誤:

I/System.out: com.jcraft.jsch.JSchException: timeout: socket is not established

這裏是我的相關代碼:

protected void sshTesting(){ 
    String name = ""; 
    String userName = "kalenpw"; 
    String password = "hunter2"; 
    String ip = "192.168.0.4"; 
    int port = 22; 
    String command = "cmus-remote -u"; 

    try{ 
     JSch jsch = new JSch(); 
     Session session = jsch.getSession(userName, ip, port); 
     session.setPassword(password); 
     session.setConfig("StrictHostKeyChecking", "no"); 


     System.out.println("Establishing connection"); 
     session.connect(10); 

     Channel channel = session.openChannel("exec"); 
     ((ChannelExec)channel).setCommand(command); 
     channel.setInputStream(null); 
     channel.connect(10000); 

//   name = session.getUserName(); 
//   System.out.println(session.getHost()); 


    } 
    catch(Exception e){ 
     System.err.print(e); 
     System.out.print(e); 
    }   

} 

這是使用JSch我的第一次,所以我非常簡單,只是下面的它們的實例Exec.java之一。我發現這個答案JSch/SSHJ - Connecting to SSH server on button click,不幸的是我的代碼看起來像是以類似的方式建立連接,但沒有結果。我已經正常測試SSH到我的電腦,它工作正常,所以我不認爲這個問題是與服務器,但與我的代碼。

這裏是整個堆棧跟蹤:

W/System.err: com.jcraft.jsch.JSchException: timeout: socket is not establishedcom.jcraft.jsch.JSchException: timeout: socket is not established 
W/System.err:  at com.jcraft.jsch.Util.createSocket(Util.java:394) 
W/System.err:  at com.jcraft.jsch.Session.connect(Session.java:215) 
W/System.err:  at com.example.kalenpw.myfirstapp.RectangleClickActivity.sshTesting(RectangleClickActivity.java:97) 
W/System.err:  at com.example.kalenpw.myfirstapp.RectangleClickActivity$1.onCheckedChanged(RectangleClickActivity.java:56) 
W/System.err:  at android.widget.CompoundButton.setChecked(CompoundButton.java:165) 
W/System.err:  at android.widget.Switch.setChecked(Switch.java:1151) 
W/System.err:  at android.widget.Switch.toggle(Switch.java:1146) 
W/System.err:  at android.widget.CompoundButton.performClick(CompoundButton.java:123) 
W/System.err:  at android.view.View$PerformClick.run(View.java:22589) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:148) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:7325) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

RectangleClickActivity.java是我測試SSH的文件。

線97:session.connect(10);

線56:sshTesting();

+0

你有使用Wireshark的,看看它甚至嘗試連接看了看流量?如果沒有更多的信息,除了表明您的兩個系統之間存在網絡或防火牆問題之外,沒有人可以提供幫助。 –

+0

@JimGarrison是的,我可以通過終端連接。我剛剛嘗試過Wireshark,之前從未使用它,所以我不知道如何詳細分析它,但是當我嘗試連接時,我的計算機有幾個條目作爲目標,因此我相信它正在嘗試連接。我不確定網絡或防火牆是否屬於這個問題,因爲我在同一個本地網絡上,但也許有。我還能檢查什麼來確定? – kalenpw

+0

代碼中的哪一行會引發異常?同時發佈完整的堆棧跟蹤。 –

回答

2

問題結束了,我的配置設置爲session.setConfig("StrictHostKeyChecking", "no");,但由於某種原因,你需要創建一個配置,並設置StrictHostKeyChecking和然後將該配置添加到會話中,而不是直接設置它。

工作的代碼如下所示:

protected void sshTesting(){ 
    String name = ""; 
    String userName = "kalenpw"; 
    String password = "hunter2"; 
    String ip = "192.168.0.4"; 
    int port = 22; 
    String command = "cmus-remote -u"; 

    try{ 
     JSch jsch = new JSch(); 
     Session session = jsch.getSession(userName, ip, port); 
     session.setPassword(password); 

     //Missing code 
     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 
     // 


     System.out.println("Establishing connection"); 
     session.connect(10); 

     Channel channel = session.openChannel("exec"); 
     ((ChannelExec)channel).setCommand(command); 
     channel.setInputStream(null); 
     channel.connect(10000); 

//   name = session.getUserName(); 
//   System.out.println(session.getHost()); 

    } 
    catch(Exception e){ 
     System.err.print(e); 
     System.out.print(e); 
    }   

}