Java Ganymed Trlead Orion ssh会话超时

时间:2012-11-21 15:16:58

标签: java session ssh 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();

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

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

Session sess = conn.openSession();

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

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

提前致谢。

1 个答案:

答案 0 :(得分:3)

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

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

在sshd服务器上,您可以配置

  

ClientAliveInterval

     

TCPKeepAlive

     

ClientAliveCountMax

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

  

ServerAliveInterval

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

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

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

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