2012-11-21 60 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

我認爲,在服務器或客戶機的重啓仍然會導致斷線。如果您的客戶機重新啓動,則無論如何您都需要重新運行整個代碼,以防重啓服務器時,連接監視器將啓動並重新連接。