繁体   English   中英

节点SSH2客户端连接session

[英]Node SSH2 client connection session

我想使用 Node.js 设置与设备的 SSH 连接。 目标是连接并保持连接更长时间,而不是一遍又一遍地连接和断开连接。

我能够建立连接,但是当我的回调被多次调用时会出现问题。 回调用于回答来自我的前端的 GET 请求,当回调多次触发时,响应 header 被第二次填充,我得到一个错误。

有没有更优雅的方式来建立持久的连接,同时避免多次回调?

const { Client } = require('ssh2');

var connection;
var connEstablished = false;


var connect = (callback) => {
    const conn = new Client();
    conn.on('ready', () => {
        callback(null, true);
        connection = conn;
        connEstablished = true;
        console.log("Connection ready");
    }).connect({
        host: '192.168.1.1',
        port: 22,
        username: 'pi',
        password: 'raspberry',
        readyTimeout: 2000,
        keepaliveInterval: 500
    });
    conn.on('end', () => {
        callback(null, false);
        connection = null;
        connEstablished = false;
        console.log("Connection end");
    })
    conn.on('error', (error) => {
        callback(error, false);
        connection = null;
        connEstablished = false;
        console.error("SSH Client Error: ", JSON.stringify(error));
    })
};

var disconnect = () => {
    if (!connEstablished) {
        return;
    }

    connection.end();
}

var command = (command) => {
    if (!connEstablished) {
        return;
    }

    connection.exec(command, (err, stream) => {
        if (err) {
            callback(err);
            return;
        }
        stream.on('data', (data) => {
            callback(null, data);
        }).stderr.on('data', (data) => {
            callback(null, data);
        });
    });
}

问题是您正在假设 stream 发出的'data'事件的数量。 对于一般的流,你永远不应该做出这样的假设。

我建议始终对流进行防御性编码,就好像您一次可能获得 1 个字节,或者您可能会在单个事件中获得您正在寻找的全部数据。

要解决此问题,您需要知道何时拥有所有数据,这完全取决于您正在执行的命令。 对于许多命令,最有可能发出'close'事件以指示该 stream 将不再有 output(进程已退出)。 但是,对于一些在远程进程的生命周期内发送多个请求的长时间运行的进程,您需要找到一种方法来找到流的 output 中每个“响应”的结尾。

无论哪种方式,在执行回调之前,您都需要缓冲数据,直到看到“响应”结束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM