转载请注明出处,欢迎提出宝贵意见,谢谢!

功能介绍:

1、主机分组
  登录后显示分组主机及主机数量
  选择主机组后显示该主机组下所有主机信息,主机名及IP
显示输入选择:
1、执行命令
利用线程并发组内所有主机同时执行命令,并将结果,返回
格式为:
----------------------host1------------------

----------------------host2------------------

----------------------host3------------------

----------------------host4------------------

2、传输文件

主函数:

  1. #Author by Guangboli
  2. #_*_ coding:utf-8 _*_
  3.  
  4. import configparser,threading,paramiko,time,os,sys
  5. base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  6. sys.path.append(base_dir)
  7. from core import Color_set
  8. color = Color_set.Colorset()
  9. cf = configparser.ConfigParser()
  10. cf.read('config',encoding='utf-8')
  11. secs = cf.sections()
  12. def get_group_info():
  13. '''获取主机组信息'''
  14. print("主机组列表:")
  15. for i in secs:
  16. opts = cf.options(i)
  17. quantity = int(len(opts) / 4)
  18. print(i,'[%s]'%quantity)
  19. def get_host_ip_list(group_name,quantity):
  20. '''获取主机ip列表信息'''
  21. i = 1
  22. while i <= quantity:
  23. print(cf.get(group_name,'ip%s'%i))
  24. i+=1
  25. def cmd_run(ip,username,password,cmd):
  26.  
  27. ssh = paramiko.SSHClient()
  28. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  29. try:
  30. ssh.connect(hostname=ip, port=22, username=username, password=password)
  31. stdin, stdout, stderr = ssh.exec_command(cmd) # 执行命令,不可执行类似vim,top watch命令
  32. result = stdout.read().decode() # 获取结果
  33. tips = color.red('- - - - - %s - - - - - - '.center(20) % ip)
  34. print(tips)
  35. print(result,stderr.read().decode())
  36. except Exception as e:
  37. print('%s 主机发生异常:'%ip,e)
  38. ssh.close()
  39. def transport_put_file(ip,username,password,cmd):
  40. try:
  41. transport = paramiko.Transport((ip, 22))
  42. transport.connect(username=username, password=password)
  43. sftp = paramiko.SFTPClient.from_transport(transport)
  44. sftp.put(local_file,remote_dir+'/'+put_filename)
  45. except Exception as e:
  46. print(print('%s 主机发生异常:'%ip,e))
  47. transport.close()
  48. def transport_get_file(ip,username,password,cmd):
  49. transport = paramiko.Transport((ip, 22))
  50. try:
  51. transport.connect(username=username, password=password)
  52. sftp = paramiko.SFTPClient.from_transport(transport)
  53. sftp.get(remote_file,local_dir+'\\'+ip+'-'+get_filename) #Linux 需要将\\改为/
  54. except Exception as e:
  55. print(print('%s 主机发生异常:'%ip,e))
  56. transport.close()
  57. def make_treading(func,quantity,group_name,cmd):
  58. i = 1
  59. while i <= quantity:
  60. ip = cf.get(group_name, 'ip%s' % i)
  61. username = cf.get(group_name, 'username%s' % i)
  62. password = cf.get(group_name, 'password%s' % i)
  63. thread = threading.Thread(target=func,args=(ip,username,password,cmd))
  64. thread.setDaemon(True)
  65. thread.start()
  66. i+=1
  67. def welcome():
  68. '''show group and host ip information '''
  69. get_group_info()
  70. global opts,quantity,group_name
  71. while True:
  72. group_name = input('请输入组名(退出请按q or Q):').strip().upper()
  73. if group_name == 'Q':
  74. print('欢迎再次使用,谢谢....')
  75. exit()
  76. elif group_name not in secs:
  77. print("Wrong input,please confirm!")
  78. else:
  79. break
  80. print(group_name,'组下的主机:')
  81. opts = cf.options(group_name)
  82. quantity = int(len(opts) / 4) #hosts quantity
  83. get_host_ip_list(group_name,quantity)
  84. def menu_line2():
  85. global local_dir,local_file,remote_file,remote_dir,get_filename,put_filename
  86. print('''usage:
  87. 上传文件:put 本地文件 远程目录
  88. 下载文件:get 远程文件 本地目录
  89. 退出输入q or Q
  90. examples:
  91. put test.txt /tmp
  92. get /tmp/test.txt /data
  93. ''')
  94. while True:
  95. cmd = input("请输入操作:").strip()
  96. args = cmd.split()
  97. if cmd == 'q' or cmd == 'Q':
  98. menu_line1()
  99.  
  100. elif len(args) != 3:
  101. print("输入有误,请重新输入!")
  102. menu_line2()
  103. else:
  104. if args[0] == 'put':
  105. local_file = args[1]
  106. put_filename=args[1].split('/')[-1]
  107. remote_dir = args[2]
  108. func = transport_put_file
  109. make_treading(func, quantity, group_name, cmd)
  110. while threading.active_count() != 1:
  111. time.sleep(0.1)
  112. else:
  113. continue
  114. elif args[0] == 'get':
  115. remote_file = args[1]
  116. get_filename = args[1].split('/')[-1]
  117. local_dir = args[2]
  118. func = transport_get_file
  119. make_treading(func, quantity, group_name, cmd)
  120. while threading.active_count() != 1:
  121. time.sleep(0.1)
  122. else:
  123. continue
  124. else:
  125. print("输入格式有误,请重新输入!")
  126. menu_line2()
  127. def menu_line1():
  128. '''commadns menu'''
  129. func = cmd_run
  130. while True:
  131. print('1、执行命令\n2、传输文件\n')
  132. choice = input("请选择操作:").strip()
  133. if choice == '':
  134. cmd = input("请输入命令:").strip()
  135. print('%s 命令执行结果如下:' % cmd)
  136. make_treading(func,quantity,group_name,cmd)
  137. while threading.active_count() != 1:
  138. # print(threading.active_count())
  139. time.sleep(0.1)
  140. else:
  141. continue
  142. elif choice == '':
  143. menu_line2()
  144. elif choice == 'q' or choice == 'Q':
  145. welcome()
  146. else:
  147. continue
  148. def run():
  149. '''
  150. main function
  151. '''
  152. print('welcome.....')
  153. welcome()
  154. menu_line1()
  155.  
  156. if __name__ == '__main__':
  157. run()

