从客户端请求使用 Node 运行 Bash 脚本 [英] Run Bash Script with Node from client request
问题描述
当浏览器中的用户单击按钮时,我需要运行服务器端脚本...
I need to make a server-side script run when a user from the browser clicks a button...
我已经研究了一段时间,但无法弄清楚.
I've been researching for a while, and can't figure it out.
我们有什么:
- 在 Fedora Red Hat 上运行的 Node.js 服务器(在本地主机上)
- 没有 PHP
- 大多数页面都是 html + javascript + jQuery
更清楚地说,这是我们希望发生的事情:
To be more clear, here is what we'd like to happen:
-->用户访问 http://localhost/index.html
-->用户选择颜色,按下提交"按钮.
-->选定的颜色转到 bash 脚本(在服务器上)./sendColors [listOfColors]
-->bash 脚本就是这样.
================
================
child_process.spawn
我希望我可以在 html 页面上做到这一点:
I WISH I could do this on the html page:
var spawn = require('child_process').spawn;
ls = spawn(commandLine, [listOfColors]);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code);
});
但是这个脚本是服务器端的,不是客户端的,所以我不能在 html 页面上运行它(我相信).当我尝试运行这个时,我得到的错误是 require 未定义.
but this script is server-side, not client-side, so I can't run it on the html page (I believe). The error I get when I try to run this is that require is undefined.
浏览
我试过 installinst browserify,但我们使用的机器没有连接到互联网,无法使用 npm install.我已经手动将文件复制到 usr/lib 并要求"它很好,但后来它说它找不到要求通过",这是在 browserify 的 index.js ...
I've tried installinst browserify, but the machine we are using isn't connected to the internet, and cannot use npm install. I've manually copied over the files to usr/lib and "required" it fine, but then it said that it couldn't find require "through", which is in browserify's index.js...
getRuntime
尝试过这个:
var bash_exit_code = 0; // global to provide exit code from bash shell invocation
function bash(command)
{
var c; // a character of the shell's stdout stream
var retval = ""; // the return value is the stdout of the shell
var rt = Runtime.getRuntime(); // get current runTime object
var shell = rt.exec("bash -c '" + command + "'"); // start the shell
var shellIn = shell.getInputStream(); // this captures the output from the command
while ((c = shellIn.read()) != -1) // loop to capture shell's stdout
{
retval += String.fromCharCode(c); // one character at a time
}
bash_exit_code = shell.waitFor(); // wait for the shell to finish and get the return code
shellIn.close(); // close the shell's output stream
return retval;
}
说它不知道什么是运行时
said it didn't know what Runtime was
RequireJS
我已经研究了 RequireJS,但不明白如何在我的情况下使用它
I've looked into RequireJS, but didn't understand how to use it in my case
评估
我也试过 eval ......但我认为这是用于代数表达式......没有用.
I've tried eval also... but I think that's for algebric expressions... didn't work.
ActiveX
甚至尝试过activeX:
even tried activeX:
variable=new ActiveXObject(...
说它不知道 ActiveXObject 是什么
said it didn't know what ActiveXObject is
================
================
HttpServer.js:
HttpServer.js:
var http = require('http');
...
var colors = require('./colorsRequest.js').Request;
...
http.get('http://localhost/colorsRequest', function(req, res){
// run your request.js script
// when index.html makes the ajax call to www.yoursite.com/request, this runs
// you can also require your request.js as a module (above) and call on that:
res.send(colors.getList()); // try res.json() if getList() returns an object or array
console.log("Got response ");// + res.statusCode);
});
colorsRequest.js
colorsRequest.js
var RequestClass = function() {
console.log("HELLO");
};
// now expose with module.exports:
exports.Request = RequestClass;
index.html
...
var colorsList = ...
...
$.get('http://localhost/colorsRequest', function(colors) {
$('#response').html(colorsList); // show the list
});
我要了
GET http://localhost/colorsRequest 404 (Not Found)
有人有什么想法吗?
推荐答案
这是服务器的一个简单样板(它使用 Express,所以你可能需要先安装它:npm install express
):
Here's a simple boilerplate for the server (which uses Express, so you might need to install that first: npm install express
):
var spawn = require('child_process').spawn;
var express = require('express');
var app = express();
app.use(express.static(__dirname));
app.get('/colorsRequest', function(req, res) {
var command = spawn(__dirname + '/run.sh', [ req.query.color || '' ]);
var output = [];
command.stdout.on('data', function(chunk) {
output.push(chunk);
});
command.on('close', function(code) {
if (code === 0)
res.send(Buffer.concat(output));
else
res.send(500); // when the script fails, generate a Server Error HTTP response
});
});
app.listen(3000);
你可以给它传递一个颜色,它会运行 shellscript run.sh
(假设它与服务器 JS 文件位于同一目录中),并将颜色作为参数传递:
You can pass it a color, and it will run the shellscript run.sh
(of which it assumes is located in the same directory as the server JS file) with the color passed as argument:
curl -i localhost:3000/colorsRequest?color=green
# this runs './run.sh green' on the server
这是一个样板HTML页面(另存为index.html
,放在与服务器代码和shell脚本相同的目录下,启动服务器,打开http://localhost:3000
在浏览器中):
Here's a boilerplate HTML page (save it as index.html
, put it in the same directory as the server code and the shell script, start the server, and open http://localhost:3000
in your browser):
<!doctype html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<select>
<optgroup label="Pick a color:">
<option>green</option>
<option>blue</option>
<option>yellow</option>
<option>orange</option>
</optgroup>
</select>
<script>
$('select').on('change', function() {
$.get('/colorsRequest', { color : $(this).val() });
});
</script>
</body>
</html>
这篇关于从客户端请求使用 Node 运行 Bash 脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!