2016-06-11 4 views
0

У меня есть простой сервер узлов, который обслуживает страницу с помощью кнопки. При нажатии этой кнопки необходимо выполнить команду на удаленном хосте. Когда команда завершается, выход затем должен быть отдан ответ функции и показан в html.Процесс вскрытия на удаленном хосте в NodeJS

В настоящее время это код сервера:

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','[email protected]','"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'); 
}); 

Как вы можете видеть следующий вызов, пытается выполнить команду «LS» на удаленном хосте:

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

Но это не возвращать что-либо, в то время как выполняется с сервера непосредственно с терминала, он возвращает список содержимого каталога. Для того, чтобы проверить, если команда работает таким образом с икрой я попытался сделать это:

var mpiProc = spawn('ls', { stdio: ['pipe','pipe',2,'pipe'] }); 

который возвращает то, что я ожидал, список содержимого каталога на сервере. Итак, как я могу создать канал для удаленного хоста для выполнения команды, а затем сохранить результат команды на сервере?

ответ

0

Второй аргумент, переданный spawn(), представляет собой массив аргументов. Кроме того, вам не нужно вручную указывать свои аргументы. Это должно работать:

spawn('ssh', ['[email protected]', 'ls'], { stdio: ['pipe', 'pipe', 2, 'pipe'] }); 

Наконец, если вы хотите больше программных (и легкий) контроль над соединением SSH, есть ssh2 модуль (или какой-либо из модулей, которые строят на нем), который не делает использовать дочерние процессы.