2

「sshhop」サーバーとして中央管理サーバーを介してルーターにアクセスするために、次のことを試みました


#!/usr/bin/perl -X

use strict;
use Net::OpenSSH;
use Net::Telnet;

my $lhost = "linuxserver";
my $luser = "linuxuser";
my $lpass = "linuxpassword";

my $chost = "routername";
my $cpass = "Routerpassword";

my $prompt = '/(?:Password: |[>])/m';
my @commands = ("show users\r");

my $ssh = Net::OpenSSH->new($lhost,
'user' => $luser,
'password' => $lpass,
'master_opts' => [ '-t' ],
#'async' => 1 # if enabled then password cannot be set here
);
my ($pty, $err, $pid) = $ssh->open2pty("telnet $chost");

my $t = new Net::Telnet(
-telnetmode => 0,
-fhopen => $pty,
-prompt => $prompt,
-cmd_remove_mode => 1,
-output_record_separator => "\r",
#-dump_log => "debug.log",
);

my $end = 0;

while (!$end) {
  my ($pre, $post) = $t->waitfor($prompt);
  if ($post =~ /Password: /m) {
    # send password
    $t->print("$cpass");
  }
  elsif ($post =~ /[>#]/ && @commands) {
    my $cmd = shift(@commands);
    if ($cmd !~ /[\r\n]/) {
      $t->print($cmd);
    }
    else {
      print $t->cmd($cmd);
    }
  }
  else {
    $end = 1;
    $t->cmd("exit");
  }
}
#close $pty;
$t->close();

残念ながら、私は常に次のエラーを受け取ります:読み取りエラー:test.pl行71での入力/出力エラー

誰かが私を喜ばせるのを手伝ってもらえますか、それとも「ホップ」サーバーを介したtelnet接続が可能かどうかをテストするためだけのより良い解決策がありますか?

接続は次のようになります:workstation --ssh-> server --telnet-> router

前もって感謝します。

4

2 に答える 2

2

Net ::TelnetNet::OpenSSHで機能させるのは、本来あるべきほど簡単ではない場合があり、それを機能させるフラグと呼び出しの適切な組み合わせを取得するには、ある程度の実験が必要です。

たとえば、ターゲットホストにtelnetする代わりに、netcatを使用してraw接続を開きます(または、プロキシでトンネルが許可されている場合は、TCP転送のNet :: OpenSSHサポート)。

Expect + Net::OpenSSHの方が良いオプションかもしれません。

于 2011-04-12T09:15:02.647 に答える
2

最善のオプションは、管理サーバーへのSSHトンネルを作成し、それをルーターへのtelnetingに使用することだと思います。

于 2011-04-11T19:46:11.213 に答える