Java Ganymed Trlead Orion ssh会话超时

use*_*377 5 java ssh session libssh2

我正在使用SSH Ganymed库别名Trilead别名Orion.

我试图理解会话的确切行为,因为我需要保持ssh连接打开很长时间(也许永远),并在我的jvm关闭或类似的事情时关闭它.

所以,我的问题是这个.假设我做了这样的事情:

Connection conn = new Connection(this.hostName, this.port);
conn.addConnectionMonitor(new ConnectionMonitor()
{            
  @Override
  public void connectionLost(Throwable reason)
  {
     System.out.println("Connection Lost "   reason.getMessage());
  }
});
conn.connect(null, 1000, 20000);
conn.authenticateWithPublicKey(this.user, keyfile, this.password);
Thread.sleep(30000); //sleep the Thread for 30 seconds
Session sess = conn.openSession();
sess.execCommand("ls");
conn.close();
Run Code Online (Sandbox Code Playgroud)

并且,在线程休眠的30秒内,我断开网络接口以模拟网络问题.

1)connectionMonitor不拦截disconnect事件,并且不打印Connection Lost消息2)When

Session sess = conn.openSession();
Run Code Online (Sandbox Code Playgroud)

执行后,进程阻塞,没有任何反应,直到我再也没有连接网络接口.这是因为,查看Ganymed代码,似乎由于未检测到断开事件,会话被打开,并且会打开会话直到成功.

所以我的问题是:1)这种行为是否需要或者这是一个错误?2)有没有办法在Connection.openSession()方法和Connection.connect()方法中设置超时?

提前致谢.

Mar*_*sel 3

我认为问题是你不能通过拔掉电缆30秒来模拟ssh断开连接。看一下:如果您在终端上打开 ssh 连接并拔下电缆,ssh 客户端也会阻止,但在再次插入电缆后会自动重新连接。我假设你的代码也会做同样的事情。

如果客户端和服务器之间在配置的时间内(即一段不活动时间)没有发送数据,则通常会断开连接,无论电缆是否插入。默认情况下,此时间段很可能大于 30 秒。

在sshd服务器上你可以配置

客户端活动间隔

TCP保活

最大客户端存活数

这些参数将确定服务器在期望来自客户端的某些数据之前等待多长时间,以及他接受简单的保持活动数据包而不是真实数据的频率。在客户端可以配置

服务器活动间隔

如果 ClientAliveInterval 小于 ServerAliveInterval - 服务器期望保持活动数据包的频率比客户端发送数据包的频率高 - 在 ClientAliveInterval 不活动量之后,您将断开连接。这样你就可以测试你的代码了。

这些配置也是保持 ssh 连接无限期开放的关键。如果您的 ServerAliveInterval 小于 ClientAliveInterval - 客户端将比服务器预期的更频繁地发送保持活动数据包 - 您的连接将无限期地打开。

看看这里https://www.simplified.guide/ssh/disable-timeout

我认为重新启动服务器或客户端计算机仍然会导致断开连接。如果您的客户端计算机重新启动,您无论如何都需要再次运行整个代码,如果服务器计算机重新启动,连接监视器将启动并可以重新连接。