简单的主机批量管理工具
要求:
主机分组
登录后显示主机分组,选择分组后显示主机列表
可批量执行命令,上传文件,结果实时返回
主机用户名密码可以不同
目录
+--Host_Manage +--ftp_client #客户端 | +--database #数据库 | +--Management.py #入口程序 | +--README | +--test.py #测试程序 | +--__init__.py +--__init__.py
细节
README:
###作业题目:简单主机批量管理工具
需求:
主机分组
登录后显示主机分组,选择分组后查看主机列表
可批量执行命令、发送文件,结果实时返回
主机用户名密码可以不同
###目录结构
+--Host_Manage
+--ftp_client #客户端程序
| +--database #数据库
| +--Management.py #入口程序
| +--README
| +--test.py #测试程序
| +--__init__.py
+--__init__.py
###注释
上传文件时,命令格式:
put database /tmp/db
###运行环境
windows系统
python3.0+
database:
{
"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}}
}
Management.py
import json,threading,paramiko
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;1m[%s]成功上传[%s]!\033[0m"%(self.host,self.cmd.split()[1]))
except Exception as error:
print("\033[31;1m[%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,password,username,port=k,host_dict[k]["password"],host_dict[k]["username"],host_dict[k]["port"]
func=Remotehost(host,port,username,password,cmd)#创建类的实例化
t=threading.Thread(func.run)#创建线程
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
else:
print("\033[31;1m命令不存在、033[0m")