題目:簡單主機批量管理工具
需求:
- 主機分組
- 登錄后顯示主機分組,選擇分組后查看主機列表
- 可批量執行命令、發送文件,結果實時返回
- 主機用戶名密碼可以不同
流程圖:

說明:
### 作者介紹: * 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+
主程序:
#!/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}}}
