Source code for siman.SSHTools

# SSHTools module
#
# Andriy Zhugayevych (azh@ukr.net), Sergei Matveev(matseralex@yandex.ru)
# www.zhugayevych.me/python/SSHTools/index.htm
# created 21.08.2014, modified 12.09.2016

import paramiko
import os
import hashlib

[docs]class SSHTools: user=""; host=""; pkeypath=""; pkey=""; port=22 ###############################################################################################
[docs] def setup( self, user="", host="", pkey="", port=22 ): if user: self.user = user if host: self.host = host if pkey: self.pkeypath = pkey self.port = port self.ssh = paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.pkey = paramiko.RSAKey.from_private_key_file(pkey)
###############################################################################################
[docs] def run( self, command, noerror=False, printout=False ): if printout: print("command:",command) # print("command:",command) self.ssh.connect(self.host,username=self.user,pkey=self.pkey,port=self.port) stdin,stdout,stderr = self.ssh.exec_command(command) out=stdout.readlines() err=stderr.readlines() self.ssh.close() if err: if noerror: if printout: print("stderr:","".join(err)) return ("".join(err)).strip() else: raise Warning("stderr: "+"".join(err)) if printout: if len(out)==1: print("output:",out[0].rstrip()) else: print("output:") for s in out: print(s.rstrip()) return ("".join(out)).strip()
###############################################################################################
[docs] def put( self, source, dest ): self.ssh.connect(self.host,username=self.user,pkey=self.pkey,port=self.port) sftp = self.ssh.open_sftp() # print(source, dest) # print(os.getcwd()) # print(os.path.exists(source) ) sftp.put(source,dest) sftp.close() self.ssh.close() return
###############################################################################################
[docs] def get( self, source, dest ): # print(source, dest ) self.ssh.connect(self.host,username=self.user,pkey=self.pkey,port=self.port) sftp = self.ssh.open_sftp() sftp.get(source,dest) sftp.close() self.ssh.close() return
###############################################################################################
[docs] def sget( self, source, dest, keeplocal=False ): self.ssh.connect(self.host,username=self.user,pkey=self.pkey,port=self.port) sftp = self.ssh.open_sftp() sftp.get(source,dest) sftp.close() self.ssh.close() s=self.run("md5sum "+source) md5_remote=str(s).split()[0] md5_local=hashlib.md5(open(dest,'rb').read()).hexdigest() if md5_local!=md5_remote: print("md5 sums are different for",source,"and",dest,": ",md5_remote,"!=",md5_local) if not(keeplocal): os.remove(dest) print("Local copy is removed") raise Warning("Checksum error") return 0
###############################################################################################
[docs] def fexists(self, filename): # return isinstance ( self.run ("ls "+ filename, noerror=True), str) return filename == self.run("ls " + filename, noerror = True)