最近在作一个自动化测试工具,须要从SFTP拉下文件,用到python中paramiko模块,进行远程服务器的链接(至于paramiko、吧啦吧啦,网上一大堆,不懂去找度娘啦)python
(1) 安装paramikowindows
本宝宝本地安装的是python3.6,打开cmd服务器
将当前工做路径切换到:C:\Local\Programs\Python\Python36-32\Lib\site-packages(就是python安装路径-->Lib目录-->site-packages目录)app
执行命令:pip install paramiko 函数
刚开始以下错误:工具
错误提示:ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org',port=443):Read timed out测试
解决方法:在命令中添加 --default-timeout=100 延长超时时间便可。如,pip --default-timeout=100 install paramiko
spa
安装完成以后,在dos中输入python以后,import paramiko不报错就说明安装成功blog
(2)使用paramiko递归
sf = paramiko.Transport(host, port) || host是sftp服务器主机名,port是端口号
sf.connect(username=username, password=password) || username是用户名,password是密码
sftp = paramiko.SFTPClient.from_transport(sf) || 创建链接
(3)实现下载功能
从sftp拉文件时,遇到的状况以下
#1.远程文件路径就是某一文件的全路径,例如:/datafile/text.txt
sftp.get(file, local_filename)
file是要下载的文件路径,而 local_filename是要下载到哪一个路径下
#2.远程文件路径是一个文件夹,例如:/datafile/
针对于这一种状况,首先要遍历获得全部的文件,这里其实刚开始我也是整晕了,不能下载文件夹,只能下载对应的文件
这里用了递归的方法遍历获得全部的文件
def sftp_download(app, sftp, remote_dir):
all_files = list()
if remote_dir[-1] == '/':
remote_dir = remote_dir[0:-1]
files = sftp.listdir_attr(remote_dir)
for file in files:
filename = remote_dir + '/' + file.filename
if stat.S_ISDIR(file.st_mode):
all_files.extend(sftp_download(app, sftp, filename))
else:
all_files.append(filename)
return all_files
stat.S_ISDIR(file.st_mode)这个函数是用来判断远程服务器上是不是文件夹(和windows仍是有区别滴) 下载到本地的时候也要建立对应的文件名字呦,就是上边提到的sftp.get()这个方法传递的是两个参数。