如何在Javascript中执行shell命令

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

我如何做到这一点?

如果你正在执行这个JavaScript的客户端运行Windows? 这就是说,你试图达到的是不可能的。 Javascript是一种客户端脚本语言,通常在一个网页浏览器内的沙盒环境中运行,以防止它访问计算机上的资源。

这里的许多其他答案似乎从浏览器中运行的JavaScript函数的angular度来解决这个问题。 我会拍摄并回答,假设当提问者说“Shell脚本”,他意味着一个Node.js后端JavaScript。 可能使用commander.js来使用框架代码:)

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

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

希望这可以帮助!

简而言之:

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

几年后…

ES6已经被接受为标准 ,ES7即将到来,所以它值得更新的答案。 我们将以nodejs + babel为例,使用ES6 +asynchronous/等待,先决条件是:

  • 与npm的 nodejs
  • 巴别塔

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

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

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

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

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

在客户端运行命令

你本质上不能。 安全性说只能在浏览器中运行,并且对命令和文件系统的访问是有限的。

在服务器上运行ls

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

请注意,这也会带来安全风险,因为您需要做一些事情来确保黑客不会让您的应用程序运行:/ dev / null && rm -rf / ……

所以说,从JS运行是一个糟糕的主意…. YMMV

在IE中,你可以这样做:

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

关于这个主题的另一篇文章,有一个很好的jQuery / Ajax / PHP解决scheme:

shell脚本和jQuery

在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时,我的回应是写。 由于OP似乎没有作出区分,我不认为我可以肯定地说在这里被要求。

用NodeJS就是这样简单! 如果你想在你的服务器每次启动时运行这个脚本,你可以看看永远在线的应用程序!

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

用nashorn你可以写一个这样的脚本:

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

并运行它:

 jjs -scripting each_file.js 

这里是执行Linux的ifconfig shell命令的简单命令

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