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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM