python通過sftp遠程傳輸文件


python提供了一個第三方模塊paramiko,通過這個模塊可以實現兩台機器之間的網絡連接,sftp是paramiko的一個方法,使用sftp可以在兩台機器之間互相傳輸
拷貝文件。然而paramiko的sftp只能拷貝文件,不能拷貝文件夾。要實現文件夾的拷貝,可以這樣子思考:使用深度搜索遍歷源目錄,若是文件,直接拷貝到
目的目錄;若是文件夾,則先在目的目錄建立一個子目錄,然后遍歷子目錄...使用遞歸函數,可以達到完全拷貝目錄的目的。實現代碼如下:

 

1.獲取一個sftp句柄

import paramiko

#建立連接,獲取sftp句柄
def  sftp_connect(username,password,host,port = 22 ):
     client  =  None
     sftp  =  None
     try :
         client  =  paramiko.Transport((host,port))
     except  Exception as error:
         print  error
     else :
         try :
             client.connect(username = username, password = password)
         except  Exception as error:
             print  error
         else :
             sftp  =  paramiko.SFTPClient.from_transport(client)
     return  client,sftp
#斷開連接
def  disconnect(client):
     try :
         client.close()
     except  Exception as error:
         print  error
2.從遠程機器上下載文件(夾)到本地

 

import os

import  sys
from  stat  import  S_ISDIR as isdir
def  _check_local(local):
     if  not  os.path.exists(local):
         try :
             os.mkdir(local)
         except  IOError as err:
             print  err
def  get(sftp,remote,local):
     #檢查遠程文件是否存在
     try :
         result  =  sftp.stat(remote)
     except  IOError as err:
         error  =  '[ERROR %s] %s: %s'  % (err.errno,os.path.basename(os.path.normpath(remote)),err.strerror)
         print  error
     else :
         #判斷遠程文件是否為目錄
         if  isdir(result.st_mode):
             dirname  =  os.path.basename(os.path.normpath(remote))
             local  =  os.path.join(local,dirname)
             _check_local(local)
             for  file  in  sftp.listdir(remote):
                 sub_remote  =  os.path.join(remote, file )
                 sub_remote  =  sub_remote.replace( '\\',' / ')
                 get(sftp,sub_remote,local)
         else :   
         #拷貝文件
             if  os.path.isdir(local):
                 local  =  os.path.join(local,os.path.basename(remote))
             try :
                 sftp.get(remote,local)
             except  IOError as err:
                 print  err
             else :
                 print  '[get]' ,local, '<==' ,remote

 

3.從本地拷貝文件(夾)到遠程機器

import os

def  put(sftp,local,remote):
     #檢查路徑是否存在
     def  _is_exists(path,function):
         path  =  path.replace( '\\',' / ')
         try :
             function(path)
         except  Exception as error:
             return  False
         else :
             return  True
     #拷貝文件
     def  _copy(sftp,local,remote):
         #判斷remote是否是目錄
         if  _is_exists(remote,function = sftp.chdir):
             #是,獲取local路徑中的最后一個文件名拼接到remote中
             filename  =  os.path.basename(os.path.normpath(local))
             remote  =  os.path.join(remote,filename).replace( '\\',' / ')
         #如果local為目錄
         if  os.path.isdir(local):
             #在遠程創建相應的目錄
             _is_exists(remote,function = sftp.mkdir)
             #遍歷local
             for  file  in  os.listdir(local):
                 #取得file的全路徑
                 localfile  =  os.path.join(local, file ).replace( '\\',' / ')
                 #深度遞歸_copy()
                 _copy(sftp = sftp,local = localfile,remote = remote)
         #如果local為文件
         if  os.path.isfile(local):
             try :
                 sftp.put(local,remote)
             except  Exception as error:
                 print  error
                 print  '[put]' ,local, '==>' ,remote, 'FAILED'
             else :
                 print  '[put]' ,local, '==>' ,remote, 'SUCCESSED'
     #檢查local
     if  not  _is_exists(local,function = os.stat):
         print  "'"+local+"': No such file or directory in local"
         return False
     #檢查remote的父目錄
     remote_parent =  os.path.dirname(os.path.normpath(remote))
     if not _is_exists(remote_parent,function=sftp.chdir):
         print "'" + remote + "': No such file or directory in remote"
         return  False
     #拷貝文件
     _copy(sftp = sftp,local = local,remote = remote)

 


免責聲明!

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



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