class SFTPModel:
def __init__(self, host, user, password):
t = paramiko.Transport((host, 22))
t.connect(username=user, password=password)
self.sftp = paramiko.SFTPClient.from_transport(t) # use the style of t connection remote server
def search_allfiles(self, path, basedir=None):
"""
through sftp find all files in path
:param sftp:
:param path:
:param basedir:
:return:
{'relative path ':'absolute path',}
relative path for local
absolute path for remote(source path)
"""
if not basedir:
basedir = os.path.basename(path)
else:
basedir = os.path.join(basedir, os.path.basename(path))
filename_list_dic = {}
mode = self.sftp.stat(path).st_mode
if stat.S_ISDIR(mode):
# is directory
cur_filelist = self.sftp.listdir(path)
for f in cur_filelist:
filename_list_dic = dict(filename_list_dic.items() + self.search_allfiles(path + "/" + f, basedir).items())
else:
filename_list_dic[basedir] = path
return filename_list_dic
def download_file(self, from_file_path, to_local_path):
"""
from from_file_path to to_local_path download this file
:param from_file_path:
:param to_local_path:
:return:
"""
if os.path.exists(to_local_path):
standout_print("Info: %s exist" % to_local_path)
return
dir_local_path = os.path.dirname(to_local_path)
if not os.path.exists(dir_local_path):
os.makedirs(dir_local_path)
to_local_path = to_local_path.replace("\\", "/")
self.sftp.get(from_file_path, to_local_path)
standout_print("download file %s from %s finish." % (to_local_path, from_file_path))
def download_directory(self, from_file_directory, to_local_directory):
if not os.path.exists(to_local_directory):
sys.stderr("Error: local directory of compile path is no exist")
sys.exit(-1)
base_dir = os.path.basename(from_file_directory)
file_list_dir = self.search_allfiles(from_file_directory)
for relative_path in file_list_dir.keys():
to_local_path = os.path.join(to_local_directory, relative_path)
from_file = file_list_dir[relative_path]
self.download_file(from_file, to_local_path)