題目:簡單主機批量管理工具 需求: 流程圖: Readme: ### 作者介紹: * author:lzl ### 博客地址: * http://www.cnblogs.com/lianzhilei/p/5881434.html ### 功能實現 題目:簡單主機批量管理工具 需求: 主機分組 登錄後 ...
題目:簡單主機批量管理工具
需求:
- 主機分組
- 登錄後顯示主機分組,選擇分組後查看主機列表
- 可批量執行命令、發送文件,結果實時返回
- 主機用戶名密碼可以不同
流程圖:
說明:
### 作者介紹: * author:lzl ### 博客地址: * http://www.cnblogs.com/lianzhilei/p/5881434.html ### 功能實現 題目:簡單主機批量管理工具 需求: 主機分組 登錄後顯示主機分組,選擇分組後查看主機列表 可批量執行命令、發送文件,結果實時返回 主機用戶名密碼可以不同 ### 目錄結構: Host-Manage │ ├── ftpclient #客戶端程式 ├── README.txt ├── management.py #服務端入口程式 ├── database #資料庫 ├── test.py #修改資料庫 ### 註釋 可批量執行命令、發送文件 上傳命令格式: put database /tmp/db ### 運行環境 windows系統 python3.0+README
主程式:
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import json import paramiko import threading class Remotehost(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 command(self): #獲取命令 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允許連接不在know_hosts文件中的主機 ssh.connect(hostname=self.host, port=self.port, username=self.username, password=self.password) # 連接伺服器 stdin, stdout, stderr = ssh.exec_command(self.cmd) # 獲取命令結果 res ,err = stdout.read(),stderr.read() # 三元運算 result = res if res else err print("[%s]".center(50,"-")%self.host) print(result.decode()) # 列印輸出 ssh.close() def put(self): #上傳 try: transport = paramiko.Transport((self.host, self.port)) transport.connect(username=self.username, password=self.password) sftp = paramiko.SFTPClient.from_transport(transport) sftp.put(self.cmd.split()[1], self.cmd.split()[2]) # 上傳文件 transport.close() print("\033[32;0m【%s】 上傳 文件【%s】 成功....\033[0m"%(self.host,self.cmd.split()[2])) except Exception as error: # 抓住異常 print("\033[31;0m錯誤:【%s】【%s】\033[0m"%(self.host,error)) def run(self): #反射 cmd_str = self.cmd.split()[0] if hasattr(self,cmd_str): getattr(self,cmd_str)() else: setattr(self,cmd_str,self.command) getattr(self,cmd_str)() if __name__ == "__main__": #主程式 with open("database","r") as file: data_dict = json.loads(file.read()) #獲取資料庫信息 for k in data_dict: #列印地址組 print(k) group_choice = input("輸入要操作的組名:").strip() if data_dict.get(group_choice): host_dict = data_dict[group_choice] #定義主機字典 for k in host_dict: #列印所選地址組所有的主機名 print(k) while True: cmd = input("選擇進行的操作的命令:").strip() thread_list=[] if cmd: #命令不為空 for k in host_dict: host, port, username, password=k,host_dict[k]["port"],host_dict[k]["username"],host_dict[k]["password"] func = Remotehost(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: print("\033[31;0m操作組不存在\033[0m")
資料庫:
{"group1": {"192.168.20.217": {"password": "123456", "username": "root", "port": 22}, "192.168.20.219": {"password": "zyw@123", "username": "root", "port": 22}}, "group2": {"192.168.20.217": {"password": "123456", "username": "root", "port": 22}}}database