config文件:

  1. [GROUP1]
  2. host1 = host1
  3. ip1 = 10.1.2.3
  4. username1 = root
  5. password1 = 123456
  6. host2 = host2
  7. ip2 = 10.1.2.2
  8. username2 = user1
  9. password2 = 123456
  10. host3 = host3
  11. ip3 = 10.1.2.7
  12. username3 = user2
  13. password3 = 123456
  14.  
  15. [GROUP2]
  16. host1 = host1
  17. ip1 = 10.1.2.1
  18. username1 = root
  19. password1 = 123456
  20. host2 = host2
  21. ip2 = 10.1.2.2
  22. username2 = root
  23. password2 = 123456
  24. host3 = host3
  25. ip3 = 10.1.2.3
  26. username3 = root
  27. password3 = 123456
  28.  
  29. [GROUP3]
  30. host1 = host1
  31. ip1 = 10.1.2.1
  32. username1 = root
  33. password1 = 123456
  34. host2 = host2
  35. ip2 = 10.1.2.2
  36. username2 = root
  37. password2 = 123456
  38. host3 = host3
  39. ip3 = 10.1.2.3
  40. username3 = root
  41. password3 = 123456
  42. host4 = host4
  43. ip4 = 10.1.2.4
  44. username4 = root
  45. password4 = 123456
  46. host5 = host5
  47. ip5 = 10.1.2.5
  48. username5 = root
  49. password5 = 123456
  50.  
  51. [GROUP4]
  52. host1 = host1
  53. ip1 = 10.1.2.1
  54. username1 = root
  55. password1 = 123456
  56. host2 = host2
  57. ip2 = 10.1.2.2
  58. username2 = root
  59. password2 = 123456
  60. host3 = host3
  61. ip3 = 10.1.2.3
  62. username3 = root
  63. password3 = 123456
  64. host4 = host4
  65. ip4 = 10.1.2.4
  66. username4 = root
  67. password4 = 123456
  68. host5 = host5
  69. ip5 = 10.1.2.5
  70. username5 = root
  71. password5 = 123456
  72. host6 = host6
  73. ip6 = 10.1.2.6
  74. username6 = root
  75. password6 = 123456
  76. host7 = host7
  77. ip7 = 10.1.2.7
  78. username7 = root
  79. password7 = 123456

目录结果:

