2012-04-27 6 views
4

Я разрабатываю библиотеку, использующую SSHJ для передачи SFTP. Поскольку запросы часты, я задаюсь вопросом, могу ли я просто открыть соединение открытым.Как сохранить соединения SSH с помощью SSHJ?

Очевидно, что это ничего не достигнет, если сервер часто отключает соединение. Поскольку у меня нет контроля над сервером, я должен поддерживать соединение в сети: С обычным клиентом SSH я мог бы указать ServerAliveInterval и попросить клиента сделать это для меня.

Я хотел бы сделать то же самое с SSHJ, но я не знаю, какое сообщение отправить.

SSH manual только утверждает, что ServerAliveInterval

Задает интервал времени ожидания в секундах, после которого, если данные не были получены от сервера, SSH (1) будет посылать сообщение через зашифрованный канал для запроса ответа с сервера.

Так что мне интересно: Какое сообщение отправлено? Как я могу воспроизвести это сообщение через SSHJ?

ответ

6

К сожалению это не документировано, но вы можете установить сердцебиение:

https://github.com/hierynomus/sshj/blob/master/examples/src/main/java/net/schmizz/sshj/examples/RemotePF.java#L51

+0

В случае, если связь когда-либо ломается или изменяется, линия client.getTransport(). SetHeartbeatInterval (30); – Scott

+1

Он действительно сломан. –

+0

текущей версии 0.23.0, это должно быть 'sshClient.getConnection.getKeepAlive.setKeepAliveInterval (15)'. – LoranceChen

2

Начиная с версии 0.11.0, вы можете use built-in KeepAliveProvider:

public class KeepAlive { 

    public static void main(String... args) 
      throws IOException, InterruptedException { 
     DefaultConfig defaultConfig = new DefaultConfig(); 
     defaultConfig.setKeepAliveProvider(KeepAliveProvider.KEEP_ALIVE); 
     final SSHClient ssh = new SSHClient(defaultConfig); 
     try { 
      ssh.addHostKeyVerifier(new PromiscuousVerifier()); 
      ssh.connect(args[0]); 
      ssh.getConnection().getKeepAlive().setKeepAliveInterval(5); //every 60sec 
      ssh.authPassword(args[1], args[2]); 
      Session session = ssh.startSession(); 
      session.allocateDefaultPTY(); 
      new CountDownLatch(1).await(); 
      try { 
       session.allocateDefaultPTY(); 
      } finally { 
       session.close(); 
      } 
     } finally { 
      ssh.disconnect(); 
     } 
    } 
} 

Чтобы отправить сердцебиения, вы может использовать KeepAliveProvider.HEARTBEAT.

 Смежные вопросы

  • Нет связанных вопросов^_^