gitlab 获取所有用户有效期,权限等信息

发布时间:2026/7/23 22:04:59
gitlab 获取所有用户有效期,权限等信息 #权限说明总结表格角色权限适用人群Guest创建 issue、发表评论不能读写版本库无Reporter克隆代码不能提交QA、PMDeveloper克隆代码、开发、提交、推送RDMaintainer维护项目、添加项目成员、编辑项目核心 RD 负责人Owner设置项目可见性、删除项目、迁移项目、管理组成员拥有所有权限。开发组 Leader10: Guest, 20: Reporter, 30: Developer, 40: Maintainer, 50: Owner####1.gitlab_permission_report.txt按项目维度输出用户权限到期时间2.soon_to_expire.txt输出用户到期时间少于30天3.user_projects.txt按用户维度显示所属项目及权限rootrke2-10-30:~/gitlabUserExpire# more getGitlabExpireUserMsg.py #!/usr/bin/python3 import requests import json from datetime import datetime, timedelta # GitLab API URL 和访问令牌 GITLAB_URL https://gitlab.umi.com/api/v4 PRIVATE_TOKEN glpat-X HEADERS {PRIVATE-TOKEN: PRIVATE_TOKEN} def fetch_all_projects(): 获取所有项目列表自动处理分页 page 1 projects [] while True: params { per_page: 100, page: page } response requests.get(f{GITLAB_URL}/projects, headersHEADERS, paramsparams) response.raise_for_status() current_page_projects response.json() if not current_page_projects: break projects.extend(current_page_projects) # 检查是否最后一页 if len(current_page_projects) 100: break page 1 return projects def fetch_project_members(project_id): 获取单个项目的所有成员信息包括继承成员 members_url f{GITLAB_URL}/projects/{project_id}/members/all response requests.get(members_url, headersHEADERS) if response.status_code 403: print(f项目 {project_id} 权限不足跳过) return [] response.raise_for_status() return response.json() def parse_date(date_str): 解析日期字符串 if date_str is None or date_str 永久有效: return None if T in date_str: # ISO 8601 格式 return datetime.strptime(date_str, %Y-%m-%dT%H:%M:%S.%fZ) else: # 简单日期格式 return datetime.strptime(date_str, %Y-%m-%d) def format_output(project, members): 格式化输出结果 output [] output.append(f项目名称: {project[name]}) output.append(f项目地址: {project[web_url]}) output.append(f最后活跃: {project[last_activity_at]}) output.append(\n成员列表:) output.append(f{用户名:15}{姓名:10}{权限等级:10}{到期时间:20}) output.append(- * 55) for member in members: expires_at member[expires_at] or 永久有效 access_level { 10: Guest, 20: Reporter, 30: Developer, 40: Maintainer, 50: Owner }.get(member[access_level], 未知) output.append( f{member[username]:15} f{member[name]:10} f{access_level:10} f{expires_at:20} ) return \n.join(output) def save_to_special_record(project, member): 保存到期时间在今天起30天内的用户信息和仓库到单独记录 expires_at parse_date(member[expires_at]) if expires_at is not None: today datetime.now() expires_in_one_month today timedelta(days30) if today expires_at expires_in_one_month: with open(soon_to_expire.txt, a) as f: f.write(f项目名称: {project[name]}\n) f.write(f项目地址: {project[web_url]}\n) f.write(f用户名: {member[username]}\n) f.write(f姓名: {member[name]}\n) f.write(f到期时间: {member[expires_at]}\n\n) def get_user_projects(all_projects, all_members): 获取用户的所有项目及权限含姓名 user_projects {} for project in all_projects: members fetch_project_members(project[id]) for member in members: username member[username] # 新增用户姓名字段 user_info { name: member[name], # 从API响应中获取姓名 projects: [] } if username not in user_projects: user_projects[username] user_info else: user_info user_projects[username] # 转换权限等级 access_level { 10: Guest, 20: Reporter, 30: Developer, 40: Maintainer, 50: Owner }.get(member[access_level], 未知) user_info[projects].append({ project_name: project[name], project_url: project[web_url], access_level: access_level }) return user_projects def main(): try: # 获取所有项目 all_projects fetch_all_projects() print(f发现 {len(all_projects)} 个项目) # 遍历处理每个项目 for project in all_projects: members fetch_project_members(project[id]) report format_output(project, members) # 输出到控制台并保存文件 print(\n *60) print(report) with open(gitlab_permission_report.txt, a) as f: f.write(report \n\n) # 保存到期时间在今天起30天内的用户信息 for member in members: save_to_special_record(project, member) # 获取用户所在的所有项目 user_projects get_user_projects(all_projects, []) # 输出或保存用户所在的项目信息 with open(user_projects.txt, w) as f: for username, data in user_projects.items(): f.write(f用户名: {username} ({data[name]})\n) # 新增姓名显示 for project in data[projects]: f.write(f - {project[project_name]} ({project[access_level]}): {project[project_url]}\n) f.write(\n) except requests.exceptions.HTTPError as e: print(fAPI 请求失败: {e.response.status_code} {e.response.text}) except Exception as e: print(f程序异常: {str(e)}) if __name__ __main__: main()执行python3 getGitlabExpireUserMsg.py