# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import paramiko
import os
_XFER_FILE = 'FILE'
_XFER_DIR = 'DIR'
class MainWindow(object):
# 構(gòu)造方法
def __init__(self, arg):
# 超類調(diào)用
super(MainWindow, self).__init__()
# 賦值參數(shù)[字典]
# 參數(shù)格式 arg = {'ip':'填ip','user':'用戶名','password':'密碼','port':22}
self.arg = arg
# 賦值參數(shù)[FTP]
self.sftp = None
# 調(diào)試日志
print self.arg
# 啟動(dòng)程序
def startup(self):
# 連接FTP
if self.sftp != None:
print u'您已經(jīng)成功連接了'
tmpstr = u'開(kāi)始連接...用戶名:'+self.arg['user']+u' 密碼:'+self.arg['password']+' IP:'+self.arg['ip']+u' 端口:'+str(self.arg['port'])
print tmpstr
try:
transport = paramiko.Transport((self.arg['ip'], self.arg['port']))
transport.connect(username=self.arg['user'], password=self.arg['password'])
self.sftp = paramiko.SFTPClient.from_transport(transport)
print (u'連接成功 '+self.arg['ip'])
except Exception as e:
print u'連接失?。?+str(e)
# 關(guān)閉程序
def shutdown(self):
# 關(guān)閉FTP
if self.sftp:
self.sftp.close()
print '### disconnect sftp server: %s!'%self.arg['ip']
self.sftp = None
# 處理上傳
def upload(self, source, target, replace):
### 操作數(shù)據(jù)
# 來(lái)源路徑
source = source.replace('\\', '/')
# 目標(biāo)路徑
target = target.replace('\\', '/')
### 驗(yàn)證數(shù)據(jù)
if not os.path.exists(source):
print u'來(lái)源資源不存在,請(qǐng)檢查:' + source
return
### 格式數(shù)據(jù)
# 格式化目標(biāo)路徑
self.__makePath(target)
### 處理數(shù)據(jù)
# 文件媒體數(shù)據(jù)(文件類型, 文件名稱)
filetype, filename = self.__filetype(source)
# 判斷文件類型
if filetype == _XFER_DIR:
# 1.目錄
self.uploadDir(source, target, replace)
elif filetype == _XFER_FILE:
# 2.文件
self.uploadFile(source, filename, replace)
# 傳送目錄
def uploadDir(self, source, target, replace):
### 驗(yàn)證數(shù)據(jù)
# 判斷目錄存在
if not os.path.isdir(source):
print u'這個(gè)函數(shù)是用來(lái)傳送本地目錄的'
return
### 處理數(shù)據(jù)
# 遍歷目錄內(nèi)容,上傳資源
for file in os.listdir(source):
# 資源路徑
filepath = os.path.join(source, file)
# 判斷資源文件類型
if os.path.isfile(filepath):
# 1.文件
self.uploadFile(filepath, file, replace)
elif os.path.isdir(filepath):
# 2.目錄
try:
self.sftp.chdir(file)
except:
self.sftp.mkdir(file)
self.sftp.chdir(file)
self.uploadDir(filepath, file, replace)
### 重置數(shù)據(jù)
# 返回上一層目錄
self.sftp.chdir('..')
# 傳送文件
def uploadFile(self, filepath, filename, replace):
### 驗(yàn)證數(shù)據(jù)
# 驗(yàn)證文件類型
if not os.path.isfile(filepath):
print u'這個(gè)函數(shù)是用來(lái)傳送單個(gè)文件的'
return
# 驗(yàn)證文件存在
if not os.path.exists(filepath):
print u'err:本地文件不存在,檢查一下'+filepath
return
# 驗(yàn)證FTP已連接
if self.sftp == None:
print u'sftp 還未鏈接'
return
### 處理數(shù)據(jù)
# 判斷文件存在是否覆蓋
if not replace:
if filename in self.sftp.listdir():
print u'[*] 這個(gè)文件已經(jīng)存在了,選擇跳過(guò):' + filepath + ' -> ' + self.sftp.getcwd() + '/' + filename
return
# 上傳文件
try:
self.sftp.put(filepath, filename)
print u'[+] 上傳成功:' + filepath + ' -> ' + self.sftp.getcwd() + '/' + filename
except Exception as e:
print u'[+] 上傳失敗:' + filepath + ' because ' + str(e)
# 獲得文件媒體數(shù)據(jù)({文件/目錄, 文件名稱})
def __filetype(self, source):
# 判斷文件類型
if os.path.isfile(source):
# 1.文件
index = source.rfind('/')
return _XFER_FILE, source[index+1:]
elif os.path.isdir(source):
# 2.目錄
return _XFER_DIR, ''
# 創(chuàng)建目標(biāo)路徑
# 說(shuō)明: 目標(biāo)路徑不存在則依次創(chuàng)建路徑目錄
def __makePath(self, target):
# 切換根目錄
self.sftp.chdir('/')
# 分割目標(biāo)目錄為目錄單元集合
data = target.split('/')
# 進(jìn)入目標(biāo)目錄, 目錄不存在則創(chuàng)建
for item in data:
try:
self.sftp.chdir(item)
print u'要上傳的目錄已經(jīng)存在,選擇性進(jìn)入合并:' + item
except:
self.sftp.mkdir(item)
self.sftp.chdir(item)
print u'要上傳的目錄不存在,創(chuàng)建目錄:' + item
if __name__ == '__main__':
# """
# 先熟悉一下sftp有哪些用法 sftp.listdir(可以傳參可以為空) 返回當(dāng)前目錄下清單列表
# mkdir 創(chuàng)建目錄對(duì)應(yīng)rmdir sftp.put(本地路徑,遠(yuǎn)程要存的文件名) chdir進(jìn)入子目錄
# """
arg = {'ip':'填ip','user':'填用戶名','password':'填密碼','port':22}
me = MainWindow(arg)
me.startup()
# 要上傳的本地文件夾路徑
source = r'E:\xampp\backup\mysql\cto'
# 上傳到哪里 [遠(yuǎn)程目錄](méi)
target = r'/home/www/cto/wp-superdo/backup/db'
replace = False
me.upload(source, target, replace)
me.shutdown()
def main(source, target, replace=False):
arg = {'ip':填ip,'user':填用戶名,'password':填密碼,'port':22}
me = MainWindow(arg)
me.startup()
me.upload(source, target, replace)
me.shutdown()