J'ai réalisé un petit projet très simple aujourd'hui. J'ai ressenti la puissance du module paramiko et j'ai aussi senti que mes compétences Linux n'étaient pas bonnes~~
Exigences
2. Analyse simple de la demande et organigramme"""批量主机管理接口""" import core if __name__ == "__main__": core.run()
"""核心代码""" import settings import paramiko import threading import os class REMOTE_HOST(object): #远程操作主机 def __init__(self, host, port ,username, password, cmd): self.host = host self.port = port self.username = username self.password = password self.cmd = cmd def run(self): """起线程连接远程主机后调用""" cmd_str = self.cmd.split()[0] if hasattr(self, cmd_str): #反射 eg:调用put方法 getattr(self, cmd_str)() else: #setattr(x,'y',v)is equivalent to ``x.y=v'' setattr(self, cmd_str, self.command) getattr(self, cmd_str)() #调用command方法,执行批量命令处理 def command(self): """批量命令处理""" ssh = paramiko.SSHClient() #创建ssh对象 #允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password) stdin,stdout,stderr = ssh.exec_command(self.cmd) result = stdout.read() print("%s".center(50, "-") % self.host) print(result.decode()) ssh.close() def put(self): """上传文件""" filename = self.cmd.split()[1] #要上传的文件 transport = paramiko.Transport((self.host, self.port)) transport.connect(username=self.username, password=self.password) sftp = paramiko.SFTPClient.from_transport(transport) sftp.put(filename, filename) print("put sucesss") transport.close() def show_host_list(): """通过选择分组显示主机名与IP""" for index, key in enumerate(settings.msg_dic): print(index + 1, key, len(settings.msg_dic[key])) while True: choose_host_list = input(">>>(eg:group1)").strip() host_dic = settings.msg_dic.get(choose_host_list) if host_dic: #print(host_dic) for key in host_dic: print(key, host_dic[key]["IP"]) return host_dic else: print("NO exit this group!") def interactive(choose_host_list): """根据选择的分组主机起多个线程进行批量交互""" thread_list = [] while True: cmd = input(">>>").strip() if cmd: for key in choose_host_list: host, port, username, password = choose_host_list[key]["IP"], choose_host_list[key]["port"], \ choose_host_list[key]["username"], choose_host_list[key]["password"] func = REMOTE_HOST(host, port, username, password, cmd) # 实例化类 t = threading.Thread(target=func.run) # 起线程 t.start() thread_list.append(t) for t in thread_list: t.join() # 主线程等待子线程执行完毕 else: continue def run(): choose_host_list = show_host_list() interactive(choose_host_list)
"""配置文件""" msg_dic = { "group1":{ #分组1 "h1":{"IP":"192.168.1.1", "username":"11", "password":"aa", "port":22}, "h2":{"IP":"192.168.1.2", "username":"22", "password":"bb", "port":22}, "h3":{"IP":"192.168.1.3", "username":"33", "password":"cc", "port":22}, "h4":{"IP":"192.168.1.4", "username":"44", "password":"dd", "port":22}, "h5":{"IP":"192.168.1.5", "username":"55", "password":"ee", "port":22}, "h6":{"IP":"192.168.1.6", "username":"66", "password":"ff", "port":22}, }, "group2":{ #分组2 "h1":{"IP":"192.168.2.1", "username":"111", "password":"aaa", "port":22}, "h2":{"IP":"192.168.2.2", "username":"222", "password":"bbb", "port":22}, "h3":{"IP":"192.168.2.3", "username":"333", "password":"ccc", "port":22}, "h4":{"IP":"192.168.2.4", "username":"444", "password":"ddd", "port":22}, "h5":{"IP":"192.168.2.5", "username":"555", "password":"eee", "port":22}, "h6":{"IP":"192.168.2.6", "username":"666", "password":"fff", "port":22}, "h7":{"IP":"192.168.2.7", "username":"777", "password":"ggg", "port":22}, "h8":{"IP":"192.168.2.8", "username":"888", "password":"hhh", "port":22}, }, "group3":{ "h1":{"IP":"192.168.179.133", "username":"root", "password":"zcl", "port":22}, } }
C:\Python34\python3.exe C:/Users/Administrator/PycharmProjects/laonanhai/host_manage/main.py 1 group1 6 2 group3 1 3 group2 8 >>>(eg:group1)group3 h1 192.168.179.133 >>>put from_windows.py put sucesss >>> >>>ls ------------------------192.168.179.133------------------------ anaconda-ks.cfg database_test from_windows.py install.log install.log.syslog m oot \root tmp\from_windows.py >>>
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois. Pour des explications plus détaillées sur les outils simples de gestion de lots hôtes de Python, veuillez prêter attention au site Web PHP chinois !