Exemple #1
0
 def add_bindhost(self):
     '''主机和使用登陆的帐户密码绑定'''
     while True:
         print('主机绑定远程连接帐户'.center(50, '-'))
         h_obj = session.query(Host).all()
         for h_index, h in enumerate(h_obj):
             print('%s. ip:%s' % (h_index, h))
         choice = input('请选择ip左边相应的序号:').strip()
         if len(choice) == 0: continue
         if choice == 'b':
             break
         if choice.isdigit():
             choice = int(choice)
             if choice < len(h_obj):
                 host_obj = h_obj[choice]
             else:
                 print('所输入的数字不在主机选择范围内')
                 continue
         else:
             print('请输入数字')
             continue
         ruse_obj = session.query(RemoteUser).all()
         for r_index, ruse in enumerate(ruse_obj):
             print('%s. %s' % (r_index, ruse))
         while True:
             ruse_choice = input('请选择该主机要绑定的帐户序号:')
             if len(ruse_choice) == 0: continue
             if ruse_choice.isdigit():
                 ruse_choice = int(ruse_choice)
                 if ruse_choice < len(ruse_obj):
                     r_obj = ruse_obj[ruse_choice]
                     bind_obj = BindHost(host_id=host_obj.id,
                                         remoteuser_id=r_obj.id)
                     try:
                         session.add(bind_obj)
                         session.commit()
                         print('绑定成功')
                     except IntegrityError:
                         session.rollback()  #如果上面的事务出错,这里要用到回滚,否则再次查询时会出错
                         print('\033[31;0m已存在\033[0m')
                     break
                 else:
                     print('所输入的数字不在主机选择范围内')
                     continue
             else:
                 print('请输入数字')
                 continue
         q_choice = input('是否退出绑定?(y/n):').strip()
         if q_choice == 'y':
             break
Exemple #2
0
def cmd_interactive():
    user = auth()
    if user:
        while True:
            print('可登陆的主机如下'.center(50, '-'))
            print('未分组主机:')
            for h in user.bind_hosts:
                print(h)
            print('已分组主机:')
            for h_g in user.host_groups:  #用户绑定的主机组
                print(h_g)
                for i in h_g.bind_hosts:
                    print(i)
            choise_ip = input('请输入要连接的主机IP:').strip()
            choise_user = input('请输入要登陆这台主机的权限用户:').strip()
            h_obj = session.query(Host).filter_by(
                ip=choise_ip).first()  #找到输入IP的主机,IP是唯一的
            r_u_obj = session.query(RemoteUser).filter_by(
                username=choise_user).all()  #找到输入用户名的所有帐户,用户名不是唯一
            #循环找到的用户名,根据主机ID和用户名ID,找到相对应的绑定主机
            bind_obj = False
            for r_u in r_u_obj:
                b_obj = session.query(BindHost).filter_by(
                    host_id=h_obj.id).filter_by(remoteuser_id=r_u.id).first()
                if b_obj:
                    bind_obj = b_obj  #找到相对应的绑定主机
            if not bind_obj:
                print('输入错误,请输入正确的IP或权限用户')
                continue
            #判断绑定的主机在不在这个用户的未分组和分组机器里面
            flag = False
            if bind_obj in user.bind_hosts:  #如果用户绑定的主机里有这个绑定主机
                flag = True
            if not flag:
                for h_g in user.host_groups:
                    if bind_obj in h_g.bind_hosts:  #如果用户所属的组里有这个绑定主机
                        flag = True
            if flag:  #执行远程SSH连接
                r_user_obj = session.query(RemoteUser).filter_by(
                    id=bind_obj.remoteuser_id).first()  #找到连接使用的用户和密码
                demo.conn_host(user.id, h_obj.id, h_obj.ip, h_obj.port,
                               r_user_obj.username, r_user_obj.password,
                               r_user_obj.auth_type)
                #传入堡垒机用户id,远程主机id,主机IP,端口,SSH连接的用户密码和认证类型
            else:
                print('你没有这个权限')
