monnappa appaiah wrote:
> Hi all,
> 
> 
>         I'm using windows machine and i'm using Net::SSH2 module to connect
> to remote machine
> 
> below is the code i'm using, its working fine if i'm connecting to one host
> 
> #!/usr/bin/perl -w
> use strict;
> use Net::SSH2;
> 
> 
> my $ssh2 = Net::SSH2->new();
> $ssh2->connect("hostname") or die "Unable to connect host $@ \n";
> $ssh2->auth_password('<username>','<password>');
> my $chan = $ssh2->channel();
> $chan->exec('ls -al');
> my $buflen = 10000;
> my $buf1 = '0' x $buflen;
> $chan->read($buf1, $buflen);
> print "BUF1:\n", $buf1,"\n";
> $chan->exec('exit');
> $ssh2->disconnect();
> 
> 
> 
> How can i use the same piece of code to read a list of hosts from a text
> file and then connect to all the hosts in that text file.....I tried the
> below code but its not working....can somebody please help me with this.
> 
> 
> 
> 
> 
> #!/usr/bin/perl -w

It is better to use the 'warnings' pragma than the command-line switch.

  use warnings;

> use strict;
> use Net::SSH2;
> 
> open INPUT, "< input.txt"

It is preferred to use the three-parameter form of 'open', together with lexical
file handles. You should also check the status of the open to make sure it
succeeded.

  open my $input, '<', 'input.txt' or die $!;

> 
> while (<INPUT>) {

The reason your program isn't working is probably because you have left a
trailing record separator on the end of each line read. Remove it before using 
it.

  while (<$input>) {

    chomp;

> my $ssh2 = Net::SSH2->new();
> $ssh2->connect("$_") or die "Unable to connect host $@ \n";

It is wrong to quote Perl variables as it does something very specific that you
probably don't want.

> $ssh2->auth_password('<username>','<password>');
> my $chan = $ssh2->channel();
> $chan->exec('ls -al');
> my $buflen = 10000;

It is better to set this value as a constant near the beginning of the program

  use constant BUFLEN => 10_000;

> my $buf1 = '0' x $buflen;

There is no need to pre-extend the scalar variable. This isn't C, and Perl will
do the right thing for you. More accurately the Net::SSH2 module will. And why
is it buf1 when there is no buf2 etc.?

  my $buf;

> $chan->read($buf1, $buflen);

You cannot assume that you have read all of the data to be returned, so you
should check it.

  my $read = $chan->read($buf, BUFLEN);


> print "BUF1:\n", $buf1,"\n";

There is no need for multiple parameters to print.

  print "BUF1:\n$buf\n";

> $chan->exec('exit');
> $ssh2->disconnect();
> }

The changes I have noted result in a program that looks something like this. The
program is untested except to make sure that it compiles.

HTH,

Rob



use strict;
use warnings;

use Net::SSH2;

use constant BUFLEN => 10_000;

open my $input, '<', 'input.txt' or die $!;

while (<$input>) {

  chomp;

  my $ssh2 = Net::SSH2->new;
  $ssh2->connect($_) or die "Unable to connect host $_\n";
  $ssh2->auth_password('<username>','<password>');

  my $chan = $ssh2->channel;
  $chan->exec('ls -al');

  my $buf;
  my $read = $chan->read($buf, BUFLEN);
  die 'More than ', BUFLEN, ' characters in listing' if $read >= BUFLEN;

  print "BUF:$buf\n";
  $chan->exec('exit');
  $ssh2->disconnect;
}

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to