You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab-CE本地部署SSH权限问题及批量密钥重置求助

问题解决方案

一、旧PC SSH克隆权限拒绝的解决方法

问题原因

旧PC的SSH客户端缓存了原单域名的主机密钥,或Git项目远程地址未更新,导致与新SSH域名(ssh.example.com)的验证冲突。

具体操作步骤

  1. 更新Git远程仓库地址
    旧PC上的项目可能仍使用原域名的SSH地址,执行以下命令替换为新域名:

    git remote set-url origin git@ssh.example.com:namespace/project.git
    

    (替换namespace/project.git为实际项目路径)

  2. 清理SSH known_hosts旧记录
    删除原单域名的主机密钥缓存,避免验证错误:

    # 替换为原单域名,比如原域名是git.example.com
    ssh-keygen -R git.example.com
    

    若不确定原域名,可直接编辑~/.ssh/known_hosts文件,删除包含原GitLab域名的行。

  3. 验证SSH连接
    执行以下命令确认与新SSH域名的连接正常:

    ssh -T git@ssh.example.com
    

    正常情况下会返回Welcome to GitLab, @用户名!的提示。

  4. 批量处理300+服务器
    用自动化工具(如Ansible、Shell脚本)批量执行上述操作:

    • 编写Ansible playbook,批量更新Git远程地址并清理known_hosts
    • 或用Shell脚本结合SSH批量登录执行命令(需确保服务器已配置免密登录)

二、GitLab批量删除并重新添加SSH密钥

前提准备

获取GitLab管理员的个人访问令牌,需开启api权限(在GitLab个人设置→访问令牌中创建)。

1. 批量删除所有SSH密钥

通过GitLab API遍历所有用户并删除其SSH密钥,可编写Shell脚本实现:

#!/bin/bash
TOKEN="你的管理员令牌"
GITLAB_URL="https://https.example.com/api/v4"

# 获取所有用户ID列表
USER_IDS=$(curl --silent --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_URL/users" | jq -r '.[].id')

for USER_ID in $USER_IDS; do
    # 获取该用户的所有SSH密钥ID
    KEY_IDS=$(curl --silent --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_URL/users/$USER_ID/keys" | jq -r '.[].id')
    for KEY_ID in $KEY_IDS; do
        # 删除单个密钥
        curl --request DELETE --silent --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_URL/users/$USER_ID/keys/$KEY_ID"
        echo "Deleted key $KEY_ID for user $USER_ID"
    done
done

(需提前安装jq工具用于解析JSON)

2. 批量添加SSH密钥

准备包含用户信息的CSV文件(示例格式):

user_id,key_title,public_key
1,server-001-key,ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...
2,server-002-key,ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...

编写Shell脚本遍历CSV添加密钥:

#!/bin/bash
TOKEN="你的管理员令牌"
GITLAB_URL="https://https.example.com/api/v4"
CSV_FILE="ssh_keys.csv"

while IFS=, read -r USER_ID KEY_TITLE PUBLIC_KEY; do
    curl --request POST --header "PRIVATE-TOKEN: $TOKEN" \
        --data "title=$KEY_TITLE&key=$PUBLIC_KEY" \
        "$GITLAB_URL/users/$USER_ID/keys"
    echo "Added key for user $USER_ID"
done < "$CSV_FILE"

若CSV中无用户ID,可先通过用户邮箱调用API获取ID:

# 根据邮箱获取用户ID
USER_ID=$(curl --silent --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_URL/users?username=user@example.com" | jq -r '.[0].id')

内容的提问来源于stack exchange,提问作者Asif Shabbir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:17:36