共享Linux账号下自动切换Git用户(提交作者与SSH密钥)方案问询
共享Ubuntu构建PC的Git身份自动匹配方案
问题背景
我们有一台运行Ubuntu 22.04.5 LTS的共享Linux构建PC,仅设有一个build账号,所有人通过不同Windows设备的RDP登录使用。需要确保Bitbucket中Git提交的作者姓名/邮箱与推送者的SSH密钥身份匹配,避免Pull Request中出现提交者与推送者身份不符的问题。
现有方案的痛点
为防止误用他人身份提交,我们未设置全局Git作者信息,每次提交需手动指定参数:
git -c user.email=email@example.com -c user.name='John Doe' some-git-command
该方式虽能避免身份混用,但操作繁琐,且无法同步对应SSH密钥。
曾尝试编写pre-push钩子根据作者邮箱切换SSH密钥,但因SSH缓存问题未生效;手动重启ssh-agent有效,但脚本内执行无效。现不打算修复该钩子,寻求更通用的解决方案。
核心需求
- 登录/登出(包括强制登出他人)时自动清除用户名、邮箱及SSH密钥相关配置;
- 自动识别当前登录用户身份,自动设置对应Git作者信息和SSH密钥,无需手动执行脚本。
可行解决方案
一、基于RDP会话信息的自动身份识别与配置
1. 利用客户端IP识别用户
Ubuntu的RDP服务会保留远程连接的来源IP,可通过命令提取:
# 获取当前RDP连接的来源IP CLIENT_IP=$(who am i | awk '{print $NF}' | sed 's/[()]//g')
提前在/home/build/.user_profiles文件中关联IP与用户信息:
# .user_profiles 格式:IP=姓名;邮箱;SSH密钥文件名 192.168.1.100=John Doe;john@example.com;id_ed25519_E1 192.168.1.101=Jane Smith;jane@example.com;id_ed25519_E2
2. 登录时自动加载配置
修改build用户的~/.bashrc,添加会话启动时的自动配置逻辑:
# 清理残留的Git配置与SSH缓存 git config --unset user.name git config --unset user.email ssh-add -D 2>/dev/null # 清空SSH agent中的所有密钥 # 匹配用户配置 CLIENT_IP=$(who am i | awk '{print $NF}' | sed 's/[()]//g') PROFILE=$(grep "^$CLIENT_IP=" /home/build/.user_profiles) if [ -n "$PROFILE" ]; then USER_NAME=$(echo $PROFILE | cut -d'=' -f2 | cut -d';' -f1) USER_EMAIL=$(echo $PROFILE | cut -d'=' -f2 | cut -d';' -f2) SSH_KEY=$(echo $PROFILE | cut -d'=' -f2 | cut -d';' -f3) # 设置会话级Git配置(退出后自动失效) git config user.name "$USER_NAME" git config user.email "$USER_EMAIL" # 启动SSH agent并加载对应密钥 eval $(ssh-agent -s) ssh-add ~/.ssh/$SSH_KEY else echo "未识别到用户身份,请联系管理员配置" fi
3. 登出时自动清理
修改xrdp的登出脚本(如/etc/xrdp/logout.sh),添加清理逻辑:
# 清理Git配置 git config --unset user.name git config --unset user.email # 终止SSH agent并清空密钥 pkill ssh-agent ssh-add -D 2>/dev/null
若需处理强制登出场景,可结合pam_script在用户会话结束时自动执行清理脚本。
二、Git条件配置替代手动参数
无需每次Git命令加-c参数,通过环境变量自动切换配置:
- 在
~/.gitconfig中添加条件包含规则:
[includeIf "env:GIT_USER_PROFILE=E1"] path = ~/.gitconfig_e1 [includeIf "env:GIT_USER_PROFILE=E2"] path = ~/.gitconfig_e2
- 每个用户的独立配置文件(如
~/.gitconfig_e1):
[user] name = John Doe email = john@example.com [core] sshCommand = ssh -i ~/.ssh/id_ed25519_E1
- 在登录脚本中根据识别到的用户设置
GIT_USER_PROFILE环境变量,Git会自动加载对应配置,推送时直接使用指定SSH密钥,无需替换默认密钥文件。
三、基于RDP客户端用户名识别(可选)
若Windows端RDP连接时传递了本地用户名(需在xrdp配置中开启),可读取USERNAME环境变量匹配用户,比IP更可靠:
CLIENT_USER=$USERNAME # 在.user_profiles中关联CLIENT_USER与对应配置即可
内容的提问来源于stack exchange,提问作者elechris
相关产品推荐
相关产品推荐