python3 实现堡垒机功能(并发执行命令及上传下载文件)的更多相关文章

  1. 批量执行(Linux命令,上传/下载文件)

    前言: 每个公司的网络环境大都划分 办公网络.线上网络,之所以划分的主要原因是为了保证线上操作安全: 对于外部用户而言也只能访问线上网络的特定开放端口,那么是什么控制了用户访问线上网络的呢? 防火墙过 ...

  2. 【liunx命令】上传下载文件的方法

    scp   帮助命令: man scp   scp功能: 下载远程文件或者目录到本地, 如果想上传或者想下载目录,最好的办法是采用tar压缩一下,是最明智的选择.   从远程主机 下载东西到 本地电脑 ...

  3. centos/redhat命令行上传下载文件

    前言:客户端上没有安装xftp,winscp等等软件,无法将服务器上需要的文件下载到本地去解析,无法将本地的安装包上传到服务器上去,这个时候命令行就可以带你翱翔一波 配置如下: 服务器上: 1.安装需 ...

  4. 【Python】模块学习之使用paramiko连接Linux,远程执行命令,上传下载、文件

    本文主要介绍paramiko远程执行linux命令,及在服务器上进行文件的上传.下载 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. ...

  5. SSH命令行上传/下载文件

    上传:scp /path/file(这部分为本地的路径) user(远端目标用户名)@host(远端目标IP):/pathorfile(文件存储路径) 下载:scp user(远端用户名)@host( ...

  6. ARTS-S mac终端ftp命令行上传下载文件

    上传 ftp -u ftp://root:123456@10.11.12.3/a.txt a.txt 下载 ftp -o a.txt ftp://root:123456@10.11.12.13/a.t ...

  7. Linux 使用命令行上传下载文件

    基本语法: 服务器: 用户名@ip:/路径 scp 要拷贝的文件 要存放的文件 上传文件到服务器 # 把本地 source.md 文件上传到 152.116.113.13 服务器的/home目录 # ...

  8. python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)

     -*-          paramiko.util.log_to_file(         ssh = paramiko.SSHClient()          ssh.set_missing ...

  9. python批量操作Linux服务器脚本,key登录(执行命令、上传、下载)(二)

       -*-   2 #批量操作linux服务器(执行命令,上传,下载)   3 #!/usr/bin/python   4 import paramiko   5 import datetime   ...

随机推荐

  1. Restful风格接口浅析

    为什么使用RESTful1.JSP技术可以让我们在页面中嵌入Java代码,但是这样的技术实际上限制了我们的开发效率,因为需要我们Java工程师将html转换为jsp页面,并写一些脚本代码,或者前端代码 ...

  2. HTTP: 状态码200~505说明

    HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释: 1xx(临时响应) 表示 ...

  3. cocos2D-X 打包

    { //首先有java jdk,android sdk,android ndk //用android studio  import //匹配gradle 的版本 有些gradle可能下载不下来,不用慌 ...

  4. mobx学习笔记01——什么是mobx?

    mobx是什么? js框架 官方定义:Simple,scalable state management(简单.可扩展的状态管理) mobx与redux相比: 语义丰富.响应式编程,开发难度低.学习成本 ...

  5. 英语单词Uninterrupted

    Uninterrupted 来源——不间断电源供应 UPS(Uninterrupted Power Supply) 翻译 adj. 不间断的:连续的 GRE   词根 un- +‎ interrupt ...

  6. 【BZOJ2639】矩形计算(二维普通莫队)

    题意:输入一个n*m的矩阵,矩阵的每一个元素都是一个整数,然后有q个询问,每次询问一个子矩阵的权值. 矩阵的权值是这样定义的,对于一个整数x,如果它在该矩阵中出现了p次,那么它给该矩阵的权值就贡献p^ ...

  7. SSM + MySQL批量删除操作

    最近项目中有个购物车功能需要能够选中商品,然后批量删除的操作,也可以单个删除,其实代码很简单就能实现. 这里需要注意的就是你前端是怎么传值的,我这里采用的数组的形式,用 ‘,’隔开. 然后控制层代码如 ...

  8. react教程 — redux

    一.概念:             http://caibaojian.com/react/redux-basic.html   或  https://www.cnblogs.com/maopixin ...

  9. (转)JVM运行时数据区

    转:http://www.cnblogs.com/myna/p/7567208.html java虚拟机运行时数据区,具体分为如下几个区域 程序计数器(Program Counter Register ...

  10. css如何让<a>标签,根据输入的内容长度调整宽度,宽度自适应,那位大仙帮帮忙

    css如何让<a>标签,根据输入的内容长度调整宽度,宽度自适应,那位大仙帮帮忙 5 样式 .ceshi{float:left; margin-left:13px; width:180px; ...