Nodejs ssh2只运行多个命令一个终端

时间:2014-07-25 12:46:26

标签: javascript node.js shell ssh websocket

我在项目中编写ssh2模块时遇到了麻烦。我试图在一个终端上运行多个命令来统治远程Linux系统。例如,“bc”命令为您提供了一个基本计算器,您可以运行它来进行基本操作。但是当你使用它时,这种过程需要清醒(它会接受两个或多个输入,结果会产生响应)。

我需要创建一个类似于websocket和ssh的系统。当websocket收到命令时,ssh节点需要执行此消息,而Module需要通过websocket.send发送响应()

我正在使用Node.js websocket,ssh2 client。

这是我的代码:

#!/usr/bin/node
var Connection = require('ssh2');
var conn = new Connection();

var command="";
var http = require('http');
var WebSocketServer = require('websocket').server;
var firstcom=true;
conn.on('ready', function() {
                console.log('Connection :: ready');
               // conn.shell(onShell);

            }); 

var onShell = function(err, stream) { 

                  //  stream.write(command+'\n');

                    stream.on('data', function(data) {
                        console.log('STDOUT: ' + data);
                    });

                    stream.stderr.on('data', function(data) {
                    console.log('STDERR: ' + data);

                   });

          }



var webSocketsServerPort=5000;
var ssh2ConnectionControl=false;

var server = http.createServer(function (req, res) {
  //blahbalh
}).listen(webSocketsServerPort, function() {
    console.log((new Date()) + " Server is listening on port:: " + webSocketsServerPort);
});

//console.log((new Date()) + 'server created');

wsServer = new WebSocketServer({
    httpServer: server,
 //   autoAcceptConnections: false
});

wsServer.on('request', function(request) {
    console.log((new Date()) + ' Connection from origin ' + request.origin + '.');
    var wsconnection = request.accept('echo-protocol', request.origin);
    console.log((new Date()) + ' Connection accepted.');

    if(!ssh2ConnectionControl){
      conn.connect({
                host: 'localhost',
                port: 22,
                username: 'attilaakinci',
                password: '1'
              });
      ssh2ConnectionControl=true;
        console.log('SSH Connected.');       
    } 

    wsconnection.on('message', function(message) {
        if (message.type === 'utf8') {
            console.log('Received Message: ' + message.utf8Data);
            command=message.utf8Data;

            //if(firstcom){
            //  conn.shell(onShell);
            //  firstcom=false;
            //}else{
              conn.exec(message.utf8Data,onShell);

            //}

            wsconnection.send(message.utf8Data);
        }
        else{
            console.log('Invalid message');
        }
    });

    wsconnection.on('close', function(reasonCode, description) {
        console.log((new Date()) + ' Peer ' + wsconnection.remoteAddress + ' disconnected.');
    });
});

2 个答案:

答案 0 :(得分:2)

如果你想要一个真正的交互式shell,你应该使用conn.shell()而不是conn.exec()conn.exec()通常用于执行单行命令,因此它不会持久存在" shell状态" conn.exec()次呼叫之间(例如工作目录等)。

您还应该了解SSH服务器设置的可能限制,以及每个连接允许的同时shell / exec请求数。我认为OpenSSH服务器的默认限制为10。

答案 1 :(得分:1)

这是一个老问题,但我想提供一个替代方法,使用sh2shell包装ssc2.shell由mscdex,如上所述。以下示例仅涵盖进行ssh连接,运行命令和处理结果。

使用ssh2shel,可以在同一shell会话中的先前命令的上下文中连续运行任意数量的命令,然后返回每个命令的输出(onCommandComplete事件)和/或使用a返回断开连接时的所有会话文本回调函数。 有关示例和大量信息,请参阅the ssh2shell readme。工作代码示例也有tested scripts

var host = {
    //ssh2.client.connect options
    server: {     
        host:         120.0.0.1,
        port:         22,
        userName:     username,
        password:     password
    },
    debug:          false,
    //array of commands run in the same session
    commands:       [
        "echo $(pwd)",
        command1,
        command2,
        command3
    ],      
    //process each command response
    onCommandComplete:   function( command, response, sshObj) {
        //handle just one command or do it for all of the each time
        if (command === "echo $(pwd)"){      
            this.emit("msg", response);
        }
    }
};

//host object can be defined earlier and host.commands = [....] set repeatedly later with each reconnection.

var SSH2Shell = require ('ssh2shell');

var SSH = new SSH2Shell(host),
    callback = function( sessionText ){
        console.log ( "-----Callback session text:\n" + sessionText);
        console.log ( "-----Callback end" );
    }

SSH.connect(callback)

要查看进程级别发生的情况,请将debug设置为true。