2009-12-10 99 views
53

Quiero escribir una función javascript que ejecutará los comandos del shell del sistema (ls por ejemplo) y devolverá el valor.Cómo ejecutar el comando shell en Javascript

¿Cómo lograr esto?

+1

¿Dónde le gustaría ejecutar este comando, en el cliente o en el servidor? –

+0

¿Qué sistema operativo estás usando? –

+0

Aquí hay un tutorial sobre cómo hacerlo usando node.js para un script de shell: http://www.dreamsyssoft.com/javascript-shell-scripting/shell-tutorial.php –

Respuesta

-60

¿Qué sucede si el cliente que está ejecutando este javascript está ejecutando Windows? Esto quiere decir que lo que intentas lograr no es posible. Javascript es un lenguaje de secuencias de comandos del cliente y se ejecuta en un entorno de espacio aislado a menudo dentro de un navegador web que le impide acceder a los recursos en la computadora.

+20

recuerda que obtienes javascript del lado del servidor así que no t solo un lenguaje de cliente de navegador – AutomatedTester

+3

@automatedtester Es cierto, pero lo más probable es que lo que el OP está escribiendo esté dirigido al navegador. –

+13

Esto definitivamente ya no es una respuesta válida y ni siquiera estoy seguro de que fue en diciembre '09 ... –

-1

en Java, dependiendo de los privilegios:

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

En JavaScript no se puede. En realidad son dos cosas bastante separadas.

EDITAR

Mi respuesta fue escrito cuando la cuestión tenía las etiquetas java y javascript. Como OP no parece hacer la distinción, no creo poder decir con certeza cuál se solicita aquí.

13

Esto depende completamente del entorno de JavaScript. Por favor elabora.

Por ejemplo, en Windows Scripting, haces cosas como:

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

¿Es posible hacer lo mismo en un sistema operativo tipo Unix como Linux? –

16

En pocas palabras:

// 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 está disponible solo en el navegador IE.] (Http: // stackoverflow.com/questions/11101641/activexobject-is-not-defined-and-cant-find-variable-activexobject # answer-11101655) –

+0

Solo para obtener información http://www.phpied.com/javascript-shell-scripting/ – Eduplessis

+3

Parece que hay muchas agitaciones sobre qué navegador web se está ejecutando, pero la gente debería darse cuenta de que JavaScript también es un lenguaje de scripts de shell de Windows perfectamente válido. – Craig

3

Nota: Estas respuestas son de un cliente basado en navegador a un servidor web basado en Unix .

comando ejecutar en el cliente

Esencialmente no se puede. Security dice que solo se ejecuta dentro de un navegador y que su acceso a los comandos y al sistema de archivos es limitado. ls

se ejecutan en el servidor

Se puede utilizar una llamada AJAX para recuperar una página dinámica que pasa en sus parámetros a través de un GET.

Tenga en cuenta que esto también abre un riesgo de seguridad ya que tendría que hacer algo para asegurar que los hackers señora rouge no recibe su solicitud para decir ejecute:/dev/null & & rm-rf/.... ..

Así que en un nutshel, que va desde JS es sólo una mala mala idea, .... YMMV

+0

Básicamente no se puede * de manera cruzada. * Creo que solo IE tiene ganchos en el shell (a través de WSript/ActiveX). –

71

Muchas de las otras respuestas aquí parecen abordar este problema desde la perspectiva de una función de JavaScript que se ejecuta en el navegador. Voy a disparar y responder, suponiendo que cuando el asker dijera "Shell Script" se refería a un JavaScript de Back-end de Node.js.Posiblemente usando commander.js para usar el marco de su código :)

Puede usar el módulo child_proccess desde la API del nodo. Pegué el código de ejemplo a continuación.

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

Hope this helps!

+0

¡lo has dicho! –

+3

Excepto por una cosa. Obtendrá el error "hijo no es una función". La llamada a exec() ejecuta el comando - no es necesario llamar a child(). Desafortunadamente, no se llama a la devolución de llamada siempre que el proceso hijo tenga algo que generar: se llama solo cuando sale el proceso hijo. A veces eso está bien y otras veces no. – user1738579

+0

¡Gracias una tonelada! Justo lo que necesitaba . –

3

En IE, usted puede hacer esto:

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

... unos pocos años más tarde ...

ES6 has been accepted as a standard y ES7 está a la vuelta respuesta por lo que merece actualiza. Vamos a utilizar ES6 + asíncrono/esperan con nodejs + Babel como un ejemplo, requisitos previos son:

Su ejemplo foo.js archivo puede verse como:

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

Asegúrate de tener babel:

npm i babel-cli -g 

Instalar última preestablecido:

npm i babel-preset-latest 

Run vía:

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

Aquí es simple comando que se ejecuta ifconfig de comandos shell de 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 puede escribir un script como este:

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

y ejecutarlo:

jjs -scripting each_file.js 
2

Con NodeJS es tan simple como eso! Y si desea ejecutar este script en cada inicio de su servidor, ¡puede echarle un vistazo a la aplicación forever-service!

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

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