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)