如何在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); } });