2012-11-21 10 views
5

Ich verwende den SSH Ganymed-Bibliothek Alias ​​Trilead Alias ​​Orion.Java Ganymed Trelead Orion SSH Session Timeout

Ich versuche, das genaue Verhalten der Sitzung zu verstehen, da ich eine SSH-Verbindung für eine lange Zeit (möglicherweise für immer) geöffnet halten müsste, und es gerade zu schließen, wenn mein jvm oder so etwas heruntergeht.

Also, mein Problem ist das. Unter der Annahme, Ich mache das so etwas wie:

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(); 

Und in diesen 30 Sekunden, wenn der Thread schläft, trenne ich mein Netzwerk-Interface für ein Netzwerkproblem zu emulieren.

1), um das Trennungsereignis von der connectionMonitor und die Verbindung nicht unterbrochen wird verlorene Nachrichten gedruckt werden, nicht 2) Wenn

Session sess = conn.openSession(); 

ausgeführt wird, geschehen die Prozessblocks und nichts, bis i verbindet nicht Du die Netzwerkschnittstelle wieder. Das liegt daran, dass beim Anzeigen des Ganymed-Codes die Sitzung geöffnet wird, da das Unterbrechungsereignis nicht erkannt wird, und es eine Sperre gibt, die die Sitzung öffnet, bis sie erfolgreich ist.

Also meine Fragen sind: 1) Ist dieses Verhalten gewünscht oder ist das ein Fehler? 2) Gibt es eine Möglichkeit, eine Zeitüberschreitung in der Connection.openSession() - Methode sowie der Connection.connect() -Methode festzulegen?

Vielen Dank im Voraus.

Antwort

2

Ich denke, das Problem ist, dass Sie ssh Trennung nicht simulieren können, indem Sie das Kabel für 30 Sekunden abziehen. Sehen Sie sich das an: Wenn Sie eine SSH-Verbindung auf einem Terminal öffnen und das Kabel abziehen, blockiert der SSH-Client ebenfalls, aber wird automatisch wieder verbunden, nachdem das Kabel wieder eingesteckt wurde. Ich nehme an, Ihr Code wird das gleiche tun.

Normalerweise wird die Verbindung getrennt, wenn zwischen dem Client und dem Server für eine konfigurierte Zeitspanne keine Daten gesendet werden, d. H. Ein Zeitraum der Inaktivität, unabhängig davon, ob das Kabel angeschlossen ist oder nicht. Dieser Zeitraum ist standardmäßig größer als 30 Sekunden.

Auf dem sshd-Server können Sie

ClientAliveInterval

TCPKEEPALIVE

ClientAliveCountMax

Diese Parameter bestimmen, wie lange die Konfiguration des Servers, bevor erwarten einige Daten aus der warten Client, und wie oft wird er ein einfaches Keep-Alive-Paket anstelle von echten Daten akzeptieren . Auf dem Client Sie

ServerAliveInterval

Wenn die ClientAliveInterval kleiner ist als der ServerAliveInterval konfigurieren können - der Server Keep-Alive erwartet Pakete häufiger als der Client sie sendet - Sie werden nach dem ClientAliveInterval getrennt werden Menge an Inaktivität. Damit können Sie Ihren Code testen.

Diese Konfigurationen sind auch der Schlüssel, um Ihre SSH-Verbindung unbegrenzt offen zu halten. Wenn Ihr ServerAliveInterval kleiner als der ClientAliveInterval ist - der Client wird Keep-Alive-Pakete öfter senden, als der Server sie erwartet - Ihre Verbindung ist unbegrenzt offen.

Have alook hier http://docs.oseems.com/general/application/ssh/disable-timeout

Ich würde denken, dass ein Neustart der Server oder die Client-Maschine noch zu einer Trennung führen würde. Wenn Ihr Client-Rechner neu gestartet wird, müssen Sie den gesamten Code erneut ausführen. Im Falle eines Server-Neustarts würde der Verbindungsmonitor eingreifen und die Verbindung wiederherstellen.