【问题标题】:How to keep SSH connections alive using SSHJ?如何使用 SSHJ 保持 SSH 连接处于活动状态?
【发布时间】:2015-12-11 18:46:04
【问题描述】:

我正在开发一个使用 SSHJ 进行 SFTP 传输的库。 由于请求很频繁,我想知道是否可以保持连接打开。

显然,如果服务器频繁地使连接超时,这将无济于事。 由于我无法控制服务器,因此我必须保持连接处于活动状态: 使用常规 SSH 客户端,我可以指定 ServerAliveInterval 并让客户端为我执行此操作。

我想对 SSHJ 做同样的事情,但我不知道要发送什么消息。

SSH manual 只是声明ServerAliveInterval

以秒为单位设置超时间隔,如果在此之后没有从服务器接收到数据,ssh(1) 将通过加密通道发送消息以请求服务器响应。

所以我想知道: 发送什么消息?如何通过 SSHJ 重现此消息?

【问题讨论】:

    标签: java ssh timeout sshj


    【解决方案1】:

    【讨论】:

    • 如果链接中断或更改,则该行是 client.getTransport().setHeartbeatInterval(30);
    • 确实坏了。
    • 当前版本0.23.0,应该是sshClient.getConnection.getKeepAlive.setKeepAliveInterval(15)
    • heartbeat 和 keepalive 有什么区别?
    • @golimar - 你的问题是不久前的 - 但我也有同样的问题。看起来最初的心跳解决方案是定期发送 Message.IGNORE 。从我的挖掘看来,这在 (github.com/hierynomus/sshj/issues/166) 中得到了增强,Marboni 的答案引用了 (0.11.0)。这引入了 KEEP_ALIVE 选项,而是发送标准 ssh keep-alive 消息。注意:此修复将 HEARTBEAT 保留为默认位置 - 因此要使用它,您必须在创建 DefaultConfig 后使用 setKeepAliveProvider(KeepAliveProvider.KEEP_ALIVE)。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-04-12
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2012-01-03
      • 2021-09-13
      • 2013-08-27
      • 2019-09-01
      相关资源
      最近更新 更多