1. # 类 Fabric 主机管理程序开发:
  2. # 1. 运行程序列出主机组或者主机列表
  3. # 2. 选择指定主机或主机组
  4. # 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)
  5. # 4. 充分使用多线程或多进程
  6. # 5. 不同主机的用户名密码、端口可以不同
  7. import paramiko,threading,pickle,os
  8.  
  9. Base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  10. config_path = Base_path +'/core/config'
  11. #主机配置信息管理
  12. list_host = [{'host':'192.168.117.236','port':22,'user':'ubuntu1','password':'ubuntu1','group':1},
  13. {'host':'192.168.117.237','port':22,'user':'ubuntu2','password':'ubuntu2','group':1},
  14. {'host':'192.168.117.239','port':22,'user':'ubuntu3','password':'ubuntu3','group':2},
  15. {'host':'192.168.117.240','port':22,'user':'aaa','password':'bbb','group':2}]
  16. def pickle_dump(path,file):
  17. #存入配置文件
  18. with open(path,'wb') as f:
  19. pickle.dump(file,f)
  20. #pickle_dump(config_path,list_host)
  21. def pickle_load(path):
  22. #取出配置文件
  23. with open(path,'rb') as f:
  24. list_host_new = pickle.load(f)
  25. return list_host_new
  26. # list_host_new = pickle_load(config_path)
  27. # print(list_host_new)
  28.  
  29. class Paramiko_sshd(object):
  30. #sshd类
  31. def __init__(self,host,port,user,password):
  32. self.host = host
  33. self.port = port
  34. self.user = user
  35. self.password = password
  36.  
  37. def sshd_command(self,command):
  38. #ssh远程主机执行命令,并返回结果
  39. try:
  40. ssh_client = paramiko.SSHClient()
  41. ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  42. ssh_client.connect(self.host,self.port,self.user,self.password)
  43. std_in,std_out,std_err = ssh_client.exec_command(command)
  44. print(self.host.center(30,'*'))
  45. print(command.upper().center(30,'='))
  46. for line in std_out:
  47. print(line.strip('\n'))
  48. ssh_client.close()
  49. except Exception as e:
  50. print(e)
  51. def sshd_upload_file(self,server_path,local_path):
  52. #上传文件
  53. try:
  54. t = paramiko.Transport((self.host,self.port))
  55. t.connect(username=self.user,password=self.password)
  56. sftp = paramiko.SFTPClient.from_transport(t)
  57. sftp.put(local_path,server_path)
  58. t.close()
  59. print(self.host.center(30, '*'))
  60. print('上传成功')
  61. except Exception as e:
  62. print(e)
  63. def sshd_down_file(self,server_path,local_path):
  64. #下载文件
  65. try:
  66. t = paramiko.Transport((self.host, self.port))
  67. t.connect(username=self.user, password=self.password)
  68. sftp = paramiko.SFTPClient.from_transport(t)
  69. sftp.get(server_path, local_path)
  70. t.close()
  71. print(self.host.center(30, '*'))
  72. print('下载成功')
  73. except Exception as e:
  74. print(e)
  75. def help():
  76. #帮助信息
  77. command_option = input('''
  78. *************请选择***********
  79. 1.执行命令
  80. 2.上传文件
  81. 3.下载文件
  82. 4.返回
  83. 5.退出程序
  84. ''').strip()
  85. return command_option
  86.  
  87. def review():
  88. while 1:
  89. #展示界面
  90. list_host_new = pickle_load(config_path)
  91. host_group_1 = []
  92. host_group_2 = []
  93. for line in list_host_new:
  94. if line['group'] == 1:
  95. host_group_1.append(line)
  96. else:
  97. host_group_2.append(line)
  98. print('group-1'.center(30,'='))
  99. for line_1 in host_group_1:
  100. print('host:',line_1['host'],'port:',line_1['port'])
  101. print('group-2'.center(30,'='))
  102. for line_2 in host_group_2:
  103. print('host:',line_2['host'],'port:',line_2['port'])
  104.  
  105. group_select = input('请输入您要操作的主机组:\033[1;35m group-1 \033[0m | \033[1;35m group-2 \033[0m '
  106. '或输入\033[1;35mexit\033[0m退出程序 ==>').strip()
  107. if group_select in ['group-1','group-2']:
  108. if group_select == 'group-1': #增加中间变量,来确定是对组一操作还是对组二进行操作
  109. group_sure = host_group_1
  110. else:
  111. group_sure = host_group_2
  112. while 1:
  113. command_option = help()
  114. if command_option == '':
  115. command = input('请输入执行的命令:').strip()
  116. for line_3 in group_sure:
  117. sshd = Paramiko_sshd(line_3['host'],line_3['port'],line_3['user'],line_3['password'])
  118. t = threading.Thread(target=sshd.sshd_command,args=(command,))
  119. t.start()
  120. t.join()
  121.  
  122. elif command_option == '':
  123. server_path = input('请输入上传到的服务器目录:').strip()
  124. local_path = input('请输入本地文件目录:').strip()
  125. for line_3 in group_sure:
  126. sshd = Paramiko_sshd(line_3['host'],line_3['port'],line_3['user'],line_3['password'])
  127. t = threading.Thread(target=sshd.sshd_upload_file,args=(server_path,local_path,))
  128. t.start()
  129. t.join()
  130.  
  131. elif command_option == '':
  132. server_path = input('请输入下载的服务器目录文件路径:').strip()
  133. local_path = input('请输入存放到本地的路径:').strip()
  134. for line_3 in group_sure:
  135. sshd = Paramiko_sshd(line_3['host'],line_3['port'],line_3['user'],line_3['password'])
  136. t = threading.Thread(target=sshd.sshd_down_file,args=(server_path,local_path,))
  137. t.start()
  138. t.join()
  139. elif command_option == '':
  140. break
  141. elif command_option == '':
  142. exit()
  143. else:
  144. print('%s为非法命令,请重新输入!'%command_option)
  145. elif group_select == 'exit':
  146. break
  147. else:
  148. print('%s为非法命令,请重新输入!'%group_select)
  149.  
  150. if __name__ =='__main__':
  151. review()

