• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
11
12class ssh_session:
13
14    "Session with extra state including the password to be used."
15
16    def __init__(self, user, host, password=None, verbose=0):
17
18        self.user = user
19        self.host = host
20        self.verbose = verbose
21        self.password = password
22        self.keys = [
23            'authenticity',
24            'assword:',
25            '@@@@@@@@@@@@',
26            'Command not found.',
27            EOF,
28            ]
29
30        self.f = open('ssh.out','w')
31
32    def __repr__(self):
33
34        outl = 'class :'+self.__class__.__name__
35        for attr in self.__dict__:
36            if attr == 'password':
37                outl += '\n\t'+attr+' : '+'*'*len(self.password)
38            else:
39                outl += '\n\t'+attr+' : '+str(getattr(self, attr))
40        return outl
41
42    def __exec(self, command):
43
44        "Execute a command on the remote host.    Return the output."
45        child = spawn(command,
46                                    #timeout=10,
47                                    )
48        if self.verbose:
49            sys.stderr.write("-> " + command + "\n")
50        seen = child.expect(self.keys)
51        self.f.write(str(child.before) + str(child.after)+'\n')
52        if seen == 0:
53            child.sendline('yes')
54            seen = child.expect(self.keys)
55        if seen == 1:
56            if not self.password:
57                self.password = getpass.getpass('Remote password: ')
58            child.sendline(self.password)
59            child.readline()
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            sys.stderr.write("<- " + child.before + "|\n")
69        try:
70            self.f.write(str(child.before) + str(child.after)+'\n')
71        except:
72            pass
73        self.f.close()
74        return child.before
75
76    def ssh(self, command):
77
78        return self.__exec("ssh -l %s %s \"%s\"" \
79                                             % (self.user,self.host,command))
80
81    def scp(self, src, dst):
82
83        return self.__exec("scp %s %s@%s:%s" \
84                                             % (src, session.user, session.host, dst))
85
86    def exists(self, file):
87
88        "Retrieve file permissions of specified remote file."
89        seen = self.ssh("/bin/ls -ld %s" % file)
90        if string.find(seen, "No such file") > -1:
91            return None # File doesn't exist
92        else:
93            return seen.split()[0] # Return permission field of listing.
94
95