Pull in SSHInteract from 2.8 stream
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/branches/2.7@12794 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		
							
								
								
									
										70
									
								
								xCAT-server/lib/perl/xCAT/SSHInteract.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								xCAT-server/lib/perl/xCAT/SSHInteract.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| package xCAT::SSHInteract; | ||||
| use Exporter; | ||||
| use Net::Telnet; | ||||
| use strict; | ||||
| our @ISA = qw/Exporter Net::Telnet/; | ||||
| our @EXPORT_OK = (); | ||||
| use IO::Pty; | ||||
| use POSIX; | ||||
|  | ||||
| sub _startssh { | ||||
| 	my $self = shift; | ||||
| 	my $pty = shift; | ||||
| 	my $name = shift; | ||||
| 	my $dest = shift; | ||||
| 	my %args=@_; | ||||
| 	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); | ||||
| 	my @cmd =  ("ssh","-o","StrictHostKeyChecking=no"); | ||||
| 	if ($args{"-nokeycheck"}) { | ||||
| 		push @cmd,("-o","UserKnownHostsFile=/dev/null"); | ||||
| 	} | ||||
| 	push @cmd,("-l",$name,$dest); | ||||
| 	exec @cmd; | ||||
| } | ||||
|  | ||||
| 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 $nokeycheck = $args{"-nokeycheck"}; | ||||
| 	if ($nokeycheck) { delete $args{"-nokeycheck"}; } | ||||
| 	my $self = Net::Telnet->new(%args); | ||||
| 	_startssh($self,$pty,$username,$host,"-nokeycheck"=>$nokeycheck); | ||||
|     my ($prematch,$match) = $self->waitfor([Match => $args{prompt},'/password:/i',]) or die "Login Failed: ",$self->lastline; | ||||
|     if ($match =~ /password:/i) { | ||||
| 	    #$self->waitfor("-match" => '/password:/i', -errmode => "return") or die "Unable to reach host ",$self->lastline; | ||||
|             $self->print($password); | ||||
|             my $nextline = $self->getline(); | ||||
|             if ($nextline eq "\n") { | ||||
| 		$nextline = $self->get(); | ||||
| 	    } | ||||
| 	    if ($nextline =~ /^password:/ or $nextline =~ /Permission denied, please try again/) { | ||||
| 		    die "Incorrect Password"; | ||||
| 	    } | ||||
|     } | ||||
| 	return bless($self,$class); | ||||
| } | ||||
| 1; | ||||
		Reference in New Issue
	
	Block a user