python 学习分享-实战篇类 Fabric 主机管理程序开发的更多相关文章

  1. python作业类Fabric主机管理程序开发(第九周)

    作业需求: 1. 运行程序列出主机组或者主机列表 2. 选择指定主机或主机组 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) 4. 充分使用多线程或多进程 5. 不同主机的用户名密码 ...

  2. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  3. 类 Fabric 主机管理程序开发

    类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主 ...

  4. python 学习分享-实战篇选课系统

    # 角色:学校.学员.课程.讲师 # 要求: # 1. 创建北京.上海 2 所学校 # 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 # ...

  5. python 学习分享-实战篇高级的ftp

    #server代码 import socketserver,os,hashlib Base_paht = os.path.dirname(os.path.dirname(os.path.abspath ...

  6. python 学习分享-实战篇简单的ftp

    import socket import os import time import pickle Basedb = os.path.dirname(os.path.dirname(os.path.a ...

  7. python 学习分享-实战篇增删改查作业

    一大波函数来袭 作业要求: 1本次作业通过空格及逗号,将文件拆分成列表,在通过判断add.del.update.select等关键字,来判断用户执行的是哪种命令,根据不同的命令调用不同的函数去处理. ...

  8. python第五十二天---第九周作业 类 Fabric 主机管理程序

    类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)4. 充分使用多线程或多进程5. 不同 ...

  9. python 学习分享-函数篇

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...

随机推荐

  1. removing vmware debugger from visual studio

    removing vmware debugger from visual studio by Ross on 十月 14, 2010 at 5:30 下午 under Visual Studio |  ...

  2. EF core 学习笔记

    应该 以领域 为核心开发程序, 不应该 以数据库 entityframeworkcore entityframeworkcore.sqlserver entityframeworkcore.tool ...

  3. c# 语法 字符串内插

    结果截屏 参考文章 https://www.cnblogs.com/csproj/p/Interpolated_Strings.html c# 6.0语法 https://www.cnblogs.co ...

  4. 使用筛法在 O(logN) 的时间内查询多组数的素数因子

    Prime Factorization using Sieve O(log n) for multiple queries 使用筛法在 O(logN) 的时间内查询多组数的素数因子 前言 通常, 我们 ...

  5. 【Java-Regex】该用正则表达式却偷懒使用 indexOf 引起的BUG

    留着等下写. 背景 Excel列内容,无法获取全部格式,但我们有最终的准确格式. 用准确格式去严格匹配,而不是盲人摸象. 不符合就置为空,符合就.

  6. URL中传递JSON数据

    有关于JSON如何在前后之间进行传递,转换成对象等操作,请查看  C#Json数据交互   (这篇文章主要介绍了如何转化Json格式的数据,以及如何使用) 我们在URL中传递数据一般都是 XX.asp ...

  7. ADO.net中常用的对象有哪些?

    ADO.net中常用的对象有哪些?分别描述一下. 答:Connection 数据库连接对像 Command 数据库命令 DataReader 数据读取器 DataSet 数据集 DataReader与 ...

  8. BeanNameAware接口和BeanFactoryAware接口(转)

              迄今为止,所接触到的Bean都是“无知觉”的,就像黑客帝国中机械工厂里面“养殖”的人类,他们虽然能完成一定的功能,但是根本不知道自己在工厂(BeanFactory)中的代号(id) ...

  9. django中csrftoken跨站请求伪造的几种方式

    1.介绍 我们之前从前端给后端发送数据的时候,一直都是把setting中中间件里的的csrftoken这条给注释掉,其实这个主要起了一个对保护作用,以免恶意性数据的攻击.但是这样直接注释掉并不是理智型 ...

  10. mysql完全卸载大全

    如何在Linux下卸载MySQL数据库呢? 下面总结.整理了一下Linux平台下卸载MySQL的方法. MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries).R ...