• 主机管理+堡垒机系统开发:交互程序(四)


    引子:

    一、交互程序目录结构

    二、代码实现

    1、crazyeye_mgr.py

    import os
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CrazyEye.settings")
        import django
        django.setup()
    
        from backend import main
    
    
        obj = main.HostManager()
        obj.interactive()

    2、main.py

    import subprocess
    from web import models
    from django.contrib.auth import authenticate
    import random,string,uuid
    
    
    class HostManager(object):
        """用户登陆堡垒机后的交互程序"""
        def __init__(self):
            self.user = None
        def get_session_id(self,bind_host_obj,tag):
            '''apply  session id'''
            session_obj = models.Session(user_id = self.user.id,bind_host=bind_host_obj,tag=tag)
    
            session_obj.save()
            return session_obj
        
        def interactive(self):
            """交互脚本"""
            print("----run---------")
    
            count = 0
            while count <3:
                username = input("Username:").strip()
                password = input("Password:").strip()
                user = authenticate(username=username,password=password)
                if user:
                    print("Welcome %s".center(50,'-') % user.name )
                    self.user = user
                    break
                else:
                    print("Wrong username or password!")
    
                count += 1
    
            else:
                exit("Too many attempts, bye.")
    
            if self.user: #验证成功
                while True:
                    for index,host_group  in enumerate(self.user.host_groups.all()): #select_related()
                        print("%s.	%s[%s]" %(index,host_group.name, host_group.bind_hosts.count()))
                    print("z.	未分组主机[%s]" %(self.user.bind_hosts.count()))
    
    
                    choice = input("%s>>:"% self.user.name).strip()
                    if len(choice) == 0:continue
                    selected_host_group = None
    
                    if choice.isdigit():
                        choice = int(choice)
                        if choice >=0 and choice <= index: #合法选项
                            selected_host_group = self.user.host_groups.all()[choice]
                    elif choice == 'z':
                        selected_host_group = self.user
    
                    if selected_host_group:
                        print("selected host group", selected_host_group)
                        while True:
                            for index, bind_host in enumerate(selected_host_group.bind_hosts.all()):
                                print("%s.	%s" % (index, bind_host))
                            choice = choice = input("%s>>>:" % self.user.name).strip()
                            if choice.isdigit():
                                choice = int(choice)
                                if choice >= 0 and choice <= index:  # 合法选项
                                    print("going to logon ....", selected_host_group.bind_hosts.all()[choice])
                                    bind_host = selected_host_group.bind_hosts.all()[choice]
                                    ssh_tag  = uuid.uuid4()
                                    session_obj =  self.get_session_id(bind_host,ssh_tag)
    
                                    monitor_script = subprocess.Popen("sh /home/traum/CrazyEye/backend/session_tracker.sh %s %s" % (ssh_tag,session_obj.id),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
                                    
                                    #print(monitor_script.stderr.read()) 
    
                                    subprocess.run('sshpass -p %s ssh %s@%s -E %s -o  StrictHostKeyChecking=no' %(bind_host.remote_user.password,
                                                                               bind_host.remote_user.username,
                                                                               bind_host.host.ip_addr ,ssh_tag ), shell=True)
                                    
    
                            elif choice == 'b':
                                break
    

    三、效果截图

    1、登录欢迎界面截图

    2、web组主机选择截图

    3、未分组主机

    4、中断退出测试截图

  • 相关阅读:
    关于MOTO E2
    Visual Studio 2008 SDK 1.1 Beta 发布
    开始了新的工作
    C# 2.0 的"语法多义性"
    最近画的框架草图
    SQL数据库向ORACLE迁移注意事项
    C#中很多新的特性,提供了更好的“即兴编程”的能力。
    看了点lua相关的东西,有点想法不知能否实现?先记下来慢慢思考。
    读《企业应用架框模式》
    porting cinvoke1.0 to E2 (armlinux)
  • 原文地址:https://www.cnblogs.com/luoahong/p/9466638.html
Copyright © 2020-2023  润新知