python通过sftp实现文件上传功能

啥也不说,先上代码

#coding:utf-8
import paramiko,os,logging

class file_gain:
    def __init__(self,**kwargs):
        """
        :param username: 用户名
        :param password: 密码
        :param src: 目标机器地址
        :param Grade: 日志输出级别
        :param path: 输出日志路径
        :param fmt: 指定上传或者下载
        """
        self.username = kwargs["username"]
        self.password = kwargs["password"]
        self.src = kwargs["src"]
        self.Grade = kwargs.get("Grade","INFO")
        self.path = kwargs.get("path","logging.log")
        self.fmt = kwargs.get("fmt",None)
    def copy(self,**kwargs):
        """
        :param proto: 原文件路径
        :param dst: 文件存放位置
        :param method: 指定上传或者下载,get或者put
        :return: bool
        """
        try:
            self.proto = kwargs["proto"]
            self.dst = kwargs["dst"]
            self.method = kwargs["method"]
            if self.method not in ("put","get"):
                raise Exception("Method Error")

            transport = paramiko.Transport((self.src, 22))
            transport.connect(username=self.username, password=self.password)

            # 如果需要密匙,这里就需要加入一个密匙参数hostkey=密匙
            sftp = paramiko.SFTPClient.from_transport(transport)
            # 使用反射机制实现get或put逻辑运行
            getattr(sftp, self.method)(self.proto, self.dst)
            # sftp.put(proto,dst)
            # sftp.get(proto,dst)
            transport.close()
            return True
        except Exception as e:
            logObj = self.test_log()
            grade = self.Grade.lower()
            text = "错误信息:%s"%e
            getattr(logObj,grade)(text)

            return False

    def test_log(self):
        # 创建一个新的日志对象
        logger = logging.getLogger()

        if not logger.handlers:

            # 设置日志级别
            logger.setLevel(self.Grade)

            # 创建控制台
            sh = logging.StreamHandler()

            # 把设置的日志级别放置于控制台中
            logger.addHandler(sh)

            # 设置日志输出格式
            if not self.fmt:
                self.fmt = "%(asctime)s %(filename)s %(funcName)s %(levelname)s %(message)s"
            formter = logging.Formatter(self.fmt)
            sh.setFormatter(formter)

            # 创建文件管理
            fh = logging.FileHandler(self.path, encoding="utf-8")

            # 添加日志到文件中
            logger.addHandler(fh)

            # 设置文件中的日志格式
            fh.setFormatter(formter)
        return logger

运行成功或者失败均会返回对应的布尔值,并且失败后这里面也有日志的方法封装,默认在项目路径下输出一个错误日志文件,便于调错。
使用方式:

# allCentent是整个链接的全局参数
allCentent = {
    "username":"root",
    "password":"123456",
    "src":"192.168.70.128",
}
# d代表的是每次使用文件远程传输方法的时候是下载还是上传
d = {
    "proto":os.path.join(os.getcwd(),"1.txt"),
    "dst":"/root/2.txt",
    "method":"put"
}

a = file_gain(**allCentent)
onOff = a.copy(**d)
print(onOff)

d = {
    "proto":"/root/2.txt",
    "dst":os.path.join(os.getcwd(),"3.txt"),
    "method":"get"
}
onOff = a.copy(**d)
print(onOff)
posted @ 2021-05-26 10:51  影梦无痕  阅读(1550)  评论(0编辑  收藏  举报