根据工作需求,需要向多个服务器传输多个相同的文件或文件夹,paramiko自带的 put 功能只能传输单个文件,此文中记录一下批量传输文件或文件夹的脚本,以及会根据文件大小判定文件是否传输成功。

需要用到的模块:

import xlrd
import paramiko
import os
import time
import re

1. 使用 paramiko 和 transport 创建 ssh 和 sftp 连接

transport = paramiko.Transport((ip, 22))
transport.connect(username=username, password=password)ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   # 自动添加策略,保存服务器的主机名和秘钥信息,不添加,不在本地hnow_hosts文件中的记录将无法连接
ssh._transport = transportsftp = paramiko.SFTPClient.from_transport(transport)

2. 文件拷贝

整个脚本的关键之处,定义传输函数,传参有ssh、sftp、本地地址、上传地址,分别判断本地地址与远程传输地址。判断本地地址是否是目录,如果是目录则一直递归,如果是文件,则删除老文件,上传新的文件。

def _copy(ssh, 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)# 遍历localfor file in os.listdir(local):# 取得file的全路径localfile = os.path.join(local, file).replace('\\', '/')# 深度递归_copy()_copy(ssh=ssh, sftp=sftp, local=localfile, remote=remote)# 如果local为文件if os.path.isfile(local):try:ssh.exec_command("rm -rf %s"%(remote))time.sleep(1)sftp.put(local, remote)except Exception as error:print(error)print('[put]', local, '==>', remote, 'FAILED')else:print('[put]', local, '==>', remote, 'SUCCESSED')

3. 判断地址是否存在

处理地址格式,并判断该目录是否存在。

def _is_exists(path, function):path = path.replace('\\', '/')try:function(path)except Exception as error:return Falseelse:return True

整个脚本代码:

import xlrd
import paramiko
import os
import time
import reCSheet = xlrd.open_workbook(r'C:\Users\Administrator\Desktop\11.xlsx')
data = CSheet.sheets()[0]
nrow = data.nrowsFailedList = []# 检查路径是否存在
def _is_exists(path, function):path = path.replace('\\', '/')try:function(path)except Exception as error:return Falseelse:return True# 拷贝文件
def _copy(ssh, 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)# 遍历localfor file in os.listdir(local):# 取得file的全路径localfile = os.path.join(local, file).replace('\\', '/')# 深度递归_copy()_copy(ssh=ssh, sftp=sftp, local=localfile, remote=remote)# 如果local为文件if os.path.isfile(local):try:ssh.exec_command("rm -rf %s"%(remote))time.sleep(1)sftp.put(local, remote)except Exception as error:print(error)print('[put]', local, '==>', remote, 'FAILED')else:print('[put]', local, '==>', remote, 'SUCCESSED')for i in range(1, nrow):ip = data.row_values(i)[0]try:transport = paramiko.Transport((ip, 22))transport.connect(username=username, password=password)ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   # 自动添加策略,保存服务器的主机名和秘钥信息,不添加,不在本地hnow_hosts文件中的记录将无法连接ssh._transport = transportprint("%s 连接成功" % (ip))sftp = paramiko.SFTPClient.from_transport(transport)_copy(ssh=ssh, sftp=sftp, local='C:\\Users\\Administrator\\Desktop\\test', remote='/etc/test')except Exception as reason:print(reason)FailedList.append(ip)print("连接失败列表:")
for j in FailedList:print(j)

结束。

