| # |
| # Eric S. Raymond |
| # |
| # Greatly modified by Nigel W. Moriarty |
| # April 2003 |
| # |
| from pexpect import * |
| import os |
| import sys |
| import getpass |
| import time |
| |
| |
| class ssh_session: |
| |
| "Session with extra state including the password to be used." |
| |
| def __init__(self, user, host, password=None, verbose=0): |
| |
| self.user = user |
| self.host = host |
| self.verbose = verbose |
| self.password = password |
| self.keys = [ |
| 'authenticity', |
| 'assword:', |
| '@@@@@@@@@@@@', |
| 'Command not found.', |
| EOF, |
| ] |
| |
| self.f = open('ssh.out', 'w') |
| |
| def __repr__(self): |
| |
| outl = 'class :' + self.__class__.__name__ |
| for attr in self.__dict__: |
| if attr == 'password': |
| outl += '\n\t' + attr + ' : ' + '*' * len(self.password) |
| else: |
| outl += '\n\t' + attr + ' : ' + str(getattr(self, attr)) |
| return outl |
| |
| def __exec(self, command): |
| "Execute a command on the remote host. Return the output." |
| child = spawn(command, |
| # timeout=10, |
| ) |
| if self.verbose: |
| sys.stderr.write("-> " + command + "\n") |
| seen = child.expect(self.keys) |
| self.f.write(str(child.before) + str(child.after) + '\n') |
| if seen == 0: |
| child.sendline('yes') |
| seen = child.expect(self.keys) |
| if seen == 1: |
| if not self.password: |
| self.password = getpass.getpass('Remote password: ') |
| child.sendline(self.password) |
| child.readline() |
| time.sleep(5) |
| # Added to allow the background running of remote process |
| if not child.isalive(): |
| seen = child.expect(self.keys) |
| if seen == 2: |
| lines = child.readlines() |
| self.f.write(lines) |
| if self.verbose: |
| sys.stderr.write("<- " + child.before + "|\n") |
| try: |
| self.f.write(str(child.before) + str(child.after) + '\n') |
| except: |
| pass |
| self.f.close() |
| return child.before |
| |
| def ssh(self, command): |
| |
| return self.__exec("ssh -l %s %s \"%s\"" |
| % (self.user, self.host, command)) |
| |
| def scp(self, src, dst): |
| |
| return self.__exec("scp %s %s@%s:%s" |
| % (src, session.user, session.host, dst)) |
| |
| def exists(self, file): |
| "Retrieve file permissions of specified remote file." |
| seen = self.ssh("/bin/ls -ld %s" % file) |
| if string.find(seen, "No such file") > -1: |
| return None # File doesn't exist |
| else: |
| return seen.split()[0] # Return permission field of listing. |