我正在尝试使用java通过SSH向远程计算机发送一些命令。
我设法通过调整远程计算机上的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)
我认为问题必须在pi.picontroller.MainControl
。查看JCsh
和net.neoremind.sshxcute
内容的源代码,很明显MainControl.launchFifa
必须尝试使用"未连接"中的会话。州。为了在没有任何通知的情况下进入该状态,MainControl
很可能压缩了异常,或者忽略了返回代码。
我怀疑网络环境中的(可疑的)差异实际上只是问题的触发因素,而不是问题本身。
使用您向我们展示的SSHExec
查看您的代码版本:
ssh.connect();
此调用返回一个布尔值,表示连接是否成功。你没有检查它。你应该。
请注意,如果连接失败并出现异常,SSHExec.connect()
将记录异常并返回false。
如果这没有帮助,请尝试将日志记录级别设置为DEBUG。