当前位置:   article > 正文

使用paramiko批量向服务器发送文件或文件夹_windows paramiko 发送

windows paramiko 发送

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

需要用到的模块:

  1. import xlrd
  2. import paramiko
  3. import os
  4. import time
  5. import re

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

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

2. 文件拷贝

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

  1. def _copy(ssh, sftp, local, remote):
  2. # 判断remote是否是目录
  3. if _is_exists(remote, function=sftp.chdir):
  4. # 是,获取local路径中的最后一个文件名拼接到remote中
  5. filename = os.path.basename(os.path.normpath(local))
  6. remote = os.path.join(remote, filename).replace('\\', '/')
  7. # 如果local为目录
  8. if os.path.isdir(local):
  9. # 在远程创建相应的目录
  10. _is_exists(remote, function=sftp.mkdir)
  11. # 遍历local
  12. for file in os.listdir(local):
  13. # 取得file的全路径
  14. localfile = os.path.join(local, file).replace('\\', '/')
  15. # 深度递归_copy()
  16. _copy(ssh=ssh, sftp=sftp, local=localfile, remote=remote)
  17. # 如果local为文件
  18. if os.path.isfile(local):
  19. try:
  20. ssh.exec_command("rm -rf %s"%(remote))
  21. time.sleep(1)
  22. sftp.put(local, remote)
  23. except Exception as error:
  24. print(error)
  25. print('[put]', local, '==>', remote, 'FAILED')
  26. else:
  27. print('[put]', local, '==>', remote, 'SUCCESSED')

3. 判断地址是否存在

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

  1. def _is_exists(path, function):
  2. path = path.replace('\\', '/')
  3. try:
  4. function(path)
  5. except Exception as error:
  6. return False
  7. else:
  8. return True

整个脚本代码:

  1. import xlrd
  2. import paramiko
  3. import os
  4. import time
  5. import re
  6. CSheet = xlrd.open_workbook(r'C:\Users\Administrator\Desktop\11.xlsx')
  7. data = CSheet.sheets()[0]
  8. nrow = data.nrows
  9. FailedList = []
  10. # 检查路径是否存在
  11. def _is_exists(path, function):
  12. path = path.replace('\\', '/')
  13. try:
  14. function(path)
  15. except Exception as error:
  16. return False
  17. else:
  18. return True
  19. # 拷贝文件
  20. def _copy(ssh, sftp, local, remote):
  21. # 判断remote是否是目录
  22. if _is_exists(remote, function=sftp.chdir):
  23. # 是,获取local路径中的最后一个文件名拼接到remote中
  24. filename = os.path.basename(os.path.normpath(local))
  25. remote = os.path.join(remote, filename).replace('\\', '/')
  26. # 如果local为目录
  27. if os.path.isdir(local):
  28. # 在远程创建相应的目录
  29. _is_exists(remote, function=sftp.mkdir)
  30. # 遍历local
  31. for file in os.listdir(local):
  32. # 取得file的全路径
  33. localfile = os.path.join(local, file).replace('\\', '/')
  34. # 深度递归_copy()
  35. _copy(ssh=ssh, sftp=sftp, local=localfile, remote=remote)
  36. # 如果local为文件
  37. if os.path.isfile(local):
  38. try:
  39. ssh.exec_command("rm -rf %s"%(remote))
  40. time.sleep(1)
  41. sftp.put(local, remote)
  42. except Exception as error:
  43. print(error)
  44. print('[put]', local, '==>', remote, 'FAILED')
  45. else:
  46. print('[put]', local, '==>', remote, 'SUCCESSED')
  47. for i in range(1, nrow):
  48. ip = data.row_values(i)[0]
  49. try:
  50. transport = paramiko.Transport((ip, 22))
  51. transport.connect(username=username, password=password)
  52. ssh = paramiko.SSHClient()
  53. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自动添加策略,保存服务器的主机名和秘钥信息,不添加,不在本地hnow_hosts文件中的记录将无法连接
  54. ssh._transport = transport
  55. print("%s 连接成功" % (ip))
  56. sftp = paramiko.SFTPClient.from_transport(transport)
  57. _copy(ssh=ssh, sftp=sftp, local='C:\\Users\\Administrator\\Desktop\\test', remote='/etc/test')
  58. except Exception as reason:
  59. print(reason)
  60. FailedList.append(ip)
  61. print("连接失败列表:")
  62. for j in FailedList:
  63. print(j)

结束。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/603333
推荐阅读
相关标签
  

闽ICP备14008679号