source: CMTManagement/utils/ssh_session.py@ 421

Last change on this file since 421 was 421, checked in by garonne, 18 years ago
File size: 3.5 KB
RevLine 
[421]1#
2# Eric S. Raymond
3#
4# Greatly modified by Nigel W. Moriarty
5# April 2003
6#
7from pexpect import *
8import os, sys
9import getpass
10import time, string
11
12class ssh_session:
13 "Session with extra state including the password to be used."
14 def __init__(self, user, host, password=None, verbose=0):
15 self.user = user
16 self.host = host
17 self.verbose = verbose
18 self.password = password
19 self.keys = [
20 'authenticity',
21 ' password: ',
22 '@@@@@@@@@@@@',
23 'Command not found.',
24 EOF,
25 ]
26 #self.f = open('ssh.out','w+')
27
28 def __del__(self):
29 pass
30 #self.f.close()
31
32 def __repr__(self):
33 outl = 'class :'+self.__class__.__name__
34 for attr in self.__dict__:
35 if attr == 'password':
36 outl += '\n\t'+attr+' : '+'*'*len(self.password)
37 else:
38 outl += '\n\t'+attr+' : '+str(getattr(self, attr))
39 return outl
40
41 def __exec(self, command):
42 "Execute a command on the remote host. Return the output."
43 child = spawn(command, timeout=5000)
44 #child.timeout = 5000
45 if self.verbose:
46 print "-> " + command + "\n"
47 #sys.stderr.write("-> " + command + "\n")
48 seen = child.expect(self.keys)
49 #self.f.write(str(child.before) + str(child.after)+'\n')
50 if seen == 0:
51 child.sendline('yes')
52 seen = child.expect(self.keys)
53 if seen == 1:
54 if not self.password:
55 self.password = getpass.getpass(self.user+'@'+self.host+"'s password:")
56 child.sendline(self.password)
57 child.readline()
58 for line in child:
59 print string.replace(line, "\n", "")
60 time.sleep(5)
61 # Added to allow the background running of remote process
62 if not child.isalive():
63 seen = child.expect(self.keys)
64 if seen == 2:
65 lines = child.readlines()
66 #self.f.write(lines)
67 if self.verbose:
68 pass
69 print "<- " + child.before +"|\n"
70 try:
71 pass
72 #self.f.write(str(child.before) + str(child.after)+'\n')
73 except:
74 pass
75 return child.before
76
77 def ssh(self, command):
78 return self.__exec("ssh -l %s %s \"%s\"" \
79 % (self.user,self.host,command))
80
81 def scp(self, src, dst, option=None):
82 if option:
83 return self.__exec("scp -"+option+" %s %s@%s:%s" \
84 % (src, self.user, self.host, dst))
85
86 return self.__exec("scp %s %s@%s:%s" \
87 % (src, self.user, self.host, dst))
88
89 def scpget(self, src, dst, option=None):
90 if option:
91 return self.__exec("scp -"+option+" %s@%s:%s %s " \
92 % (self.user, self.host, src, dst))
93
94 return self.__exec("scp %s@%s:%s %s " \
95 % (self.user, self.host, src, dst))
96
97
98 def exists(self, file):
99 "Retrieve file permissions of specified remote file."
100 seen = self.ssh("/bin/ls -ld %s" % file)
101 if string.find(seen, "No such file") > -1:
102 return None # File doesn't exist
103 else:
104 return seen.split()[0] # Return permission field of listing.
Note: See TracBrowser for help on using the repository browser.