如何在Javascript中执行Shell命令


127

我想编写一个JavaScript函数,它将执行系统外壳命令(ls例如)并返回值。

我该如何实现?


4
您想在客户端还是服务器上在哪里执行此命令?
2009年

您正在使用哪个操作系统?
安德森·格林

以下是有关如何使用node.js编写shell脚本的教程:dreamsyssoft.com/javascript-shell-scripting/shell-tutorial.php
Rocky Pulley

7
为什么选择最不喜欢的答案作为最佳答案?o.0
安德烈·利维

请更具体地说明哪种类型的JavaScript。这在服务器端javascript上是可能的,但在客户端javascript上则不可能。
Raymond Peng

Answers:


132

从浏览器中运行的JavaScript函数的角度来看,这里的许多其他答案似乎都可以解决此问题。我会射击并假设当问问者说“ Shell Script”时,他的意思是Node.js后端JavaScript。可能使用commander.js来框架您的代码:)

您可以使用节点API 的child_process模块。我在下面粘贴了示例代码。

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

希望这可以帮助!


14
除了一件事。您将收到错误“子代不是函数”。调用exec()将执行命令-无需调用child()。不幸的是,只要子进程有输出要输出,就不会调用该回调-仅在子进程退出时才调用。有时没关系,有时却不行。
John Deighan '16

2
为了避免回调,可以使用execSync
Dan Dascalescu

1
谁在谈论浏览器?它只说JavaScript,仅此而已。
Virus721

49

几年后

ES6已被接受为标准,并且ES7即将来临,因此值得更新。我们将以带有nodejs + babel的ES6 + async / await为例,前提条件是:

您的示例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

3
如果只需要执行快速命令,则所有异步/等待都是多余的。您可以只使用execSync
Dan Dascalescu

没有人要求Node.js解决方案。它只说JavaScript。
Virus721

43

我不知道为什么以前的答案给出了各种复杂的解决方案。如果您只想执行像这样的快速命令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函数。


19

这完全取决于JavaScript环境。请详细说明。

例如,在Windows脚本中,您可以执行以下操作:

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

18
是否可以在类似Unix的操作系统(例如Linux)中做同样的事情?
安德森·格林

我们如何运行此命令:route print -4 | 找到“ TAP Windows适配器”?我尝试了但没有返回任何结果
ikel

1
那就是我想要的。所有那些谈论他们的Node.js的人都很烦。谁在这里要求Node.js?没有人做。
Virus721

如果JavaScript在浏览器中,是否可以使用?
Ali Sajjad

14

简而言之:

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


5
关于运行哪个Web浏览器似乎有很多麻烦,但是人们应该意识到JavaScript也是一种完全有效的Windows Shell脚本语言。
Craig

6

使用NodeJS很简单!而且,如果您希望在服务器的每次启动时都运行此脚本,则可以查看永久服务应用程序!

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

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

为了避免回调,对于快速命令,可以使用execSync
Dan Dascalescu '18

5

注意:这些答案是从基于浏览器的客户端到基于Unix的Web服务器。

在客户端上运行命令

您基本上不能。安全性说只能在浏览器中运行,并且它对命令和文件系统的访问受到限制。

在服务器上运行ls

您可以使用AJAX调用来检索通过GET传递参数的动态页面。

请注意,这还会带来安全风险,因为您必须做一些事情来确保rouge hacker先生不会让您的应用程序运行:/ dev / null && rm -rf / ......

因此,总的来说,从JS运行只是一个坏主意,..... YMMV


您基本上不能以跨浏览器的方式。我相信只有IE可以通过WSript / ActiveX钩住外壳。
贾斯汀·约翰逊2009年


3

在IE中,您可以执行以下操作:

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

3

这是执行ifconfigLinux的Shell命令的简单命令

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

为了避免回调,可以使用execSync
Dan Dascalescu

3
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


0

如果您使用的是npm,则可以使用shelljs包

安装: npm install [-g] shelljs

var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});

查看更多:https : //www.npmjs.com/package/shelljs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.