用Python操作SFTP的简易代码

因为一个具体项目的需求,我们需要在SFTP环境下上传下载资料。以前类似的需求是在Windows环境下用CMD调用WinSCP实现的,现在需要使用Pthon,就学习了一下paramiko库的简单使用。

记录一下已经实现的部分:

  1. 安装paramiko库
  2. 单文件的上传和下载
  3. 多文件和目录部分暂时没有实现,以后需要的时候再补充

安装paramiko

因为我们使用的是Anaconda环境,所以安装模块非常简单

conda install paramiko
复制代码

Python代码

paramiko的使用方法比较直观,可以和操作JDBC进行类比。首先获取一个链接,然后使用这个链接对象进行具体的上传下载,最后关闭连接。简单粗暴,非常有效。

获取Connect

import paramiko
import os

# 获取连接
def getConnect(host, port, username, password):
    """
    :param host: SFTP ip
    :param port: SFTP port
    :param username: SFTP userName
    :param password: SFTP password
    :return: sftp
    """
    print("SFTP connection...")
    result = [1, ""]
    sftp = None
    
    try:
        handle = paramiko.Transport((host, port))
        handle.connect(username=username, password=password)
        sftp = paramiko.SFTPClient.from_transport(handle)
        print("connection success")
    except Exception as e:
        sftp = None
        print("connection fail, reason:{0}".format(e))

    return sftp
复制代码

upload

这里只实现了简单的使用,把指定的一个文件上传到远端文件夹,如果文件夹不存在就会首先建立对应的文件夹。

# 上传指定文件
def uploadFile(sftp, remoteDir, localPath):
    """
    :param sftp:
    :param remoteDir: 服务端文件夹路径
    :param localPath: 客户端文件路径
    :return:
    """
    print("start upload file by use SFTP...")
    result = [1, ""]

    try:
        # 是否需要建立目录
        try:
            sftp.chdir(remoteDir)
        except:
            sftp.mkdir(remoteDir)
            
        fileName = os.path.basename(localPath)
        remotePath = '{0}{1}'.format(remoteDir, fileName)
        sftp.put(localPath, remotePath)   

        result = [1, "upload " + fileName + " success"]
    except Exception as e:
        result = [-1, "upload fail, reason:{0}".format(e)]

    print(result[1])    
    return result
复制代码

download

同样是简单使用,把服务器上的一个文件下载到本地文件夹中。

# 下载文件  
def downloadFile(sftp, remotePath, localAbsDir):  
    """ 
    :param handle: 
    :param remotePath: 服务端文件路径 
    :param localAbsDir: 客户端文件夹的路径
    :return: 
    """  
    print("start download file by use SFTP...")  
    result = [1, ""]  
  
    try:   
        fileName = os.path.basename(remotePath)  
        localAbsPath = '{0}{1}'.format(localAbsDir, fileName)  

        lad = os.path.split(localAbsPath)[0]  

        if not os.path.exists(lad):  
            os.makedirs(lad)  

        sftp.get(remotePath, localAbsPath)  

        result = [1, "download " + localAbsPath + " success"]  

    except Exception as e:  
        result = [-1, "download fail, reason:{0}".format(e)]  
    
    print(result[1])
    return result  
复制代码

测试代码

if __name__ == "__main__":
    sftp = getConnect(  
        host='192.168.1.57',  
        port=22, 
        username='user', 
        password='123456'
    )  

    uploadFile(sftp, '/home/etl/upload/dl_zhihui/out_01/', './sample_upload.txt')
    downloadFile(sftp, '/home/etl/upload/dl_zhihui/cfg_01/sample_download.txt', './')
    
    sftp.close()

复制代码
SFTP connection...
connection success
start download file by use SFTP...
download ./sample_download.txt success
复制代码

转载于:https://juejin.im/post/5b013ee85188254271500829

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值