zoukankan      html  css  js  c++  java
  • 网络编程与并发—批量主机管理开发

    1 批量主机管理 工具开发
          实现批量命令执行、文件分发

    core.py

      1 import sys
      2 
      3 sys.path.append('../conf')
      4 import settings
      5 import paramiko
      6 from multiprocessing import Process
      7 
      8 
      9 class operation_client(object):
     10     # 远程操作主机
     11     def __init__(self, host, port, username, password, cmd):
     12         self.host = host
     13         self.port = port
     14         self.username = username
     15         self.password = password
     16         self.cmd = cmd
     17 
     18     def run(self):
     19         '''
     20         起线程连接远程主机后调用
     21         :return:
     22         '''
     23         cmd_str = self.cmd.split()[0]
     24         if hasattr(self, cmd_str):  # 反射 eg:调用upload方法
     25             getattr(self, cmd_str)()
     26         else:
     27             # setattr(x,'y',v)is  equivalent  to   ``x.y=v''
     28             setattr(self, cmd_str, self.command)
     29             getattr(self, cmd_str)()  # 调用command方法,执行批量命令处理
     30 
     31     def command(self):
     32         """批量命令处理"""
     33         ssh = paramiko.SSHClient()  # 创建ssh对象
     34         # 允许连接不在know_hosts文件中的主机
     35         ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     36         ssh.connect(hostname=self.host, port=self.port, username=self.username, password=self.password)
     37         stdin, stdout, stderr = ssh.exec_command(self.cmd)
     38         result = stdout.read()
     39         print("%s".center(30, "-") % self.host)
     40         print(result.decode())
     41         ssh.close()
     42 
     43     def upload(self):
     44         """上传文件"""
     45         filename = self.cmd.split()[1]  # 要上传的文件
     46         transport = paramiko.Transport((self.host, self.port))
     47         transport.connect(username=self.username, password=self.password)
     48         sftp = paramiko.SFTPClient.from_transport(transport)
     49         sftp.put(filename, filename.split('\')[-1])
     50         print('上传文件:' + str(filename) + ' 成功!')
     51         transport.close()
     52 
     53 
     54 def show_host_list():
     55     """通过选择分组显示主机名与IP"""
     56     num_list = []
     57     for index, key in enumerate(settings.msg_dic):
     58         num_list.append(key)
     59         print('主机组编号:' + str(index + 1), '
    		主机组名:' + str(key), '
    		主机数量:' + str(len(settings.msg_dic[key])))
     60     while True:
     61         choose_host_list = input("请输入批量操作的主机组编号(或者输入q退出):>>>").strip()
     62         if choose_host_list.lower() == 'q':
     63             break
     64         host_dic = settings.msg_dic.get(num_list[int(choose_host_list) - 1])
     65         if host_dic:
     66             for key in host_dic:
     67                 print(key, host_dic[key]["IP"])
     68             return host_dic
     69         else:
     70             print("对不起!您输入的主机组编号有误!
    ")
     71             continue
     72 
     73 
     74 def interactive(host_dic):
     75     '''
     76     根据选择的分组主机多线程批量操作
     77     :param host_dic:
     78     :return:
     79     '''
     80     str_info = '''
     81 批量主机管理工具功能说明:
     82 1、批量文件上传:upload file_path
     83 例如:upload C:\Users\YG\Desktop\file.txt 
     84 
     85 2、批量操作主机:df -h 、ls 、pwd ......
     86 '''
     87     print(str_info)
     88     thread_list = []
     89     while True:
     90         command = input("请输入操作命令(或者输入q退出):>>>").strip()
     91         if command.lower() == 'q':
     92             print('感谢使用批量主机管理工具!再见!')
     93             break
     94         elif command:
     95             for key in host_dic:
     96                 host, port, username, password = host_dic[key]["IP"], host_dic[key]["port"], host_dic[key]["username"], 
     97                                                  host_dic[key]["password"]
     98                 func = operation_client(host, port, username, password, command)  # 实例化类
     99                 t = Process(target=func.run)  # 起线程
    100                 t.start()
    101                 thread_list.append(t)
    102             for t in thread_list:
    103                 t.join()  # 主线程等待子线程执行完毕
    104         else:
    105             continue
    106 
    107 
    108 def run():
    109     host_dic = show_host_list()
    110     interactive(host_dic)

    settings.py

     1 msg_dic = {
     2            "group1":
     3                {
     4                    "client_1": {"IP": "192.168.111.2", "username": "root", "password": "root", "port": 8080},
     5                },
     6            "group2":
     7                {
     8                    "client_1": {"IP": "192.168.121.6", "username": "root", "password": "root", "port": 8080},
     9                    "client_2": {"IP": "192.168.134.8", "username": "root", "password": "root", "port": 8080},
    10                },
    11           }

    main.py

    1 import sys
    2 sys.path.append('../src')
    3 import core
    4 
    5 if __name__ == "__main__":
    6     core.run()
  • 相关阅读:
    codesmith+mysql生成代码
    遭遇笔试
    线性是一种简洁,简洁就是美
    Microsoft Kinect SDK vs PrimeSense OpenNI
    资料收集:让OpenCV使用IPP
    提纲
    在PC上安装使用Kinect
    OpenNI设置Kinect帧率,读取IR图
    cout,rather than printf
    单步调试时,getnextframe会失败。又
  • 原文地址:https://www.cnblogs.com/sun1994/p/7993976.html
Copyright © 2011-2022 走看看