#!/usr/bin/env python2 ## Load the basic modules we want. import re, os, sys, time, commands, getopt, types ## This is the Expect module. import pexpect import getpass #------------------------------------------- ## Initialize the module. class Ssh: def __init__(self): ## Three responses we might expect. self.Initial_Responses = ['Are you sure', 'password:', pexpect.EOF] #------------------------------------------- def Ssh_Method1(self, User="", Password="", Host="", Timeout=120, Response='', Command="", Opposite_Match = 0): if Command == '': return (-1, '') elif Response == '': return (-2, '') ## Execute the command. child = pexpect.spawn(Command) ## Get the first response. i = child.expect (self.Initial_Responses, Timeout) ## The first reponse is to accept the key. if i==0: T = child.read(100) child.sendline("yes") child.expect('password:', Timeout) child.sendline(Password) ## The second response sends the password. elif i == 1: child.sendline(Password) ## Otherwise, there is an error. else: Str1 = str(child.before) return (-3, 'ERROR: Unknown1: ' + Str1) ## Get the next response. Possible_Responses = ['password:', pexpect.EOF] i = child.expect (Possible_Responses, Timeout) ## If it asks for a password, error. if i == 0: return (-4, 'ERROR: Incorrect password.') ## Otherwise we are okay. else: ## Get the output before the match. Output = str(child.before) ## Compile a regular expression. RE1 = re.compile(Response) ## If OM = 1, it means "don't match". OM = Opposite_Match ## If we detecting a positive match and ## it works, return good. if (OM == 0) and (RE1.search(Output)): return (0, Output) ## If we are trying not to detect a match ## and it doesn't match, return good. elif (OM != 0) and (not RE1.search(Output)): return (0, Output) else : ## Otherwise, there is an error. return (-6, str(child.after)) #-------------------------------------------- ## This method detects if a file exists. def File_Test_Exist(self,Destination_File="", User="", Password="", Host="", Timeout=120): Command = """ssh -l %s %s 'if test -e %s ;\ then echo "GOOD: FILE EXISTS" ; fi'""" \ %(User, Host, Destination_File) Response = 'GOOD: FILE EXISTS' (Error, Message) = self.Ssh_Method1(User=User, Password=Password, Host=Host, Timeout=Timeout , Response=Response, Command=Command) if Error == -5: Message ="ERROR: file doesn't exist. "+Message return (Error, Message) #------------------------------------------- ## This transfers a file using rsync with ssh. def Script_Transfer(self, Destination_Script="", User="", Password="", Host="", Source_Script="" , Timeout=120): Command = """rsync -e ssh -av %s %s@%s:%s"""\ %(Source_Script, User, Host, Destination_Script) Response = 'rsync error:' (Error, Message) = self.Ssh_Method1(User=User, Password=Password, Host=Host, Timeout=Timeout , Response=Response, Command=Command, Opposite_Match=1) return (Error, Message) #--------------------------------------------- def Script_Execute(self, Destination_Script="", User="", Password="", Host="", Timeout=120): ## Use local python if available. Python_Command = "/usr/local/python/bin/python" (Test1,Output) = self.File_Test_Exist( Destination_File=Python_Command, User=User, Password=Password, Host=Host) if Test1 != 0: Python_Command = "python" Command = """ssh -l %s %s '%s %s'""" %(User, Host, Python_Command, Destination_Script) Response = 'GOOD:' (Error, Message) = self.Ssh_Method1(User=User, Password=Password, Host=Host, Timeout=Timeout , Response=Response, Command=Command) return (Error, Message) #------------------------------------------- def Download_File(self, File_Client="", File_Destination="", User="", Password="", Host="", Timeout=3600): Command = """rsync -av -e ssh %s@%s:%s %s""" %( User, Host, File_Client, File_Destination) Response = 'rsync error:' ## We set Opposite_Match to 1 because ## we don't want to match the reposnse. (Error, Message) = self.Ssh_Method1( User=User, Password=Password, Host=Host, Timeout=Timeout , Response=Response, Command=Command, Opposite_Match=1 ) return (Error, Message) #-------------------------------------------