NodeJS中远程主机上的Spawn进程

时间:2016-06-11 09:40:43

标签: javascript node.js remote-server child-process

我有一个简单的节点服务器,它为一个带按钮的页面提供服务。单击该按钮需要在远程主机上执行命令。当命令完成时,输出应该被赋予函数的响应并显示在html中。

目前这是服务器代码:

a.user_id

如您所见,以下调用尝试在远程主机上执行'ls'命令:

app.use(logger("combined"));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.get('/index.html', function (req, res) {
    res.sendFile( __dirname + "/" + "index.html" );
})

app.post('/connect', function (req, res) {
    var spawn = require('cross-spawn-async');
    var mpiProc = spawn('ssh','pi@raspi2','"ls"', { stdio: ['pipe','pipe',2,'pipe'] });

    var grid = "...8.1..........435............7.8........1...2..3....6......75..34........2..6..";
    str = "";
    mpiProc.stdout.on('data', function(data) {
        console.log(data);
        str = data.toString();
        res.write('data: ' + JSON.stringify({ msg : str }) + '\n\n');
        // Output       
    });

    mpiProc.on('close', function(code) {
        res.end(str);
        // Script exit code
    });

    mpiProc.on('error', function(code) {
        res.end('stderr: ' + code);
        // Script exit code
    });
}) 
    require('http').createServer(app).listen(3000, function(){
    console.log('Listening on 3000');
});

但是这不会返回任何内容,当从服务器直接从终端执行时,它返回目录内容列表。为了测试命令是否以这种方式使用spawn,我尝试这样做:

var mpiProc = spawn('ssh','pi@raspi2','"ls"', { stdio: ['pipe','pipe',2,'pipe'] });

返回我所期望的内容,即服务器上的目录内容列表。 那么如何创建到远程主机的管道来执行命令,然后将命令的结果存储在服务器上呢?

1 个答案:

答案 0 :(得分:1)

传递给spawn()的第二个参数是一个参数数组。此外,您不需要手动引用您的参数。这应该有效:

spawn('ssh', ['pi@raspi2', 'ls'], { stdio: ['pipe', 'pipe', 2, 'pipe'] });

最后,如果您希望对ssh连接进行更多编程(和轻量级)控制,则可以使用ssh2模块(或构建在其上的任何模块),它不使用子进程。