可以将Nodejs ui页面运行shell cmd到远程机器并运行脚本

时间:2016-07-27 23:44:36

标签: javascript html node.js bash shell

希望从nodejs ui网页表单运行shell命令。 Form有一个“ssh {machinename} /path/to/script.sh”命令的输入字段。该页面将是nodejs单页面应用程序。 nodejs新手。

可以这样做吗?我搜索过但只是发现了php或python示例的页面。还看了argv和shelljs,但没有人提到我想做什么。 Machine-A具有单页面应用程序,其公钥已插入到执行的shell脚本所在的Machine-B中。在cli上运行命令。我希望用户在spa页面上运行自己的命令。 *仅限Nix环境。

到目前为止,我有以下内容......

package.json:
{ 
  "name": "TP",
  "version": "0.0.1",
  "description": "Testing Project",
  "private": true,
  "dependencies": {
    "express": "3.x",
    "hbs": "*"
  }
}

形式:

<form action="" method="post" enctype="multipart/form-data" style="margin:0; width:720px;">
  <fieldset>

    <!-- ENTER COMMAND -->
    <label for="test">Enter Test:</label>
    <input style="display: inline; width: 500px;" type="text" id="test_input" name="value" placeholder="Enter test command with correct params" />

    <!-- RUN COMMAND -->
    <input type="button" onclick="runTest()" value="Run Test!" style="float: right;" />

    <!-- CLEAR COMMAND -->
    <input type="button" name="testform" value="Clear Test" onclick="this.form.reset();" style="float: right;" />
    <br />

  </fieldset>
</form>

3 个答案:

答案 0 :(得分:0)

你看过ssh2shell包吗?

答案 1 :(得分:0)

我发现ssh2 npm更符合我的需求,并且可供我完成任务。你会看到我喜欢的简约。现在让整个过程由前端按钮处理并将标准输出管道移植到mongodb。

npm install ssh2

背景: 不得不为bash命令使用转义字符 用户私钥路径,主机和用户名 用户拥有sudo权限 用户公共密钥在目标vm

代码:

var Client = require('ssh2').Client;
var conn = new Client();
conn.on('ready', function() {
  console.log('Client :: ready');
  conn.shell(function(err, stream) {
    if (err) throw err;
    stream.on('close', function() {
      console.log('Stream :: close');
      conn.end();
    }).on('data', function(data) {
      console.log('STDOUT: ' + data);
    }).stderr.on('data', function(data) {
      console.log('STDERR: ' + data);
    });
        stream.end('cd /home/cruzcontrol/bin/ \n sh flash_demo_test.sh \n exit \n');
  });
}).connect({
  host: '10.5.74.123',
  username: 'cruzcontrol',
  privateKey: require('fs').readFileSync('/home/cruzcontrol/.ssh/id_rsa')
});

答案 2 :(得分:0)

现在这可能已经过时了,但我想我会添加它以防其他人发现它有用。

使用nodejs express可以完成服务页面和接收表单发布数据。有许多基本的网站示例,例如simple-website-in-node,您可以使用这些示例来启动和运行。

实施例

上面链接提供的服务器代码示例。 app.post函数中给出的SSH2shell示例。 此示例未经过测试。 建议按照上面的教程进行设置。

var express = require('express')
    , logger = require('morgan')
    , app = express()
    , bodyParser = require('body-parser')
    , fs = require('fs')
    , Mustache = requires('mustache')
    , formPage = fs.readFileSync('./templates/myForm.xhtml');


app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use( bodyParser.urlencoded({     // to support URL-encoded bodies
    extended: true
})); 
app.use(logger('dev'))
app.use(express.static(__dirname + '/static'))

//main page route
app.get('/', function (req, res, next) {
    try {
        var html = Mustache.parse(formPage, { title: 'My Form' })
        res.send(html)
    } catch (e) {
        next(e)
    }
})

//POST route
app.post('/', function (req, res) {

    //SSH2shell implementation
    var host = {
        server:  {     
            host:         '10.5.74.123',
            port:         22,
            userName:     'cruzcontrol', 
            privateKey: fs.readFileSync('/home/cruzcontrol/.ssh/id_rsa') },
        //Here you form command is set as the only command
        commands:         [ req.body.value ]
    };

    var SSH2Shell = require ('ssh2shell')
        , SSH = new SSH2Shell(host)
        , callback = function( sessionText ){
              //code here to return the sessionText and command in the form page.
              var html = Mustache.parse(formPage, { title: 'My Form',
                  value: req.body.value, 
                  result: sessionText});
              res.send(html);
        }       

    SSH.connect(callback);

})

app.listen(process.env.PORT || 3000, function () {
  console.log('Listening on http://localhost:' + (process.env.PORT || 3000))
})

只要node express服务于您的页面,SSH2shell就可以从表单提交中接收您的命令(值),运行它并在返回的表单页面中显示结果和命令。该示例使用模板引擎Mustache,因此myForm.xhtml需要页面形式html和几个标记来输出命令和响应。

SSH2shell没有检查密码设置的代码或任何其他连接参数,所以如果您不需要它进行身份验证,那么您不必使用它。

SSh2shell包装SSH2.shell。

使SSH2shell工作的最低要求是:

  • host.server选项。
  • 要运行的host.commands命令数组。
  • 使用host.onEndSSH2shell.on('end')事件处理程序或回调函数来处理关闭连接的完整会话文本。

就是这样。

可以使用文本框处理多个命令,并使用分隔符拆分命令或将每一行视为命令,然后将它们推送到命令数组。可以使用commands数组变量设置host.commands属性。响应(sessionText)处理基本相同,除非req.body.value是文本框内容。

有关SSH shells命令处理的SSH2shell的更多详细信息,请参阅SSH2shell readme