2017-10-14 19 views
2

私の要件は、ノードjsからTelnetクライアントに接続することです。ソケットタイムアウト!ノードtelnet-clientを使用したTelnet接続での問題

私は、接続

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)` 

ために、このコードを使用しています

telnet-clientパッケージを使用しています。しかし、それは常に返す「ソケットタイムアウトを!」コンソールで。

私はまたの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

タイムアウト値を変更しようとしましたか? – hasbi

+0

@hasbiはい、私は10000に変更しても同じ結果を表示しようとしました。 –

+0

あなたはそれを-1にできますか? – hasbi

答えて

2

これはネットワーク接続の問題ではありません。つまり、ログイン中に接続が失敗した場合、または有効なプロンプトが検出されなかった場合にタイムアウトするまで待機します。

だから、あなたが最初にすべきことは、failedLoginコールバックを追加です。(それ以外の場合は、一度ログインしようとし、その後、タイムアウトが来るまでハングします)「ログインに失敗した」ケースを検出するために

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

を。

次に、コマンドラインからtelnet 127.0.0.1を実行して、 "ログイン/パスワード"と "シェル"のプロンプトがどのように表示されるかを確認して、サーバに接続します。

など。私の "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 

[email protected]:~$ 
  • ログインプロンプトがzeppelin-desktop login:
  • で、パスワード・プロンプトがPassword:
  • あるシェルプロンプトが[email protected]:~$

ログインとパスワードですと一致しており、事前定義されたパターンはtelnet-clientです。

loginPrompt: Username/login prompt that the host is using. Can be a string or an instance of RegExp. Defaults to regex '/login[: ]*$/i'.

passwordPrompt: Password/login prompt that the host is using. Can be a string or an instance of RegExp. Defaults to regex '/Password: /i'.

だから、変更する必要はありません。

シェルプロンプト所定のパターン(/ #)と一致しません:

shellPrompt: Shell prompt that the host is using. Can be a string or an instance of RegExp. Defaults to regex '/(?:/)?#\s/'.

をので、例えば、変更する必要があります今、あなたは正しいシェルを持っていることを

%echo '[email protected]:~$' | grep -o ':~[^$]*\$\s*$' 
:~$ 

(それが一致しない場合、出力は空になります)

:あなたはそのように、grepを持つシェルプロンプトパターンをテストすることができ

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

プロンプトのパターンでは、telnet-clientはそれを識別し、それに応答してcmdon('ready')ハンドラ内)をサーバに送信する必要があります。

など。

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.:あなたはcmd="date"を設定した場合、あなたは応答で、現在の日付を取得する必要があります

failedLoginMatch : "Login incorrect" 

パスワードを拒否し、サーバーを検出するために:

あなたが設定することもできます別のオプションは、「ログイン失敗」のパターンです。

それが失敗したパスワードの場合だけ 繰り返しログインプロンプトれるようにfailedloginイベントがとにかく派遣されますが、ご使用の構成、 に応じて、それが必要になることがありますように、これは、厳密に必要な私のUbuntuシステム上ではありません。

+0

。私はすでにそれを自分で解決しました。しかし正解です。投稿していただきありがとうございます。それは他人を助ける –

0

これは接続タイムアウトです。ターゲットIP:ポートで実行されているTelnetサーバーがないか、ターゲットファイアウォールでそのポートがブロックされています。

+0

私は同じ端末に接続できます。したがって、資格情報は正しいです。 –

+0

shellの値が間違っているかもしれないので、いくつかの場所で見つかった 'shellPrompt'の値について知っていますか?その場合、私は私のubuntuシステムのためにそれを見つけることができます。 –

関連する問題