2009-12-10 28 views
53

Voglio scrivere una funzione javascript che eseguirà i comandi della shell di sistema (ls per esempio) e restituire il valore.Come eseguire il comando shell in Javascript

Come ottengo questo?

+1

dove si desidera eseguire questo comando, sul client o sul server? –

+0

Quale sistema operativo stai usando? –

+0

Ecco un tutorial su come farlo usando node.js per uno script di shell: http://www.dreamsyssoft.com/javascript-shell-scripting/shell-tutorial.php –

risposta

-60

Cosa succede se il client su cui si sta eseguendo questo javascript esegue Windows? Questo vuol dire che ciò che stai cercando di ottenere non è possibile. Javascript è un linguaggio di scripting client e viene eseguito in un ambiente sandbox spesso all'interno di un browser Web che impedisce l'accesso alle risorse sul computer.

+20

ricorda che si ottiene javascript lato server quindi non lo è t solo una lingua del client del browser – AutomatedTester

+3

@automatedtester True, ma è probabile che qualunque cosa l'OP stia scrivendo è mirata al browser. –

+13

Questa non è più una risposta valida e non sono nemmeno sicuro che fosse nel dicembre '09 ... –

-1

in Java, a seconda dei privilegi:

Runtime run = Runtime.getRuntime(); 
Process pr = run.exec("ls"); 

pr.waitFor(); 
BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream())); 

String line = ""; 
while ((line=buf.readLine())!=null) { 
    System.out.println(line); 
} 

In JavaScript non si può. Sono davvero due cose completamente separate.

EDIT

La mia risposta è stata scritta quando la domanda ha avuto i tag javaejavascript. Dal momento che OP non sembra fare la distinzione, non penso di poter dire con certezza quello che viene richiesto qui.

13

Dipende interamente dall'ambiente JavaScript. Si prega di elaborare.

Ad esempio, in Windows Scripting, è fare le cose come:

var shell = WScript.CreateObject("WScript.Shell"); 
shell.Run("command here"); 
+6

È possibile fare la stessa cosa in un sistema operativo simile a Unix come Linux? –

16

In poche parole:

// Instantiate the Shell object and invoke its execute method. 
var oShell = new ActiveXObject("Shell.Application"); 

var commandtoRun = "C:\\Winnt\\Notepad.exe"; 
if (inputparms != "") { 
    var commandParms = document.Form1.filename.value; 
} 

// Invoke the execute method. 
oShell.ShellExecute(commandtoRun, commandParms, "", "open", "1"); 
+3

[ActiveXObject è disponibile solo su browser IE.] (Http: // stackoverflow.it/questions/11101641/activexobject-is-not-defined-and-cant-find-variable-activexobject # answer-11101655) –

+0

Solo per informazioni http://www.phpied.com/javascript-shell-scripting/ – Eduplessis

+3

Sembra che ci sia un sacco di tormenti a mano su quale browser web è in esecuzione, ma la gente dovrebbe rendersi conto che JavaScript è anche un linguaggio di scripting della shell Windows perfettamente valido. – Craig

3

Nota: queste risposte sono da un client basato su browser a un server web basato su Unix .

comando Esegui client

Essenzialmente non si può. La sicurezza dice che funziona solo all'interno di un browser e il suo accesso ai comandi e al filesystem è limitato. ls

eseguiti su server di

È possibile utilizzare una chiamata AJAX per recuperare una pagina di passaggio dinamico i parametri tramite un GET.

Essere consapevoli che questo si apre anche un rischio per la sicurezza, come si dovrebbe fare qualcosa per garantire che la signora rouge di hacker non ottiene l'applicazione di dire eseguire:/dev/null & & rm-rf/.... ..

Quindi, in un nutshel, che va da JS è solo una cattiva, cattiva idea .... YMMV

+0

In sostanza non è possibile * in modo cross-browser. * Credo che solo IE abbia hook nella shell (tramite WSript/ActiveX). –

71

Molte delle altre risposte sembrano risolvere questo problema dal punto di vista di una funzione JavaScript in esecuzione nel browser. Sparerò e risponderò partendo dal presupposto che quando il richiedente ha detto "Shell Script" intendeva un backend Node.js JavaScript.È possibile utilizzare commander.js per utilizzare il frame del codice :)

È possibile utilizzare il modulo child_proccess dall'API del nodo. Ho incollato il codice di esempio qui sotto.

var exec = require('child_process').exec, child; 

child = exec('cat *.js bad_file | wc -l', 
    function (error, stdout, stderr) { 
     console.log('stdout: ' + stdout); 
     console.log('stderr: ' + stderr); 
     if (error !== null) { 
      console.log('exec error: ' + error); 
     } 
    }); 
child(); 

Spero che questo aiuti!

+0

lo hai detto! –

+3

Tranne una cosa. Riceverai l'errore "il bambino non è una funzione". La chiamata a exec() esegue il comando - non è necessario chiamare child(). Sfortunatamente, il callback non viene richiamato ogni volta che il processo figlio ha qualcosa da restituire, viene chiamato solo quando il processo figlio viene chiuso. A volte va bene e altre volte no. – user1738579

+0

Grazie mille! Proprio quello di cui avevo bisogno. –

3

In IE, si può fare questo:

var shell = new ActiveXObject("WScript.Shell"); 
shell.run("cmd /c dir & pause"); 
18

... qualche anno dopo ...

ES6 has been accepted as a standard e ES7 è dietro l'angolo risposta Quindi merita aggiornato. Useremo ES6 + asincrone/aspettano con nodejs + babel come esempio, sono prerequisiti:

Il vostro esempio foo.js file potrebbe essere simile:

import { exec } from 'child_process'; 

/** 
* Execute simple shell command (async wrapper). 
* @param {String} cmd 
* @return {Object} { stdout: String, stderr: String } 
*/ 
async function sh(cmd) { 
    return new Promise(function (resolve, reject) { 
    exec(cmd, (err, stdout, stderr) => { 
     if (err) { 
     reject(err); 
     } else { 
     resolve({ stdout, stderr }); 
     } 
    }); 
    }); 
} 

async function main() { 
    let { stdout } = await sh('ls'); 
    for (let line of stdout.split('\n')) { 
    console.log(`ls: ${line}`); 
    } 
} 

main(); 

Assicurati di avere babele:

npm i babel-cli -g 

Installare ultima preimpostata:

npm i babel-preset-latest 

Run tramite:

babel-node --presets latest foo.js 
-1

Ecco semplice comando che esegue ifconfig comando di shell di Linux

var process = require('child_process'); 
process.exec('ifconfig',function (err,stdout,stderr) { 
    if (err) { 
     console.log("\n"+stderr); 
    } else { 
     console.log(stdout); 
    } 
}); 
0

Con nashorn è possibile scrivere uno script come questo:

$EXEC('find -type f'); 
var files = $OUT.split('\n'); 
files.forEach(... 
... 

ed eseguirlo:

jjs -scripting each_file.js 
2

Con NodeJS è semplice come quello! E se vuoi eseguire questo script ad ogni avvio del tuo server, puoi dare un'occhiata all'applicazione forever-service!

var exec = require('child_process').exec; 

exec('php main.php', function (error, stdOut, stdErr) { 
    // do what you want! 
}); 
Problemi correlati