2016-06-11 18 views
0

Ich habe einen einfachen Node-Server, der eine Seite mit einer Schaltfläche bedient. Beim Klicken auf diese Schaltfläche muss ein Befehl auf einem Remote-Host ausgeführt werden. Wenn der Befehl beendet ist, sollte die Ausgabe an die Antwort der Funktion übergeben und in html angezeigt werden.Spawn-Prozess auf Remote-Host in NodeJS

Derzeit ist dies der Server-Code:

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'); 
}); 

Wie Sie die folgenden Aufruf sehen versucht, den ‚ls‘ Befehl auf einem entfernten Rechner auszuführen:

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

Aber das tut nicht Wenn Sie alles vom Server direkt vom Terminal ausführen, gibt es die Liste des Verzeichnisinhalts zurück. Um zu testen, ob der Befehl auf diese Weise mit einem Spawn funktioniert Ich habe versucht dies zu tun:

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

Welche gibt, was ich erwartet hatte, die Liste der Verzeichnisinhalte auf dem Server. Also wie kann ich eine Pipe zu einem Remote-Host erstellen, um einen Befehl auszuführen und dann das Ergebnis des Befehls auf dem Server zu speichern?

Antwort

0

Das zweite an spawn() übergebene Argument ist ein Array von Argumenten. Außerdem müssen Sie Ihre Argumente nicht manuell zitieren. Dies sollte funktionieren:

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

Schließlich, wenn Sie mehr programmatische (und leicht) die Kontrolle über die SSH-Verbindung möchten, gibt es das ssh2 Modul (oder eines der Module, die auf ihm bauen), welche nicht Verwenden Sie untergeordnete Prozesse.