啥也不說,先上代碼
#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)
