Я хочу написати функцію JavaScript, яка виконає команди оболонки системи ( lsнаприклад) та поверне значення.
Як я цього досягти?
Я хочу написати функцію JavaScript, яка виконає команди оболонки системи ( lsнаприклад) та поверне значення.
Як я цього досягти?
Відповіді:
Багато інших відповідей тут, схоже, вирішують це питання з точки зору функції JavaScript, що працює в браузері. Я зніму і відповім, припускаючи, що коли запитувач сказав "Сценарій оболонки", він мав на увазі JavaScript Node.js. Можливо, використовуючи command.js для використання кадру вашого коду :)
Ви можете використовувати модуль child_process з API вузла. Я вставте приклад коду нижче.
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();
Сподіваюся, це допомагає!
... через кілька років ...
ES6 було прийнято як стандарт, а ES7 - за кутом, тому він заслуговує на оновлений відповідь. Ми будемо використовувати ES6 + async / await з nodejs + babel як приклад, необхідними умовами є:
Ваш прикладний foo.jsфайл може виглядати так:
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();
Переконайтеся, що у вас є дівоча:
npm i babel-cli -g
Встановити останню настройку:
npm i babel-preset-latest
Запустити через:
babel-node --presets latest foo.js
Я не знаю, чому попередні відповіді давали всілякі складні рішення. Якщо ви просто хочете виконати швидку команду, наприклад ls, вам не потрібно асинхронізувати / очікувати, або зворотні дзвінки чи що-небудь. Ось усе, що вам потрібно - 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);
Для керування помилками додайте try/ catchтвердження навколо оператора.
Якщо ви виконуєте команду, яка потребує тривалого часу, тоді так, подивіться на асинхроннуexec функцію.
Це повністю залежить від середовища JavaScript. Будь ласка, докладно.
Наприклад, у Windows Scripting ви робите такі речі:
var shell = WScript.CreateObject("WScript.Shell");
shell.Run("command here");
Коротко:
// 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");
З NodeJS просто так! І якщо ви хочете запустити цей скрипт під час кожного завантаження вашого сервера, ви можете ознайомитись із програмою вічно-сервісної служби !
var exec = require('child_process').exec;
exec('php main.php', function (error, stdOut, stdErr) {
// do what you want!
});
Примітка. Ці відповіді - від клієнта на базі браузера до веб-сервера на базі Unix.
Запустити команду на клієнті
Ви по суті не можете. Безпека говорить, що працювати лише в браузері, а доступ до команд та файлової системи обмежений.
Запустити ls на сервері
Ви можете використовувати дзвінок AJAX для отримання динамічної сторінки, що проходить у ваших параметрах, через GET.
Пам’ятайте, що це також відкриває ризик для безпеки, оскільки вам доведеться щось зробити для того, щоб mrs rouge hacker не отримав ваш додаток сказати run: / dev / null && rm -rf / ......
Тож у двох словах, біг від JS - це просто погана, погана ідея .... YMMV
Ще одна публікація на цю тему з приємним рішенням jQuery / Ajax / PHP:
Ось проста команда, яка виконує ifconfigкоманду оболонки 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);
}
Цю функцію можна легко використовувати, як:
exec('echo test');
//output:
//test
exec('echo test', function(err, stdout){console.log(stdout+stdout+stdout)});
//output:
//testtesttest
З Nashorn ви можете написати такий сценарій:
$EXEC('find -type f');
var files = $OUT.split('\n');
files.forEach(...
...
і запустіть його:
jjs -scripting each_file.js
Якщо ви використовуєте npm, ви можете використовувати пакет shelljs
Щоб встановити: npm install [-g] shelljs
var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});
Дивіться більше: https://www.npmjs.com/package/shelljs