【问题标题】:sshxcute session is downsshxcute 会话已关闭
【发布时间】:2016-11-27 17:27:45
【问题描述】:

我正在尝试使用 java 通过 SSH 向远程机器发送一些命令。

通过调整远程机器上的 sshd 配置文件,我设法使以下 sn-p 代码工作:

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;
    }   
}

【问题讨论】:

  • 不同之处在于网络配置或防火墙或权限。向我们展示异常的完整堆栈跟踪,包括“由”链(如果有)。
  • 我想也应该是这样。虽然堆栈跟踪中几乎没有任何输出。我在编辑中添加了堆栈跟踪,看看您是否可以从中做出任何事情。

标签: java android ssh


【解决方案1】:

我认为问题一定出在pi.picontroller.MainControl。查看JCshnet.neoremind.sshxcute 的源代码,很明显MainControl.launchFifa 必须尝试使用​​处于“未连接”状态的会话。要在没有任何通知的情况下进入该状态,MainControl 很可能已经压制了异常,或者忽略了返回码。

我怀疑网络环境中的(疑似)差异实际上只是问题的触发因素,而不是问题本身。


使用您向我们展示的SSHExec 查看您的代码版本:

ssh.connect();

此调用返回一个布尔值来说明连接是否成功。你不检查它。你应该。

请注意,如果连接失败并出现异常,SSHExec.connect() 将记录该异常并返回 false。

如果这没有帮助,请尝试将日志记录级别设置为 DEBUG。

【讨论】:

  • 非常感谢。它为我指出了问题可能不在于 sshxcute 而实际上在于连接本身的路线。我编写了已添加到问题中的类来测试连接,结果却失败了。我现在可以从这里继续调试了。
猜你喜欢
  • 2010-11-29
  • 2019-09-11
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多