希望从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>
答案 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.onEnd
或SSH2shell.on('end')
事件处理程序或回调函数来处理关闭连接的完整会话文本。 就是这样。
可以使用文本框处理多个命令,并使用分隔符拆分命令或将每一行视为命令,然后将它们推送到命令数组。可以使用commands数组变量设置host.commands
属性。响应(sessionText)处理基本相同,除非req.body.value
是文本框内容。
有关SSH shells命令处理的SSH2shell的更多详细信息,请参阅SSH2shell readme