网络编程与并发—批量主机管理开发

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), '\n\t\t主机组名:' + str(key), '\n\t\t主机数量:' + 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("对不起!您输入的主机组编号有误!\n")
 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()

 

posted @ 2017-12-06 17:43  南城思念,北城等待  阅读(120)  评论(0编辑  收藏  举报