使用paramiko批量向服务器发送文件或文件夹相关推荐

  1. Qt实现tcp发送和接收文件

    serverwidget.h #ifndef SERVERWIDGET_H #define SERVERWIDGET_H #ifdef WIN32 #pragma execution_characte ...

  2. s80智慧物联网系统怎么连接服务器,一种GPRS文件远程传输方法、物联网终端及系统...

    1.一种GPRS文件远程传输方法,其特征在于,包括: 物联网终端控制其GSM无线模块建立与GPRS移动网关的PPP连接,以使得物联网终端在建立起与网络侧的网管控制服务器之间的无线通信链路之时,GSM无 ...

  3. python 文件更新_使用Python批量更新服务器文件【新手必学】

    买了个Linux服务器,Centos系统,装了个宝塔搭建了10个网站,比如有时候要在某个文件上加点代码,就要依次去10个文件改动,虽然宝塔是可视化页面操作,不需要用命令,但是也麻烦,虽然还有git的h ...

  4. SFTP连接GCP,向服务器发送文件方法,第三方工具生成密钥对连接GCP服务器(putty生成密钥远程连接服务器)...

    190223更新通过WinSCP工具导入key,向服务器发送文件方法: 很多时候需要向服务器发送文件,GCP和一般服务器不太一样,使用ftp和用户名密码不容易获取,一般采用秘钥的方式,下边介绍实现方法 ...

  5. 易语言通过服务器发送文件,易语言服务器与客户端发送文件

    易语言服务器与客户端发送文件 内容精选 换一换 PL/pgSQL是一种可载入的过程语言.用PL/pgSQL创建的函数可以被用在任何可以使用内建函数的地方.例如,可以创建复杂条件的计算函数并且后面用它们 ...

  6. Java服务端向客户端写文件_java实现客户端向服务器发送文件

    本文实例为大家分享了java实现客户端向服务器发送文件的具体代码,供大家参考,具体内容如下 服务器源代码: import java.io.BufferedReader; import java.io. ...

  7. PHP向服务器错误记录、文件或远程目标发送一个错误

    2019独角兽企业重金招聘Python工程师标准>>> 一.用到的函数说明 1语法: error_log(error, type, destination, headers) 2 参 ...

  8. 服务器装qq传文件好吗,QQ发送的离线文件,能够在QQ服务器上永远保存下去,直到对方接收。()...

    相关题目与解析 使用QQ发送离线文件,则该文件被暂存在A.对方桌面上B.QQ邮箱中C.本地桌面上D.QQ服务器上 POPserver称为()A.文件传输服务器B.电子邮件接收服务器C.电子邮件发送服务 ...

  9. 易语言 上传文件到远程服务器,易语言与向远程服务器发送文件夹

    易语言与向远程服务器发送文件夹 内容精选 换一换 一.IDEA连接SSH 确认你的密码输对了,还好我保存了我的远程服务器的密码,原先我一直以为我输对了,导致一直报错Auth fail 点击ok,连接上 ...

最新文章

  1. 大话设计模式之简单的工厂模式
  2. 阿里linux安装mysql_阿里云Linux Ubuntu系统安装mysql完整过程
  3. [转]Http请求中Content-Type讲解以及在Spring MVC中的应用
  4. SQL Server基础之索引
  5. CentOS 7下编译FreeSWITCH 1.6
  6. HDF5: 读写速度与文件的大小
  7. 最终结束漂泊的身份-我办理北京人才引进的经历
  8. 6个哄自己开心的小技巧
  9. C++ 求圆的周长和面积
  10. [蓝桥杯]三升序列(Python实现)
  11. Golang性能优化
  12. ResultMap中association和collection的区别
  13. 如何安装ruby、rails
  14. 矢量量化识别孤立字的matlab编码_新zwpython 完胜 老matlab 篇二
  15. ES6+(前端面试题整合)
  16. 数据库MySQL最大连接数、最大活跃连接数、最大并发数、并发会话数区别
  17. win7计算机怎么优化驱动器,win7旗舰版系统如何进行系统内存优化
  18. HBuilder-简易仿制网页
  19. 智能手环功能模块设计_智能手环、功能模块以及智能手表的制作方法
  20. 袁国宝:恒大“押宝”,房市车市真要“里外通吃”?

热门文章

  1. Ubuntu20.04系统使用笔记
  2. 理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案
  3. php+ajax 仿百度搜索效果
  4. 第二届(2023年)中国国际培育钻石产业发展与创新大会盛大召开!
  5. 《R和Ruby数据分析之旅》—第1章 1.1节Ruby
  6. 华为鸿蒙息屏显示,华为息屏显示国徽图片设置方法步骤分享
  7. 70个大中城市 2015年5月相对于2010年房价
  8. 2行Python就能实现 文本文件 差异比较,太强了!
  9. 苹果x漫画脸_《名侦探柯南》漫画时间线索整理简化重置版(6)(总FILE.311~FILE.360)...
  10. 解决在mac上压缩文件后,在window上解压后多个__MACOSX文件夹