Как сохранить соединения SSH живыми, используя SSHJ?

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

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

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

В руководстве по SSH просто говорится, что ServerAliveInterval

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

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

2 ответа

Решение

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

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

Начиная с версии 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,

Другие вопросы по тегам