You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中SSH2握手超时求助:手动上传正常但代码报错

解决Node.js SSH连接握手超时问题

我来帮你排查这个SSH握手超时的问题——既然手动用相同参数能正常连接,说明服务器本身是没问题的,问题大概率出在Node.js客户端的配置或者运行环境上,咱们一步步来试:

  • 先确认SSH客户端库的版本
    如果你用的是ssh2这类常用库,旧版本可能存在兼容性问题。试试升级到最新稳定版:

    npm update ssh2
    
  • 调整握手超时时间并禁用代理
    你已经设置了readyTimeout: 99999,但有时候网络波动或者隐性代理会拖慢连接。可以把超时时间调得更长(比如120000,也就是2分钟),同时显式禁用代理(避免Node.js自动走系统代理):

    .connect({
      host: 'hostname without http',
      port: 22,
      debug: console.log,
      readyTimeout: 120000,
      username: 'name',
      password: 'password',
      agent: false // 禁用自动代理
    });
    
  • 匹配服务器的SSH加密算法
    服务器的sshd配置可能限制了特定的密钥交换或加密算法,而Node.js客户端默认的算法和你手动用的OpenSSH可能不匹配。可以在连接配置里指定服务器支持的算法(你可以查看服务器/etc/ssh/sshd_config里的KexAlgorithms和Ciphers字段):

    .connect({
      // 其他现有配置
      algorithms: {
        kex: ['diffie-hellman-group1-sha1', 'ecdh-sha2-nistp256'],
        cipher: ['aes128-ctr', 'aes192-ctr', 'aes256-ctr']
      }
    });
    
  • 先测试底层TCP连接
    先排除网络层面的问题,用Node.js的net模块测试能否连上服务器的22端口:

    const net = require('net');
    const socket = net.createConnection(22, 'hostname without http');
    
    socket.on('connect', () => console.log('TCP连接成功,网络没问题!'));
    socket.on('error', (err) => console.log('TCP连接失败:', err.message));
    

    如果TCP连接失败,那就要检查Node进程的网络权限、防火墙规则等;如果TCP能连上,再聚焦SSH握手的细节。

  • 分析debug日志的细节
    你已经开启了debug: console.log,仔细看看日志里的输出——握手到哪一步卡住了?是密钥交换阶段还是认证阶段?这些细节能帮你精准定位问题。

如果以上方法都没解决,你可以把debug日志的具体内容贴出来,咱们再进一步排查。

内容的提问来源于stack exchange,提问作者surenfeb14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:15:50