Come eseguire il comando shell in Javascript

Voglio scrivere una funzione javascript che eseguirà i comandi della shell di sistema (per esempio) e restituirà il valore.

Come ottengo questo?

Cosa succede se il client che stai eseguendo questo javascript esegue Windows? Questo vuol dire che ciò che stai cercando di ottenere non è ansible. 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.

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. Forse usando commander.js per usare il frame del codice 🙂

Potresti usare 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 ti aiuti!

… qualche anno dopo …

ES6 è stato accettato come standard e ES7 è dietro l’angolo, quindi merita una risposta aggiornata. Useremo ES6 + async / await con nodejs + babel come esempio, i prerequisiti sono:

  • nodejs con npm
  • Babele

Il tuo esempio di file foo.js potrebbe essere simile a:

 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 

Installa l’ultimo preset:

 npm i babel-preset-latest 

Esegui tramite:

 babel-node --presets latest foo.js 

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"); 

Questo dipende interamente dall’ambiente JavaScript. Si prega di elaborare.

Ad esempio, in Windows Scripting, fai cose come:

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

Con NodeJS è semplice così! E se vuoi eseguire questo script ad ogni avvio del tuo server, puoi dare un’occhiata all’applicazione di servizio per sempre !

 var exec = require('child_process').exec; exec('php main.php', function (error, stdOut, stdErr) { // do what you want! }); 

Nota: queste risposte provengono da un client basato su browser a un server Web basato su Unix.

Esegui il comando sul client

Non puoi essenzialmente. La sicurezza dice che funziona solo all’interno di un browser e il suo accesso ai comandi e al filesystem è limitato.

Esegui ls sul server

Puoi utilizzare una chiamata AJAX per recuperare una pagina dynamic che passa nei tuoi parametri tramite GET.

Tieni presente che ciò comporta anche un rischio per la sicurezza in quanto dovresti fare qualcosa per assicurarti che la sig.ra rouge hacker non esegua la tua applicazione per dire: / dev / null && rm -rf / ……

Quindi, in poche parole, correre da JS è solo una brutta, ctriggers idea … YMMV

In IE, puoi farlo:

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

Un altro post su questo argomento con una bella soluzione jQuery / Ajax / PHP:

script di shell e jQuery

In java, in base ai 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 puoi. Sono davvero due cose completamente separate.

MODIFICARE

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

Con nashorn puoi scrivere uno script come questo:

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

ed eseguilo:

 jjs -scripting each_file.js 

Ecco un semplice comando che esegue il comando della shell di ifconfig di Linux

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