Well, line 20 is:
$ssh->login($usr,$pwd,$ssh);

so if that's the line that's dying you can wrap it in an eval -
see perldoc -f eval
If there is a syntax error or runtime error, or a "die" statement is
executed, "eval" returns an undefined value in scalar context or an empty
list in list context, and $@ is set to the error message.

so you'd test $@ and skip to the next host if the login failed.  But but my
perldoc Net::SSH::Perl  doesn't seem to say it'd die if the login failed so
there may be more going on. It also says the login() syntax is:
$ssh->login([ $user [, $password [, $suppress_shell ] ] ])


which, in your case, means you're passing in the ssh object in the suppress
shell spot:
By default, Net::SSH::Perl will open a channel with a shell on it. This is
usually what you want. If you are tunneling another protocol over SSH,
however, you may want to prevent this behavior.  Passing a true value in
$suppress_shell will prevent the shell channel from being opened (SSH2
only).

But you're doing a number of unsafe/smart things - you die on the first
open, but don't include "$!" to get the reason why. You don't  test your
second open or the return codes on any of your ssh->cmd calls





On Wed, Mar 20, 2013 at 3:50 PM, Alvin Ramos <w...@theflux.net> wrote:

> I'm wanting to run through each server, but if it gets to a server that it
> can't login not to die. The "server-list.txt" has:
> localhost
> localhost2
> localhost3
> localhost4
>
> When it gets to localhost3 and it dies with: Permission denied at ./
> linux_discovery.pl line 20
>
> I would like it to keep rolling over to localhost4, code below, open for
> suggestions and appreciate it!
>
> #!/usr/bin/perl -w
> use Net::SSH::Perl;
>
> my $file = "server-list.txt";
> my $usr = "root";
> my $pwd = "password";
> my $output_file = "servers_information.txt";
>
> open(HANDLE, $file) or die("Cant open the file :( ");
> @server_list = <HANDLE>;
> close(HANDLE);
> chomp @server_list;
>
> open(HANDLE, ">>$output_file");
> foreach $host (@server_list)
> {
>
> my $ssh = Net::SSH::Perl->new($host);
> print "Logging into server: $host \n";
> $ssh->login($usr,$pwd,$ssh);
> my($unameout) = $ssh->cmd("/bin/uname -a");
> my($userout) = $ssh->cmd("/bin/cat /etc/passwd");
> my($upout) = $ssh->cmd("/usr/bin/uptime");
> my($lastout) = $ssh->cmd("/usr/bin/last");
> my($ipout) = $ssh->cmd("/sbin/ifconfig");
> my($hostout) = $ssh->cmd("/bin/hostname");
> print HANDLE "---------------------------------- \n";
> print HANDLE "Hostname : $host \n";
> print HANDLE "Uptime : $upout \n";
> print HANDLE "Kernel : $unameout \n";
> print HANDLE "Users : $userout \n";
> print HANDLE "Last Login : $lastout \n";
> print HANDLE "IP Address : $ipout \n";
> print HANDLE "Real Hostname: $hostout \n";
> print HANDLE "----------------------------------\n\n";
> }
>



-- 

a

Andy Bach,
afb...@gmail.com
608 658-1890 cell
608 261-5738 wk

Reply via email to