node.js ssh2 => 如何关闭连接并处理 ECONNRESET 错误

Posted

技术标签:

【中文标题】node.js ssh2 => 如何关闭连接并处理 ECONNRESET 错误【英文标题】:node.js ssh2 => how to close connection and handle ECONNRESET error 【发布时间】:2020-05-24 10:07:42 【问题描述】:

在一个 node.js 项目中,我在远程 Windows 机器上安装并配置了 OPENSSH,并尝试使用 ssh2(最新版本)包从本地 Windows 服务器执行命令。远程机器上有一个 exe 文件一直运行,直到使用取消执行。

这是我为用户请求提供服务的路由文件代码。

const express = require('express');
const Route = express.Router();
var Client = require('ssh2').Client;
var conn = new Client();

Route.route('/start').get(function(req, res) 

    var v_host = 'xxx.xxx.xxx.xx';
    var v_user = 'Administrator';
    var v_pass = 'password';

    conn.on('ready', function() 
        console.log('Client :: start-ready');
        conn.exec('C:\\Work\\echousers.exe', function(err, stream) 
            if (err) 
                console.log('FIRST :: forwardOut error: ' + err);
                return conn.end();
            
            stream.on('close', function(code, signal) 
                console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
                conn.end();
            ).on('data', function(data) 
                console.log('connname :' + data);
            );
        );
    ).connect(
        host: v_host,
        port: 22,
        username: v_user,
        password: v_pass
    );

    res.end();
);

Route.route('/stop').get(function(req, res) 
    //conn.destroy();
    conn.end(); 

    res.end();
);

module.exports = Route; 

它适用于启动请求并“启动”批处理执行,但是当我发送“停止”请求时,它会引发错误并使节点服务器崩溃。

events.js:174
      throw er; // Unhandled 'error' event
      ^

Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:111:27) 
Emitted 'error' event at:
    at Socket.<anonymous> (D:\work\angular\app\server\node_modules\ssh2\lib\client.js:307:10)
    at Socket.emit (events.js:189:13)
    at emitErrorNT (internal/streams/destroy.js:82:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)    
    at process._tickCallback (internal/process/next_tick.js:63:19)
[nodemon] app crashed - waiting for file changes before starting...

请帮我处理这个错误。挣扎了很多天来解决这个错误。非常感谢。

【问题讨论】:

开始更简单。首先摆脱那些快速代码:代码内部你的中间件函数甚至可以独立工作吗? 停止路线不能单独工作,因为 conn 变量已定义应该以停止路线结束。 你试过 stream.on("error", ...) 吗? @JeffRSon,我尝试了流,.on('error', function(err) console.log('err', err); ) 但同样的错误和节点服务器崩溃。 conn没有停止“路由”,有停止功能,由于conn是通过ssh2定义的,不是express,可以去掉所有express代码。所以我想现在真正的问题是:你为什么要调用一个 exe 文件而不是在 Node 本身做的事情?如果绝对必须,请使用spawn 而不是exec,这样您就可以更好地处理stdout/stderr。 【参考方案1】:

你需要添加错误处理:

conn.on('error', function(err) 
        //Handle Error here
)

我有同样的问题。 SSH2 错误处理不通过标准事件发射。

【讨论】:

以上是关于node.js ssh2 => 如何关闭连接并处理 ECONNRESET 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node.js 建立与 MongoDB 数据库的 SSH 隧道连接

节点 SSH2 客户端连接会话

如何使用节点连接ftp并上传文件

Node.js:socket.io 关闭客户端连接

Node.js ssh2-sftp-client 错误:fastPut:服务器本地没有响应

本机 node.js:如何包含 css? [关闭]