我想通過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;
}
}
區別將與網絡配置或防火牆或權限有關。向我們顯示包括「由...引起」鏈(如果有的話)在內的異常的完整堆棧跟蹤。 –
這就是我認爲它也一樣。儘管堆棧跟蹤中幾乎沒有輸出。我已經在編輯中添加了堆棧跟蹤,以查看是否可以使用任何東西。 – Tom