3

当通过 SSH 连接执行命令时,命令执行通常会失败并出现异常 - “net.schmizz.sshj.connection.ConnectionException: Connection reset Exception is throw”。

问题描述:

我使用 net.schmizz.sshj.SSHClient 创建了一个到主机的 SSH 连接实例。我使用这个 SSH 连接执行了一堆命令,最后关闭了连接。

在检查我的 java 代码执行日志时,我经常会看到错误

2018-04-12T06:15:23.288Z ERROR n.s.s.t.TransportImpl [die:589] [reader] - Dying because - {}
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at net.schmizz.sshj.transport.Reader.run(Reader.java:50)
2018-04-12T06:15:23.288Z INFO  n.s.s.t.TransportImpl [notifyDisconnect:182] [reader] - Disconnected - UNKNOWN

java代码执行将继续运行。

但是当使用 SSH 连接执行命令时,如果这个 java.net.SocketException: Connection reset Exception 来了,我的 java 代码执行就终止了。

 2018-04-11T12:02:51.755Z INFO  c.v.v.u.SSHUtil [executeRemoteSSHCommand:861] [main] - Successfully executed 'tar -C /usr/local/ -zxvf /usr/local/VMware-GuestSDK-10.2.0-8225092.tar.gz --no-same-owner' command on remote ssh host
    2018-04-11T12:03:18.121Z ERROR n.s.s.t.TransportImpl [die:589] [reader] - Dying because - {}
    java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at net.schmizz.sshj.transport.Reader.run(Reader.java:50)
    2018-04-11T12:03:18.123Z INFO  n.s.s.t.TransportImpl [notifyDisconnect:182] [reader] - Disconnected - UNKNOWN
    2018-04-11T12:03:18.127Z ERROR n.s.c.Promise [tryRetrieve:175] [main] - <<chan#6 / open>> woke to: net.schmizz.sshj.connection.ConnectionException: Connection reset
    2018-04-11T12:03:18.130Z ERROR c.v.v.e.OutcomePrinter [afterInvocation:40] [main] - exception thrown 
    net.schmizz.sshj.connection.ConnectionException: Connection reset
        at net.schmizz.sshj.connection.ConnectionException$1.chain(ConnectionException.java:32)
        at net.schmizz.sshj.connection.ConnectionException$1.chain(ConnectionException.java:26)
        at net.schmizz.concurrent.Promise.deliverError(Promise.java:96)
        at net.schmizz.concurrent.Event.deliverError(Event.java:74)
        at net.schmizz.concurrent.ErrorDeliveryUtil.alertEvents(ErrorDeliveryUtil.java:34)
        at net.schmizz.sshj.connection.channel.AbstractChannel.notifyError(AbstractChannel.java:226)
        at net.schmizz.sshj.connection.channel.direct.SessionChannel.notifyError(SessionChannel.java:224)
        at net.schmizz.sshj.common.ErrorNotifiable$Util.alertAll(ErrorNotifiable.java:35)
        at net.schmizz.sshj.connection.ConnectionImpl.notifyError(ConnectionImpl.java:258)
        at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:597)
        at net.schmizz.sshj.transport.Reader.run(Reader.java:68)
    Caused by: net.schmizz.sshj.common.SSHException: Connection reset
        at net.schmizz.sshj.common.SSHException$1.chain(SSHException.java:36)
        at net.schmizz.sshj.common.SSHException$1.chain(SSHException.java:29)
        at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:591)
        ... 1 common frames omitted
    Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at net.schmizz.sshj.transport.Reader.run(Reader.java:50)
    2018-04-11T12:03:18.131Z INFO  c.v.v.e.OutcomePrinter [afterInvocation:47] [main] - OUTCOME:FAIL

问题:

SSH连接通常会断开并重新连接,但是当我通过此SSH连接执行命令时,如果发生断开连接,它永远不会重新连接net.schmizz.sshj.connection.ConnectionException:抛出连接重置异常。

我的查询:

如何克服我的 Java 代码中的 ssh 断开连接问题,尤其是在通过 SSH 连接执行命令时?

谢谢。

4

2 回答 2

1

来自 javadoc:SocketException:抛出以指示创建或访问 Socket 时出错。

所以基本上你没有办法阻止这种情况,只要它不是你的系统造成的,例如。连接断开。通常这个错误是因为服务器出于某种原因断开了您的客户端。

您可能能够做的是,如果抛出错误,您只需让客户端重新连接。或者,如果这是一个用户操作的客户端,您可以监控并行线程中的连接,并在用户知道连接丢失之前让客户端重新连接。

于 2018-07-19T11:33:57.770 回答
0

可能是因为 ssh 主机验证。首先尝试从该服务器 ssh,以便将其添加到已知主机。

于 2019-06-27T11:45:16.443 回答