1. 程式人生 > 其它 >python paramiko上傳資料夾到linux

python paramiko上傳資料夾到linux

fabric2不行,那個put方法是上傳一個檔案,而非是一個資料夾。

現在使用paramiko來實現資料夾的上傳。

import os
import re
import sys
import time
from nb_log import LoggerMixin
import paramiko


class ParamikoFolderUploader(LoggerMixin):
    """
    paramoki 實現的資料夾上傳
    """

    def __init__(self, host, port, user, password, local_dir: str, remote_dir: str,
                 path_pattern_exluded_tuple
=('/.git/', '/.idea/',), file_suffix_tuple_exluded=('.pyc', '.log', '.gz'), only_upload_within_the_last_modify_time=3650 * 24 * 60 * 60, file_volume_limit=1000 * 1000, ): """ :param host: :param port: :param user: :param password: :param local_dir: :param remote_dir: :param path_pattern_exluded_tuple: 命中了這些正則的直接排除 :param file_suffix_tuple_exluded: 這些結尾的檔案排除 :param only_upload_within_the_last_modify_time: 僅僅上傳最近多少天修改的檔案 :param file_volume_limit: 大於這個體積的不上傳,單位b。
""" self._host = host self._port = port self._user = user self._password = password self._local_dir = str(local_dir).replace('\\', '/') if not self._local_dir.endswith('/'): self._local_dir += '/' self._remote_dir = str(remote_dir).replace('
\\', '/') if not self._remote_dir.endswith('/'): self._remote_dir += '/' self._path_pattern_exluded_tuple = path_pattern_exluded_tuple self._file_suffix_tuple_exluded = file_suffix_tuple_exluded self._only_upload_within_the_last_modify_time = only_upload_within_the_last_modify_time self._file_volume_limit = file_volume_limit t = paramiko.Transport((host, port)) t.connect(username=user, password=password) self.sftp = paramiko.SFTPClient.from_transport(t) ssh = paramiko.SSHClient() ssh.load_system_host_keys() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host, port=port, username=user, password=password, compress=True) self.ssh = ssh def _judge_need_filter_a_file(self, filename: str): ext = filename.split('.')[-1] if '.' + ext in self._file_suffix_tuple_exluded: return True for path_pattern_exluded in self._path_pattern_exluded_tuple: if re.search(path_pattern_exluded, filename): return True file_st_mtime = os.stat(filename).st_mtime volume = os.path.getsize(filename) if time.time() - file_st_mtime > self._only_upload_within_the_last_modify_time: return True if volume > self._file_volume_limit: return True return False def _make_dir(self, dir, final_dir): """ sftp.mkdir 不能直接越級建立深層級資料夾。 :param dir: :param final_dir: :return: """ # print(dir,final_dir) try: self.sftp.mkdir(dir) if dir != final_dir: self._make_dir(final_dir, final_dir) except (FileNotFoundError,): parrent_dir = os.path.split(dir)[0] self._make_dir(parrent_dir, final_dir) def _sftp_put(self, file_full_name, remote_full_file_name): self.sftp.put(file_full_name, remote_full_file_name) def upload(self): for parent, dirnames, filenames in os.walk(self._local_dir): for filename in filenames: file_full_name = os.path.join(parent, filename).replace('\\', '/') if not self._judge_need_filter_a_file(file_full_name): remote_full_file_name = re.sub(f'^{self._local_dir}', self._remote_dir, file_full_name) try: self._sftp_put(file_full_name, remote_full_file_name) except (FileNotFoundError,) as e: # self.logger.warning(remote_full_file_name) self._make_dir(os.path.split(remote_full_file_name)[0], os.path.split(remote_full_file_name)[0]) self._sftp_put(file_full_name, remote_full_file_name) else: # self.logger.warning(f'此檔案 {file_full_name} 符合過濾要求,不執行上傳') pass if __name__ == '__main__': uploader = ParamikoFolderUploader('192.168.6.133', 22, 'xiaomin', '123456', 'f:/coding2/dssf_proj/', '/home/ydf/codes/dssf6/') uploader.upload()
反對極端面向過程程式設計思維方式,喜歡面向物件和設計模式的解讀,喜歡對比極端面向過程程式設計和oop程式設計消耗程式碼程式碼行數的區別和原因。致力於使用oop和36種設計模式寫出最高可複用的框架級程式碼和使用最少的程式碼行數完成任務,致力於使用oop和設計模式來使部分程式碼減少90%行,使絕大部分py檔案最低減少50%-80%行的寫法。