1

Net:Telnet について助けが必要です。VT-100 端末に接続しようとしています。コンソールから通常の telnet を使用すると、正常に動作します。接続してコマンドを発行することはできますが、perl から同じことを試みると接続しますが、何も起こりません。 >サイン)。私はすべての可能な方法を試しました-> print、cmd、putなどの方法を使用しましたが、成功せず、そのことに2日間立ち往生しました。

ここに私のサンプルコードがあります:

use Net::Telnet ();
my $conn = new Net::Telnet (TelnetMode => 0);

unless ($conn->open(Host => $host, Port => 23))
{
    die "Error opening socket:: ".$conn->errmsg();
}

print "Connected to ".$conn->host().", port ".$conn->port()."\n";

$conn->prompt('/...>/'); # prompt is 014>

my $lines = $conn->put("15\r"); # command 15 to give me the site name
my ($a,$b);
($a,$b) = $conn->waitfor(Match=>'/...>/',Timeout=>100);

$conn->close;

間違ったコマンドを入力すると、通常 telnet はエラー メッセージとプロンプトを表示しますが、Perl からは何もしません。入力ログは空、出力ログは空、ダンプ ログには以下のみが含まれます。

0x00000: 31 35 0d 0a 15..

他に何を試すべきかわかりません。

通常の telnet セッションの出力は次のようになります。

Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.

014>15
15
014 TMR Name

014>^]
telnet> quit
Connection closed.

どんな助けでも大歓迎です

4

1 に答える 1

0

Net::Telnetルーターとスイッチへの接続に使用した経験しかなく、問題が発生したことはありません.

私はこのタイプの端末を使った経験はありませんが、いくつかの点が際立っています。たとえば、TelnetMode => 0telnet 制御シーケンスの解釈を無効にします。Net::Telnetこれは、telnet 以外のサービスへの接続に を使用している場合にのみ行う必要があります。

私に見える他のもの:

  • デフォルトのポートは 23 で、デフォルトの Errmode は「die」であるため、これらは一種の冗長です。
  • 関数はput出力を返さないため、使用する必要がありますcmd
  • $aand$bは、perl がソートのために使用する特別な変数であるため、絶対に使用しないでください。

これはうまくいかないかもしれませんが、私にとってうまくいったイディオムを使用してスクリプトを書き直すとしたら、次のように書きます...

use strict;
use warnings;
use Net::Telnet;

my $prompt = '/.+[:#>] *$/';
my $conn = new Net::Telnet (Prompt => $prompt);

$conn->open($host); # WILL DIE IF CONNECTION FAILS

# AUTHENTICATION GOES HERE IF NEEDED
# $conn->login($username, $password);

print "Connected to ".$conn->host().":".$conn->port()."\n";

my @lines = $conn->cmd("14");
print for @lines;

$conn->close;

私は通常解析@linesしています...出力を印刷したいだけなら、中間変数は必要なく、単にprint for $conn->cmd("14");

システムが特に遅い場合は、タイムアウトを長くして接続を初期化します。my $conn = new Net::Telnet (Prompt => $prompt, Timeout => 20);

お役に立てれば。

于 2015-02-11T01:36:52.830 に答える