从客户端请求使用 Node 运行 Bash 脚本 [英] Run Bash Script with Node from client request

查看:56
本文介绍了从客户端请求使用 Node 运行 Bash 脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当浏览器中的用户单击按钮时,我需要运行服务器端脚本...

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