Exemple #3
0
 def add_user_m2m_group(self):
     '''堡垒机用户和主机组的关联'''
     while True:
         print('堡垒机用户关联主机组'.center(50, '-'))
         user_obj = session.query(UserProfile).all()
         for u_index, user in enumerate(user_obj):
             print('%s.%s' % (u_index, user))
         u_choice = input('请选择堡垒机用户序号:').strip()
         if len(u_choice) == 0: continue
         if u_choice == 'b':
             break
         if u_choice.isdigit():
             u_choice = int(u_choice)
             if u_choice < len(user_obj):
                 u_obj = user_obj[u_choice]
             else:
                 print('所输入的数字不在用户选择范围内')
                 continue
         else:
             print('请输入数字')
             continue
         h_group_obj = session.query(HostGroup).all()
         for g_index, gruop in enumerate(h_group_obj):
             print('%s.%s' % (g_index, gruop))
         while True:
             g_choice = input('请选择主机组序号:').strip()
             if len(g_choice) == 0: continue
             if g_choice == 'b':
                 break
             if g_choice.isdigit():
                 g_choice = int(g_choice)
                 if g_choice < len(h_group_obj):
                     gruop_obj = h_group_obj[g_choice]
                     u_obj.host_groups.append(gruop_obj)
                     session.commit()
                     print('关联成功')
                     break
                 else:
                     print('所输入的数字不在用户选择范围内')
                     continue
             else:
                 print('请输入数字')
                 continue
         q_choice = input('是否退出关联?(y/n):').strip()
         if q_choice == 'y':
             break
Exemple #4
0
 def add_bhost_m2m_hgroup(self):
     '''绑定后的主机与组的关联'''
     while True:
         print('远程主机与组的关联'.center(50, '-'))
         h_group_obj = session.query(HostGroup).all()
         for g_index, gruop in enumerate(h_group_obj):
             print('%s.%s' % (g_index, gruop))
         g_choice = input('请选择主机组序号:').strip()
         if len(g_choice) == 0: continue
         if g_choice == 'b':
             break
         if g_choice.isdigit():
             g_choice = int(g_choice)
             if g_choice < len(h_group_obj):
                 gruop_obj = h_group_obj[g_choice]
             else:
                 print('所输入的数字不在用户选择范围内')
                 continue
         else:
             print('请输入数字')
             continue
         b_host_obj = session.query(BindHost).all()
         for b_index, b_host in enumerate(b_host_obj):
             print('%s.%s' % (b_index, b_host))
         while True:
             b_choice = input('请选择绑定主机的序号:').strip()
             if len(b_choice) == 0: continue
             if b_choice == 'b':
                 break
             if b_choice.isdigit():
                 b_choice = int(b_choice)
                 if b_choice < len(b_host_obj):
                     host_obj = b_host_obj[b_choice]
                     gruop_obj.bind_hosts.append(host_obj)
                     session.commit()
                     print('关联成功')
                     break
                 else:
                     print('所输入的数字不在用户选择范围内')
                     continue
             else:
                 print('请输入数字')
                 continue
         q_choice = input('是否退出关联?(y/n):').strip()
         if q_choice == 'y':
             break
Exemple #5
0
 def add_u_m2m_bindhost(self):
     '''添加堡垒机用户和绑定后的主机关联'''
     while True:
         print('堡垒机用户关联远程主机'.center(50, '-'))
         user_obj = session.query(UserProfile).all()
         for u_index, user in enumerate(user_obj):
             print('%s.%s' % (u_index, user))
         u_choice = input('请选择堡垒机用户序号:').strip()
         if len(u_choice) == 0: continue
         if u_choice == 'b':
             break
         if u_choice.isdigit():
             u_choice = int(u_choice)
             if u_choice < len(user_obj):
                 u_obj = user_obj[u_choice]
             else:
                 print('所输入的数字不在用户选择范围内')
                 continue
         else:
             print('请输入数字')
             continue
         b_host_obj = session.query(BindHost).all()
         for b_index, b_host in enumerate(b_host_obj):
             print('%s.%s' % (b_index, b_host))
         while True:
             b_choice = input('请选择绑定主机的序号:').strip()
             if len(b_choice) == 0: continue
             if b_choice == 'b':
                 break
             if b_choice.isdigit():
                 b_choice = int(b_choice)
                 if b_choice < len(b_host_obj):
                     host_obj = b_host_obj[b_choice]
                     u_obj.bind_hosts.append(host_obj)
                     session.commit()
                     print('关联成功')
                     break
                 else:
                     print('所输入的数字不在用户选择范围内')
                     continue
             else:
                 print('请输入数字')
                 continue
         q_choice = input('是否退出关联?(y/n):').strip()
         if q_choice == 'y':
             break
Exemple #6
0
def auth():
    '''认证登陆'''
    count = 0
    while count < 3:
        username = input('用户名:').strip()
        if len(username) == 0:
            continue
        passwd = input('密码:').strip()
        if len(passwd) == 0:
            continue
        u_obj = session.query(UserProfile).filter_by(
            username=username).filter_by(password=passwd).first()
        if u_obj:
            return u_obj
        else:
            print('输入的用户或密码错误,还剩%s输入机会' % (3 - count - 1))
        count += 1
    print('已经超过错误次数')