使用nodejs登录到telnet服务器,验证并运行命令

时间:2017-03-02 09:38:14

标签: express nodes telnet

我的客户端安装了我想用来发送短信的MicroTik路由器。 它配备了我可以连接的telnet服务器。 我在Linux系统上使用telnet命令对它进行了测试并且工作正常。我telnet到指定端口的IP,然后它提示我登录 - 用户名和密码。验证后,我运行

 /tool sms send usb1 "[celnumber]" message="[message]"

我找到了这个节点包:node-telnet-client

我配置了它,并在他们的页面上运行了示例。 事情就是准备回调从不触发,更不用说连接立即关闭了。不仅如此,我不明白如何使用提示,因为文档缺乏这种意义,而且我对telnet服务器的不存在经验也没有帮助我。

所以我真正需要的是一个关于如何:

的好例子
  • 登录telnet服务器
  • 认证后运行命令

来自nodejs服务器。如果需要,我可以提供额外的信息。

由于

编辑: 我的解决方案......

我运行了node-expect来运行expect脚本。例如......

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var PORT = 4000;

app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

app.post('/sms', function (req, res) {
    var phoneNumber = req.body.phoneNumber,
        message = req.body.message,

    var isWin = require('os').platform().indexOf('win') > -1;

    var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;


    if(isWin) {
        console.error('CANNOT USE THIS FROM A WINDOWS HOST');
        res.status(500).send('Only works on Linux systems with the <expect> command line script.')
    }
    if(typeof phoneNumber === 'string' && typeof message === 'string') {
        if(__CommandExists('expect')) {
            __RUNCMD('expect', ['sms.exp', phoneNumber, message]);
            res.status(200).send('Request sent !');
        } else {
            res.status(500).send('<expect> required to be installed on the host machine !');
        }
    } else {
        res.status(500).send('Required parameters : phoneNumber [string] and message [string].');
    }
});

app.listen(PORT, function () {
  console.log('SMS app running on port ' + PORT);
})

function __RUNCMD(cmd, args, callback ) {
    var spawn = require('child_process').spawn;
    var child = spawn(cmd, args);
    var resp = "";
    child.stdout.on('data', function (buffer) {
        resp += buffer.toString()
    });
    child.stdout.on('end', function() { 
        if(callback) {
            callback (resp) 
        }
    });
}

function __CommandExists(command) {
    var commandExistsSync = require('command-exists').sync;
    return commandExistsSync(command);
}

预期脚本

#!/usr/bin/expect 
set timeout 20 

#set hostName [lindex $argv 0] 
#set port [lindex $argv 1] 
#set userName [lindex $argv 2] 
#set password [lindex $argv 3] 
#set mobil [lindex $argv 4] 
#set mesaj [lindex $argv 5] - aici e cu problema, sau restul argumentelor formează mesajul... 

set phoneNumber [lindex $argv 0];
set message [lindex $argv 1];

spawn telnet [ip] [p] // defaults to 2323 

expect "Login:" 
send "yourusername\r" 
expect "Password:" 
send "yourpass\r" 

#interact 

expect "\[sms@MikroTik\] > " 
send "\/tool sms send usb1 \"$phoneNumber\" message=\"$message\"\r" 

#interact 

expect "\[sms@MikroTik\] >" 
send "\r" 
send "quit\r" 

expect eof 

当然,您需要添加安全性以及不需要的内容。

0 个答案:

没有答案