Quiero escribir una función de JavaScript que ejecutará los comandos de shell del sistema ( lspor ejemplo) y devolverá el valor.
¿Cómo logro esto?
Quiero escribir una función de JavaScript que ejecutará los comandos de shell del sistema ( lspor ejemplo) y devolverá el valor.
¿Cómo logro esto?
Respuestas:
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. Dispararé y responderé suponiendo que cuando el autor de la pregunta dijo "Shell Script" se refería a un JavaScript de Node.js. Posiblemente usando commander.js para usar el marco de su código :)
Puede usar el módulo child_process de 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();
¡Espero que esto ayude!
... pocos años después ...
ES6 ha sido aceptado como estándar y ES7 está a la vuelta de la esquina, por lo que merece una respuesta actualizada. Usaremos ES6 + async / await con nodejs + babel como ejemplo, los requisitos previos son:
Su foo.jsarchivo de ejemplo puede verse así:
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
Instale el último preajuste:
npm i babel-preset-latest
Ejecútelo a través de:
babel-node --presets latest foo.js
No sé por qué las respuestas anteriores dieron todo tipo de soluciones complicadas. Si solo desea ejecutar un comando rápido como ls, no necesita async / waitit o callbacks ni nada. Aquí está todo lo que necesita: execSync :
const execSync = require('child_process').execSync;
// import { execSync } from 'child_process'; // replace ^ if using ES modules
const output = execSync('ls', { encoding: 'utf-8' }); // the default is 'buffer'
console.log('Output was:\n', output);
Para el manejo de errores, agregue un bloque try/ catchalrededor de la declaración.
Si está ejecutando un comando que tarda mucho en completarse, entonces sí, observe la función asincrónicaexec .
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");
En una palabra:
// 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");
¡Con NodeJS es así de simple! Y si desea ejecutar este script en cada arranque de su servidor, puede echar un vistazo a la aplicación de servicio para siempre .
var exec = require('child_process').exec;
exec('php main.php', function (error, stdOut, stdErr) {
// do what you want!
});
Nota: Estas respuestas son de un cliente basado en navegador a un servidor web basado en Unix.
Ejecutar comando en el cliente
Básicamente no puedes. Seguridad dice que solo se ejecuta dentro de un navegador y su acceso a los comandos y al sistema de archivos es limitado.
Ejecute ls en el servidor
Puede usar una llamada AJAX para recuperar una página dinámica que pasa 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 asegurarse de que mrs rouge hacker no haga que su aplicación diga ejecutar: / dev / null && rm -rf / ......
Entonces, en pocas palabras, huir de JS es solo una mala, mala idea ... YMMV
Otra publicación sobre este tema con una buena solución jQuery / Ajax / PHP:
Aquí hay un comando simple que ejecuta el ifconfigcomando de 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);
}
});
function exec(cmd, handler = function(error, stdout, stderr){console.log(stdout);if(error !== null){console.log(stderr)}})
{
const childfork = require('child_process');
return childfork.exec(cmd, handler);
}
Esta función se puede usar fácilmente como:
exec('echo test');
//output:
//test
exec('echo test', function(err, stdout){console.log(stdout+stdout+stdout)});
//output:
//testtesttest
Con nashorn puedes escribir un script como este:
$EXEC('find -type f');
var files = $OUT.split('\n');
files.forEach(...
...
y ejecutarlo:
jjs -scripting each_file.js
Si está usando npm, puede usar el paquete shelljs
Instalar: npm install [-g] shelljs
var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});