Je veux écrire une fonction JavaScript qui exécutera les commandes du shell système ( lspar exemple) et retournera la valeur.
Comment y parvenir?
Je veux écrire une fonction JavaScript qui exécutera les commandes du shell système ( lspar exemple) et retournera la valeur.
Comment y parvenir?
Réponses:
La plupart des autres réponses ici semblent aborder ce problème du point de vue d'une fonction JavaScript exécutée dans le navigateur. Je vais tirer et répondre en supposant que lorsque le demandeur a dit "Shell Script", il voulait dire un JavaScript backend Node.js. Peut-être utiliser commander.js pour utiliser frame votre code :)
Vous pouvez utiliser le module child_process de l'API du nœud. J'ai collé l'exemple de code ci-dessous.
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();
J'espère que cela t'aides!
... quelques années plus tard ...
ES6 a été accepté comme standard et ES7 est au coin de la rue, il mérite donc une réponse mise à jour. Nous utiliserons ES6 + async / await avec nodejs + babel comme exemple, les prérequis sont:
Votre foo.jsfichier d' exemple peut ressembler à:
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();
Assurez-vous d'avoir babel:
npm i babel-cli -g
Installez le dernier préréglage:
npm i babel-preset-latest
Exécutez-le via:
babel-node --presets latest foo.js
Je ne sais pas pourquoi les réponses précédentes ont donné toutes sortes de solutions compliquées. Si vous voulez simplement exécuter une commande rapide comme ls, vous n'avez pas besoin d'async / await ou de rappels ou quoi que ce soit. Voici tout ce dont vous avez besoin - 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);
Pour la gestion des erreurs, ajoutez un bloc try/ catchautour de l'instruction.
Si vous exécutez une commande qui prend beaucoup de temps, alors oui, regardez la fonction asynchroneexec .
Cela dépend entièrement de l'environnement JavaScript. Veuillez préciser.
Par exemple, dans Windows Scripting, vous faites des choses comme:
var shell = WScript.CreateObject("WScript.Shell");
shell.Run("command here");
En un mot:
// 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");
Avec NodeJS, c'est simple comme ça! Et si vous souhaitez exécuter ce script à chaque démarrage de votre serveur, vous pouvez jeter un œil sur l' application pour toujours !
var exec = require('child_process').exec;
exec('php main.php', function (error, stdOut, stdErr) {
// do what you want!
});
Remarque: ces réponses proviennent d'un client basé sur un navigateur vers un serveur Web basé sur Unix.
Exécuter la commande sur le client
Vous ne pouvez essentiellement pas. La sécurité dit ne fonctionner que dans un navigateur et son accès aux commandes et au système de fichiers est limité.
Exécutez ls sur le serveur
Vous pouvez utiliser un appel AJAX pour récupérer une page dynamique en passant vos paramètres via un GET.
Sachez que cela présente également un risque de sécurité car vous auriez à faire quelque chose pour vous assurer que mrs rouge hacker ne fasse pas dire à votre application run: / dev / null && rm -rf / ......
Donc en un mot, courir à partir de JS est juste une mauvaise, une mauvaise idée ... YMMV
Un autre article sur ce sujet avec une belle solution jQuery / Ajax / PHP:
Voici une commande simple qui exécute la ifconfigcommande 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);
}
Cette fonction peut être facilement utilisée comme:
exec('echo test');
//output:
//test
exec('echo test', function(err, stdout){console.log(stdout+stdout+stdout)});
//output:
//testtesttest
Avec nashorn, vous pouvez écrire un script comme celui-ci:
$EXEC('find -type f');
var files = $OUT.split('\n');
files.forEach(...
...
et exécutez-le:
jjs -scripting each_file.js
Si vous utilisez npm, vous pouvez utiliser le package shelljs
À installer: npm install [-g] shelljs
var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});
En savoir plus: https://www.npmjs.com/package/shelljs