Подтвердить что ты не робот

Как выполнить команду оболочки в Javascript

Я хочу написать функцию JavaScript, которая будет выполнять команды системной оболочки (например, ls) и вернуть значение.

Как мне это достичь?

4b9b3361

Ответ 1

Что делать, если клиент, с которым выполняется этот javascript, работает под управлением Windows? Это означает, что то, чего вы пытаетесь достичь, невозможно. Javascript - это язык сценариев для клиентов и работает в изолированной среде, часто находящейся в веб-браузере, что предотвращает доступ к ресурсам на компьютере.

Ответ 2

Многие другие ответы здесь, похоже, решают эту проблему с точки зрения функции JavaScript, выполняемой в браузере. Я буду стрелять и отвечу, предполагая, что когда спрашивающий сказал "Сценарий оболочки", он имел в виду бэкэнд JavaScript Node.js. Возможно использование commander.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();

Надеюсь это поможет!

Ответ 3

... через несколько лет...

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

Удостоверьтесь, что у вас есть babel:

npm i babel-cli -g

Установите последнюю предустановку:

npm i babel-preset-latest

Запустите его через:

babel-node --presets latest foo.js

Ответ 4

Это полностью зависит от среды JavaScript. Пожалуйста, уточните.

Например, в Windows Scripting вы делаете такие вещи, как:

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

Ответ 5

В двух словах:

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

Ответ 6

Я не знаю, почему предыдущие ответы дали всевозможные сложные решения. Если вы просто хотите выполнить быструю команду, например, ls, вам не нужны async/await или callbacks или что-то еще. Здесь все, что вам нужно - 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.

Ответ 7

С NodeJS это просто! И если вы хотите запустить этот скрипт при каждой загрузке вашего сервера, вы можете посмотреть приложение forever-service !

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

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

Ответ 8

Примечание. Эти ответы от клиента на основе браузера к веб-серверу на основе Unix.

Запустить команду на клиенте

Вы по существу не можете. Безопасность работает только в браузере, и доступ к командам и файловой системе ограничен.

Запустить ls на сервере

Вы можете использовать вызов AJAX для получения динамической страницы, передающей ваши параметры через GET.

Имейте в виду, что это также открывает угрозу безопасности, так как вам нужно будет что-то сделать, чтобы гарантировать, что злоумышленник mrs rouge не получит ваше приложение для запуска:/dev/null && & & rm -rf/......

Итак, в nutshel, запуск из JS - это просто плохая, плохая идея.... YMMV

Ответ 9

Другое сообщение на эту тему с хорошим решением jQuery/Ajax/PHP:

shell scripting и jQuery

Ответ 10

В IE вы можете сделать это:

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

Ответ 11

Вот простая команда, которая выполняет команду ifconfig оболочки Linux

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

Ответ 12

С nashorn вы можете написать script следующим образом:

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

и запустите его:

jjs -scripting each_file.js

Ответ 13

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

Ответ 14

В java, в зависимости от привилегий:

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

В JavaScript вы не можете. Они действительно две совершенно разные вещи.

ИЗМЕНИТЬ

Мой ответ был написан, когда у вопроса были теги java и javascript. Поскольку ОП, похоже, не делает различия, я не думаю, что могу точно сказать, что здесь запрашивается.

Ответ 15

используя эти шаги, вы можете добиться успеха,

  1. vim command.js
  2. копировать n мимо этого

#!/usr/bin/env node

function execute(command) {
  const exec = require('child_process').exec

  exec(command, (err, stdout, stderr) => {
    process.stdout.write(stdout)
  })
}

execute('echo "Hello World!"')
  1. node command.js