Express 使用nodejs登录telnet服务器,进行身份验证并运行命令

Express 使用nodejs登录telnet服务器,进行身份验证并运行命令,express,nodes,telnet,Express,Nodes,Telnet,我的客户安装了一个MicroTik路由器,我想用它发送短信。 它附带一个我可以连接的telnet服务器。 我在Linux系统上使用telnet命令对它进行了测试,并且它可以正常工作。我在指定的端口远程登录到ip,然后它会提示我输入登录名-用户名和密码。身份验证后,我运行 /tool sms send usb1 "[celnumber]" message="[message]" 我已找到此节点包: 我配置了它,并在他们的页面上运行了这个示例。 问题是on ready回调从不触发,更不用说连接会

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

 /tool sms send usb1 "[celnumber]" message="[message]"
我已找到此节点包:

我配置了它,并在他们的页面上运行了这个示例。 问题是on ready回调从不触发,更不用说连接会立即关闭。不仅如此,我不知道如何使用提示符,因为文档缺乏这种意义上的提示,而且我不存在的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);
}

当然,您需要添加安全性之类的东西。

您好,您找到解决方案了吗。因为我有类似的要求。如果您有任何解决方案,请与我们分享。我使用node expect运行expect脚本。点击一条路线,运行expect脚本,获得返回。Expect仅适用于Linux afaik。我编辑了我的问题。
#!/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