2012-11-21 61 views
5

我正在使用SSH Ganymed库别名Trilead别名Orion。Java Ganymed Trlead Orion ssh会话超时

我想了解会议的具体行为,因为我需要保持开了很长时间的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截取并且不打印连接丢失消息 2)当执行

Session sess = conn.openSession(); 

,处理块并没有任何反应,直到我不不能连接网络接口再次。 这是因为,看着Ganymed代码,似乎由于没有检测到断开连接事件,所以会话打开并且有一个锁打开会话,直到它成功。

所以我的问题是: 1)这种行为是通缉还是这是一个错误? 2)有什么办法可以在Connection.openSession()方法和Connection.connect()方法中设置超时?

在此先感谢。

回答

2

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

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

在sshd服务器可以配置

ClientAliveInterval

TCPKEEPALIVE

ClientAliveCountMax

这些参数将决定服务器多久期待从一些数据之前等待客户端,他多久会接受一个简单的保活包而不是真实的数据。在客户端,您可以配置

ServerAliveInterval

如果ClientAliveInterval比ServerAliveInterval小 - 服务器期望保持活跃分组往往比客户端发送他们 - 你将ClientAliveInterval后断开连接不活动的数量。有了这个,你可以测试你的代码。

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

有无alook这里http://docs.oseems.com/general/application/ssh/disable-timeout

我认为,在服务器或客户机的重启仍然会导致断线。如果您的客户机重新启动,则无论如何您都需要重新运行整个代码,以防重启服务器时,连接监视器将启动并重新连接。