2016-11-26 130 views
0

我想通過SSH發送一些命令通過SSH到遠程機器。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項目。但是,當我在我的android應用程序(用Java編寫)中使用完全相同的代碼完全相同的sshxcute jar時,我得到一個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(); 

同樣,這個工作在一個新的Java項目,但不是在Android應用程序在那裏我得到了同樣的異常。

這裏的堆棧跟蹤:

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

這就是我認爲它也一樣。儘管堆棧跟蹤中幾乎沒有輸出。我已經在編輯中添加了堆棧跟蹤,以查看是否可以使用任何東西。 – Tom

回答

0

我認爲,這個問題必須在pi.picontroller.MainControl。查看JCshnet.neoremind.sshxcute東西的源代碼,顯然MainControl.launchFifa必須嘗試使用​​處於「未連接」狀態的會話。爲了在沒有任何通知的情況下進入該狀態,MainControl最有可能壓扁了異常,或忽略了返回碼。

我懷疑的是,在網絡環境中(懷疑)的區別其實只是針對該問題的觸發,而不是問題本身。


看你使用SSHExec,你給我們的代碼版本:

ssh.connect(); 

這個調用返回一個布爾說連接成功與否。你沒有檢查它。你應該。

請注意,如果連接失敗且發生異常,SSHExec.connect()將記錄該異常並返回false。

如果這沒有幫助,請嘗試將日誌級別設置爲DEBUG。

+0

非常感謝。它指出我認爲問題可能不在sshxcute中,但實際上與連接本身有關。我寫了我添加到問題的類來測試連接,結果失敗了。我現在可以繼續從這裏進行調試。 – Tom