【python 项目】简单的主机批量管理工具

简单的主机批量管理工具

要求:

主机分组

登录后显示主机分组,选择分组后显示主机列表

可批量执行命令,上传文件,结果实时返回

主机用户名密码可以不同

目录

+--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")



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值