套接字超时! Telnet连接使用节点telnet-client问题

我的要求是从节点js连接到Telnet客户端。

我正在使用telnet-client包

我正在使用此代码进行连接

var Telnet = require('telnet-client') var connection = new Telnet() var params = { host: '127.0.0.1', port: 23, shellPrompt: '/ # ', timeout: 1500, // removeEcho: 4 } connection.on('ready', function(prompt) { connection.exec(cmd, function(err, response) { console.log(response) }) }) connection.on('timeout', function() { console.log('socket timeout!') connection.end() }) connection.on('close', function() { console.log('connection closed') }) connection.connect(params)` 

但它总是返回“套接字超时!” 在控制台。

我也尝试通过在参数中添加“用户名”和“密码”的细节

 `var params = { host: '127.0.0.1', port: 23, shellPrompt: '/ #', loginPrompt: 'Username: ', passwordPrompt: 'Password: ', username: 'vinit', password: 'vinit123', initialLFCR: true, timeout: 1500, // removeEcho: 4 }` 

但仍面临同样的问题。 在一些链接中,我发现有人说, shellPrompt值不正确,那么应该是shellPrompt的值。 其实我对这个话题是全新的,所以对这个话题没有太多的想法。

任何帮助将不胜感激。 提前致谢。

根据您的意见,这不是一个networking连接问题,这意味着您的连接在login过程中失败,或者之后无法检测到有效的提示(然后等到超时)。

所以你应该做的第一件事就是添加failedLogincallback:

 connection.on('failedlogin',function(msg) { console.log("Login failed !",msg); }); 

要检测“失败的login”情况(否则它将尝试login一次,然后挂起,直到超时)。

接下来,“手工”连接到你的服务器,即通过从命令行运行telnet 127.0.0.1 ,并检查“login / password”和“shell”提示是什么样的。

例如在我的“Ubuntu 16.04.3 LTS”系统上:

 %telnet 127.0.0.1 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. Ubuntu 16.04.3 LTS zeppelin-desktop login: zeppelin Password: Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-97-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage zeppelin@zeppelin-desktop:~$ 
  • login提示是zeppelin-desktop login:
  • 密码提示是Password:
  • shell提示符是zeppelin@zeppelin-desktop:~$

login和密码提示 telnet-client 的预定义模式相匹配

loginPrompt:主机正在使用的用户名/login提示。 可以是RegExp的string或实例。 默认是正则expression式'/ login [:] * $ / i'。

passwordPrompt:主机正在使用的密码/login提示。 可以是RegExp的string或实例。 默认是正则expression式'/ Password:/ i'。

所以没有必要改变它们。

Shell提示符与预定义的模式( / #不匹配

shellPrompt:Shell提示主机正在使用。 可以是RegExp的string或实例。 默认是正则expression式'/(?:/)?#\ s /'。

所以需要修改,例如

 shellPrompt: /:~[^$]*\$\s*$/, 

你可以用grep来testing你的shell提示模式,就像这样:

 %echo 'zeppelin@zeppelin-desktop:~$' | grep -o ':~[^$]*\$\s*$' :~$ 

(如果不匹配,输出将是空的)

既然你有一个正确的shell提示符模式, telnet-client应该能够识别它,并且把cmd (在on('ready')处理程序)中发送到服务器,以响应它。

例如,如果你设置cmd="date" ,你应该得到当前的date作为回应:

 connection.on('ready', function(prompt) { console.log(">date"); connection.exec("date", function(err, response) { console.log("<",response) }) }) %nodejs telnet.js >date < Wed Oct 25 10:11:11 UTC 2017 

PS

您可能要设置的另一个选项是“login失败”模式:

 failedLoginMatch : "Login incorrect" 

检测拒绝您的密码的服务器。

这在我的Ubuntu系统中不是必须的,因为它只会在密码失败的情况下重复login提示,因此无论如何将调度failedlogin事件,但取决于您的configuration,可能需要这样做。

这是一个连接超时:在目标IP:端口上没有运行Telnet服务器,或者该目标防火墙中的端口被阻止。