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
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('你没有这个权限')
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
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
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
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('已经超过错误次数')