Как сохранить соединения SSH живыми, используя SSHJ?
Я занимаюсь разработкой библиотеки, которая использует SSHJ для передачи SFTP. Поскольку запросы частые, я подумал, могу ли я просто оставить соединение открытым.
Очевидно, что это ничего не даст, если сервер часто прерывает соединение. Поскольку у меня нет контроля над сервером, я должен поддерживать соединение: с обычным SSH-клиентом я могу указать ServerAliveInterval
и пусть клиент сделает это за меня.
Я хотел бы сделать то же самое с SSHJ, но я не знаю, какое сообщение отправить.
В руководстве по SSH просто говорится, что ServerAliveInterval
Устанавливает интервал ожидания в секундах, после которого, если от сервера не было получено никаких данных, ssh(1) отправит сообщение через зашифрованный канал, чтобы запросить ответ от сервера.
Вот мне и интересно: какое сообщение отправлено? Как я мог воспроизвести это сообщение через SSHJ?
2 ответа
Извините, это не задокументировано, но вы можете установить сердцебиение:
Начиная с версии 0.11.0, вы можете использовать встроенный 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
,