forked from OSchip/llvm-project
94 lines
2.7 KiB
Python
94 lines
2.7 KiB
Python
#
|
|
# 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.
|