From e88e88e925a370e91086ba82b40343324bb049ce Mon Sep 17 00:00:00 2001 From: jbjohnso Date: Thu, 29 Mar 2012 20:10:50 +0000 Subject: [PATCH] Add xCAT::SSH to help ssh-ify blade.pm to cope with CMMs that do not do telnet by default git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@12059 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/perl/xCAT/SSH.pm | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 xCAT-server/lib/perl/xCAT/SSH.pm diff --git a/xCAT-server/lib/perl/xCAT/SSH.pm b/xCAT-server/lib/perl/xCAT/SSH.pm new file mode 100644 index 000000000..0301463f7 --- /dev/null +++ b/xCAT-server/lib/perl/xCAT/SSH.pm @@ -0,0 +1,55 @@ +package xCAT::SSH; +use Exporter; +use Net::Telnet; +use strict; +our @ISA = qw/Exporter Net::Telnet/; +our @EXPORT_OK = (); +use IO::Pty; +use POSIX; + +sub _startssh { + my $pty = shift; + my $name = shift; + my $dest = shift; + my $tty; + my $tty_fd; + my $pid = fork(); + if ($pid) { + return; + } + #in child + $tty = $pty->slave or die "$!"; + $tty_fd = $tty->fileno or die "$!"; + close($pty); + open STDIN, "<&", $tty_fd; + open STDOUT,">&",$tty_fd; + $pty->make_slave_controlling_terminal(); + close($tty); + exec ("ssh","-o","StrictHostKeyChecking=no","-l",$name,$dest); +} + +sub new { + my $class = shift; + my %args = @_; + my $pty = IO::Pty->new or die "Unable to perform ssh: $!"; + $args{"-fhopen"} = $pty; + $args{"-telnetmode"} = 0; + $args{"-telnetmode"} = 0; + $args{"-cmd_remove_mode"} = 1; + my $username = $args{"-username"}; + my $host = $args{"-host"}; + my $password = $args{"-password"}; + delete $args{"-host"}; + delete $args{"-username"}; + delete $args{"-password"}; + my $self = Net::Telnet->new(%args); + _startssh($pty,$username,$host); + $self->waitfor("-match" => '/password:/i', -errmode => "return") or die "Unable to reach host ",$self->lastline; + $self->print($password); + my $nextline = $self->getline(); + if ($nextline =~ /^password:/ or $nextline =~ /Permission denieid, please try again/) { + die "Incorrect Password"; + } + return bless($self,$class); +} +1;