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

Node.js ssh2库流式传输遇4096长度字符串时中断问题咨询

Node.js ssh2库执行长命令结果截断问题修复

你的代码存在几个关键问题,导致长命令输出被截断或无法完整收集:

  • 变量拼写错误:conn.exec回调里的参数stram应为stream,这个错误会导致后续stream事件绑定失败,仅能收集到第一部分数据
  • 不必要的异步处理:data.toString()是同步操作,无需使用await,异步处理会导致数据收集逻辑混乱,可能丢失分片
  • stderr处理逻辑不当:在stderr的data事件中直接reject会导致一旦出现错误输出就立即终止Promise,无法收集完整的标准输出;同时应该收集所有错误信息,而非仅处理第一条
  • 语法错误:connect方法的参数未用大括号包裹,会导致连接失败

修复后的完整代码如下:

const Client = require('ssh2').Client;

const exec = (command) => {
  const conn = new Client();

  return new Promise((resolve, reject) => {
    conn.on('ready', () => {
      let stdout = [];
      let stderr = [];

      conn.exec(command, (err, stream) => {
        if (err) {
          conn.end();
          return reject(err);
        }

        stream
          .on('data', (data) => {
            stdout.push(data.toString());
          })
          .on('close', (exitCode) => {
            conn.end();
            if (exitCode !== 0 || stderr.length > 0) {
              return reject(new Error(`命令执行失败,退出码:${exitCode},错误信息:${stderr.join('')}`));
            }
            resolve(stdout.join(''));
          })
          .stderr.on('data', (data) => {
            stderr.push(data.toString());
          });
      });
    }).connect({
      host: HOST_IP,
      port: 22,
      username: USERNAME,
      password: PASSWORD
    });

    conn.on('error', (err) => {
      conn.end();
      reject(err);
    });
  });
};

修复后的代码会:

  • 正确收集所有标准输出的分片数据,最终拼接成完整字符串返回
  • 完整收集所有错误输出,在命令执行结束后统一处理错误
  • 修复语法与逻辑错误,确保stream事件正常绑定
  • 通过命令退出码与错误输出来更准确地判断执行结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:20:40