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

如何使用Express、SSH2与ShellJS?远程命令输出无法在浏览器显示

解决SSH2 + Express 命令输出无法在浏览器显示的问题

我来帮你搞定这个问题~你遇到的情况是因为没有正确把SSH命令的输出传递给Express的响应对象,而且在连接和数据流处理上有一些小疏漏。咱们直接看修复后的代码,再一步步说关键点:

修复后的完整代码

var express = require('express');
var app = express();
var Client = require('ssh2').Client;

// 定义接口返回uptime结果
app.get('/get-uptime', function(req, res) {
  // 每次请求创建新SSH连接,避免全局连接的请求冲突
  var conn = new Client();
  
  // 替换成你的远程服务器配置
  conn.connect({
    host: '你的远程服务器IP',
    port: 22,
    username: '服务器用户名',
    password: '服务器密码' // 推荐密钥认证:privateKey: require('fs').readFileSync('./你的私钥路径')
  });

  // 连接成功后的处理
  conn.on('ready', function() {
    console.log('已连接到远程服务器');
    // 执行uptime命令
    conn.exec('uptime', function(err, stream) {
      if (err) {
        // 命令执行出错时返回错误信息并关闭连接
        res.status(500).send(`执行命令失败: ${err.message}`);
        conn.end();
        return;
      }

      let commandOutput = '';
      // 收集命令的标准输出
      stream.on('data', function(data) {
        commandOutput += data.toString();
        console.log('控制台输出:', data.toString());
      });
      // 收集命令的错误输出
      stream.stderr.on('data', function(data) {
        commandOutput += `错误信息: ${data.toString()}`;
        console.log('错误输出:', data.toString());
      });
      // 命令执行完成后,把结果返回给浏览器
      stream.on('close', function(code, signal) {
        console.log(`命令执行完成,退出码: ${code}`);
        // 用<pre>标签保持输出格式,可读性更强
        res.send(`<pre>${commandOutput}</pre>`);
        // 关闭SSH连接,避免资源泄漏
        conn.end();
      });
    });
  });

  // 处理SSH连接错误
  conn.on('error', function(err) {
    console.error('连接服务器失败:', err.message);
    res.status(500).send(`连接远程服务器失败: ${err.message}`);
  });
});

// 启动服务器
app.listen(3000, function() {
  console.log('服务器已启动,访问 http://localhost:3000/get-uptime 查看结果');
});

关键修复点说明

  • 每次请求新建连接:原来的全局conn会导致多请求冲突,现在每次请求独立创建连接更安全
  • 收集输出数据:通过监听stream的data事件,把命令输出拼接成完整字符串,而不是只打印到控制台
  • 响应浏览器并清理资源:在命令执行完成(stream触发close事件)时,用res.send()把结果传给浏览器,同时关闭SSH连接
  • 完善错误处理:添加了连接错误、命令执行错误的反馈逻辑,避免浏览器一直处于等待状态

额外建议

  • 不要把服务器密码、IP等敏感信息硬编码,建议用环境变量(比如process.env.SSH_HOST)管理
  • 如果频繁发起请求,可考虑使用SSH连接池复用连接,提升性能
  • 优先使用密钥认证代替密码认证,安全性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:14:46