2011-12-14 17 views
0

Windows Perlを初めて使用していて、にNet::SSH2を使用しようとしています。私はスクリプトを持っている問題は、デバイスリストに接続することができません。リストの最初のデバイスに接続できますが、2番目、3番目などのデバイスには接続できません。私は何かが恋しいですか?ご意見ありがとうございます。Perl Net :: SSH2モジュールがデバイスリストで動作しない

#!\usr\bin\Perl\bin\perl 

use warnings; 
use strict; 
use NET::SSH2; 
use MIME::Base64; 

my $host = "C:/temp/devices.txt"; # input file 
my $user = "XXX"; # your account 
my $pass = "XXXXX"; # your password 64 bit mime 
my $ssh2 = Net::SSH2->new(); 
my $result = "C:/temp/result.txt"; # output file 

$ssh2->debug(1); # debug on/off 

open(List, '<', "$host") or die "$!"; 
while(<List>) { 
    chomp $_; 
    unless ($ssh2->connect("$_")) { 
     print "Unable to connect : $_\n"; 
     next; 
    } 

    my $dp=decode_base64("$pass"); 

    unless ($ssh2->auth_password("$user","$dp")) { 
     print "Invalid Password\n"; 
     exit; 
    } 

    my $chan = $ssh2->channel(); 
    $chan->exec('sh ver'); 

    my $buflen =100000; 
    my $buf = '0' x $buflen; 
    my $read = $chan->read($buf, $buflen); 

    warn 'More than ', $buflen, ' characters in listing' if $read >= $buflen; 

    open (OUTPUT, '>>', $result) or die "$!"; 
    print OUTPUT "HOST: $_\n\n"; 
    print OUTPUT "$buf\n"; 
    print OUTPUT "\n\n\n"; 
    print OUTPUT 

    $chan->close(); 
} 

close (List); 
+1

これは 'use net:SSH2'で' NET :: SSH2'を使用しないでください。 Windowsでは大文字と小文字が区別されないため、動作します。 –

+0

どのようなエラーメッセージが表示されますか? – CanSpice

+0

@ブラッドギルバート@私はタイプミスに同意します。 – Daniel

答えて

0

認証に失敗した場合はexit()しないでください。次のリスト項目に移動するには 'next'を使用します。

+0

あなたの応答に感謝しますが、私は"次へ "に変更しましたが、まだ他のデバイスに接続していません。 – Daniel

1

Net :: SSH2オブジェクトをループ内に作成する必要があります。これは、Net :: SSH2オブジェクトを使用して複数のホストに接続する(または同じホストに複数の接続を行う)ことができないためです。

1

$ ssh-> disconnect()$ chan-> close();の後に呼び出します。

-3
#!\usr\bin\Perl\bin\perl 
    use strict; 
    use Term::ReadKey; 
    use NET::SSH2; 
    use MIME::Base64; 
    use constant BUFLEN => 10_0000 ; 
    my $user = "XXX"; # your account 
    my $pass = "XXXX"; # your password 64 bit mime 
    my $dp=decode_base64("$pass"); 
    my $host = "C:/temp/devices.txt"; # input file 
    my $Error = "C:/temp/Error.txt"; # Error file 
    open(HOST, '<', "$host") or die "$!"; 
    open STDERR, ">", "$Error"; # open log file 
      while(<HOST>) { 
       chomp $_; 
    my $ssh2 = Net::SSH2->new(); 
    $ssh2->debug(1); # debug on/off 
      unless ($ssh2->connect("$_")) { 
      print "Unable to connect : $_\n"; 
    print STDERR "Unable to connect to $_: $!\n"; # write the error on log file 
    print STDERR 
    "*****************************************************\n\n"; 
      next; 
      } 
     print "connecting to $_\n"; 
     unless ($ssh2->auth_password("$user","$dp")) { 
     print "Invalid Password\n"; 
     exit; 
      } 
    my $chan = $ssh2->channel; 
     $chan->exec('sh int desc'); 
       my $buf; 
       my $read = $chan->read($buf, BUFLEN); 
    warn 'More than ', BUFLEN, ' characters in listing' if $read >= BUFLEN; 
    open (OUTPUT, ">", "C:/temp/$_.txt")or die "$!"; # new file for each devices 
    print OUTPUT "HOST: $_\n\n"; 
    print OUTPUT "$buf\n"; 
    print OUTPUT "\n\n\n"; 
    print OUTPUT 

    $chan->close(); 
    } 
    close HOST; 
+0

これが私の問題を解決しました。みなさん、ありがとうございました! – Daniel

+4

あなたの問題は何が解決されましたか?動作するコードをダンプするだけで、誰かがdiffを実行することを期待することは受け入れられません。 – CanSpice

+0

@ CanSpice @誰かがコードを使いたいと思ったら、コードを投稿しました。私はdiffを見つけるために誰かに頼んだのですか?なぜ私は働くコードを掲示していたので気になりませんでした。 – Daniel

0

は単に私の$ SSH2 =ネットを置く:: SSH2->新しいです(); whileループの下の

+0

質問に答えるためにできるだけ多くの情報を提供してください。 (例:これは何を達成するか、どのように問題を修正するかなど) –

関連する問題