【问题标题】:Socket timeout! issue in Telnet connection using node telnet-client套接字超时!使用节点 telnet-client 的 Telnet 连接问题
【发布时间】:2018-03-26 09:47:40
【问题描述】:

我的要求是从 node 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 的值应该是多少。实际上我对这个话题完全陌生,所以对它没有太多想法。

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

【问题讨论】:

  • 您是否尝试更改超时值?
  • @hasbi 是的,我尝试将其更改为 10000 但仍然显示相同的结果。
  • 你能做到-1吗?
  • 我无法将其设置为负数。在将其设置为 -1 时,我收到此错误“未处理的拒绝 RangeError:“msecs”参数必须是非负有限数...... ……”
  • 您能否添加回调以记录“连接”事件。这应该告诉您是否以及何时建立 TCP 连接。

标签: node.js sockets npm


【解决方案1】:

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

【讨论】:

  • 我可以从终端连接到相同的。所以,凭据是正确的。
  • 你对我在某些地方发现的shellPrompt 的值有任何想法,这可能是因为shell 的值提示我不正确。在那种情况下,我怎样才能为我的 ubuntu 系统找到它。
【解决方案2】:

根据您的 cmets,这不是网络连接问题,这意味着您的连接要么在登录期间失败,要么在之后未能检测到有效提示(然后等待它直到超时)。

所以你应该做的第一件事是添加failedLogin 回调:

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

检测“登录失败”的情况(否则会尝试登录一次,然后挂起直到超时)。

接下来,“手动”连接到您的服务器,即从命令行运行 telnet 127.0.0.1,然后查看“登录名/密码”和“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:~$
  • 登录提示为zeppelin-desktop login:
  • 密码提示为Password:
  • shell 提示符是zeppelin@zeppelin-desktop:~$

登录和密码提示匹配它们在telnet-client 中的预定义模式。

loginPrompt:主机正在使用的用户名/登录提示。可以是字符串或 RegExp 的实例。默认为正则表达式 '/login[: ]*$/i'。

passwordPrompt:主机正在使用的密码/登录提示。可以是字符串或 RegExp 的实例。默认为正则表达式 '/Password: /i'。

所以没有必要改变它们。

Shell 提示不匹配预定义模式(/ #):

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

所以需要修改,例如

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

您可以使用 grep 测试您的 shell 提示模式,如下所示:

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

(如果不匹配则输出为空)

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

例如如果你设置cmd="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

附言

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

failedLoginMatch : "Login incorrect"

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

这在我的 Ubuntu 系统上不是绝对必要的,因为它只是 在密码失败的情况下重复登录提示,以便无论如何都会发送failedlogin 事件,但取决于您的配置, 它可能是必需的。

【讨论】:

  • 虽然。我已经自己解决了。但这是正确的答案。感谢您发布它。它会帮助别人
猜你喜欢
  • 2012-02-27
  • 2016-08-26
  • 1970-01-01
  • 2010-11-14
  • 2012-04-03
  • 1970-01-01
  • 2012-04-07
  • 2016-09-12
相关资源
最近更新 更多