本文主要介绍如何使用python的paramiko模块连接sftp服务器,并实现sftp文件及目录的上传和下载。
01 演示环境
实现功能: 利用python自动连接sftp,并实现本地文件(文件夹)自动上传到远程sftp服务中指定路径下,且保持本地目录结构;或者从sftp服务器中下载指定目录及文件。
系统环境:centos7
python版本:python3
使用模块包:paramiko ,若未安装,可使用 pip install paramiko 进行安装
(1)sftp.put(localfile,remotefile) 函数必须是两个文件名,且sftp远端的文件路径要存在,因此需要提前创建好目录
(2)sftp.mkdir() 函数只能创建一级目录,不能循环创建多级目录,本文通过一级一级获取本地路径,然后判断远程路径是否存在,若不存在就创建好,由此来保证上传的文件能够在sftp远端找到对应的目录
(3)用到的重点函数有 sftp.mkdir 、sftp.stat,更多函数可参见帮助文档:https://docs.paramiko.org/en/stable/api/sftp.html
# -*- coding: utf-8 -*-import paramikoimport osimport stat# 判断sftp服务端中文件路径是否存在,若不存在则创建def create_dir(sftp,remoteDir): try: if stat.S_ISDIR(sftp.stat(remoteDir).st_mode): # 如果remoteDir存在且为目录,则返回True pass except Exception as e: sftp.mkdir(remoteDir) print("在远程sftp上创建目录:{}".format(remoteDir))# 上传def sftp_upload(sftp,localDir,remoteDir): if os.path.isdir(localDir): # 判断本地localDir是否为目录 for file in os.listdir(localDir): remoteDirTmp=os.path.join(remoteDir,file) localDirTmp=os.path.join(localDir,file) if os.path.isdir(localDirTmp): # 如果本地localDirTmp为目录,则对远程sftp服务器进行判断 create_dir(sftp,remoteDirTmp) # 判断sftp服务端文件目录是否存在,若不存在则创建 sftp_upload(sftp,localDirTmp,remoteDirTmp) else: print("upload file:",localDir) try: sftp.put(localDir,remoteDir) except Exception as e: print('upload error:',e)if __name__ == '__main__': host = '192.168.149.153'#sftp主机 port = 22 #端口 username = 'sftpuser' #sftp用户名 password = 'passwd' # 密码 localDir = '/test/sftp'#本地文件或目录 remoteDir = '/sftp'#远程文件或目录(注意远程路径要存在) sf = paramiko.Transport((host,port)) sf.connect(username = username,password = password) sftp = paramiko.SFTPClient.from_transport(sf) sftp_upload(sftp,localDir,remoteDir) sf.close()
sftp服务中的文件如下:
将sftp根目录中的所有文件下载到本地 /data/test 目录中
#!/usr/bin/python# coding=utf-8import paramikoimport osimport statdef sftp_download(sftp,localDir,remoteDir): if stat.S_ISDIR(sftp.stat(remoteDir).st_mode): # 如果sftp服务端的remoterDir是目录,则返回True for file in sftp.listdir(remoteDir): remoteDirTmp=os.path.join(remoteDir,file) localDirTmp=os.path.join(localDir,file) sftp_download(sftp,localDirTmp,remoteDirTmp) else: localPath=localDir.rpartition("/")[0] if not os.path.exists(localPath): # 如果本地目录不存在,则创建 os.makedirs(localPath) # 可创建多级目录 print("download file:",remoteDir) try: sftp.get(remoteDir,localDir) except Exception as e: print('download exception:',e)if __name__ == '__main__': host = '192.168.149.128'#sftp主机 port = 22 #端口 username = 'sftp' #sftp用户名 password = '123456' localDir = '/data/test'#本地文件或目录 remoteDir = '/'#远程文件或目录 sf = paramiko.Transport((host,port)) sf.connect(username = username,password = password) sftp = paramiko.SFTPClient.from_transport(sf) sftp_download(sftp,localDir,remoteDir) sf.close()
如果本文对你有帮助,欢迎 “点赞”、“分享”、“推荐”,也欢迎在评论区互动,感谢!
点关注,一起成长!深耕技术是提升收入的底气,打理资产是守住收入的底气。我的小号【小韭菜的慢富笔记】,专注打工人稳健攒股收息、价值投资实战,不追热点、不玩投机,只分享普通人可复制的慢富思路。感兴趣的朋友,欢迎关注交流,一起慢慢变富~