我的要求是从节点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
的值应该是多少。实际上我对这个话题完全不熟悉,所以对此并不了解。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:4)
根据您的评论,这不是网络连接问题,这意味着您的连接在登录期间失败,或者之后无法检测到有效提示(然后等待它超时)。
所以你应该做的第一件事就是添加failedLogin
回调:
connection.on('failedlogin',function(msg) {
console.log("Login failed !",msg);
});
检测"登录失败" case(否则它将尝试登录一次,然后挂起,直到超时)。
接下来,手动连接到您的服务器",即从命令行运行telnet 127.0.0.1
,然后查看"登录/密码"和" shell"提示看起来像。
E.g。在我的" 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:
zeppelin@zeppelin-desktop:~$
登录和密码提示匹配其telnet-client中的预定义模式。
loginPrompt:主机正在使用的用户名/登录提示。可以是字符串或RegExp的实例。默认为正则表达式' /登录[:] * $ / i'。
passwordPrompt:主机正在使用的密码/登录提示。可以是字符串或RegExp的实例。默认为正则表达式' /密码:/ i'。
所以没有必要改变它们。
Shell提示与预定义模式(/ #
)不匹配:
shellPrompt:主机正在使用的Shell提示符。可以是字符串或RegExp的实例。默认为正则表达式' /(?:/)?#\ s /'。
因此需要进行修改,例如
shellPrompt: /:~[^$]*\$\s*$/,
您可以使用grep测试shell提示符模式,如下所示:
%echo 'zeppelin@zeppelin-desktop:~$' | grep -o ':~[^$]*\$\s*$'
:~$
(如果不匹配,输出将为空)
既然您有正确的shell提示模式,telnet-client
应该能够识别它,并将cmd
(在on('ready')
处理程序中)发送到服务器,以响应它
E.g。如果您设置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
P.S。
您可能想要设置的另一个选项是&#34;登录失败&#34;图案:
failedLoginMatch : "Login incorrect"
检测服务器拒绝您的密码。
这在我的Ubuntu系统上并不是绝对必要的,因为它只是
如果密码失败,请重复登录提示,以便无论如何都会调度failedlogin
事件,但根据您的配置,
它可能是必需的。
答案 1 :(得分:0)
这是连接超时:目标IP:端口上没有运行Telnet服务器,或者目标防火墙中的端口被阻止。