无需SSH密钥,使用认证/部署令牌通过SSH克隆自定义GitLab实例仓库
解决GitLab禁用HTTP后,脚本克隆仓库的方案
首先得澄清一个关键点:GitLab的认证令牌(个人访问令牌、部署令牌)是为HTTPS协议设计的,SSH协议本身并不支持直接用这类令牌作为认证凭证——SSH依赖的是密钥对(公钥+私钥)的认证机制。所以针对你的场景,最靠谱的方案是使用SSH密钥对来完成脚本化克隆,下面是具体步骤:
方案一:使用SSH密钥对(推荐,符合SSH标准流程)
1. 生成无密码的SSH密钥对(适合脚本自动化)
在运行脚本的机器上执行以下命令,生成不会要求输入密码的密钥对(脚本里用的话,不需要交互密码):
ssh-keygen -t ed25519 -C "script-deploy@your-domain.com" -N "" -f ~/.ssh/gitlab_deploy_key
-t ed25519:采用更安全的ed25519算法-N "":设置空密码,避免脚本运行时需要手动输入密码-f ~/.ssh/gitlab_deploy_key:指定密钥保存路径,方便脚本精准引用
2. 将公钥添加到GitLab对应仓库/账号
- 如果是个人账号使用:登录GitLab,进入「个人设置」→「SSH密钥」,把生成的
~/.ssh/gitlab_deploy_key.pub里的内容粘贴进去,保存即可。 - 如果是部署场景(对应原部署令牌的需求):进入目标项目的「设置」→「仓库」→「部署密钥」,点击「添加部署密钥」,粘贴公钥内容,根据需要勾选「允许写入」(如果脚本需要推送代码的话),然后保存。
3. 脚本中执行克隆命令
在脚本里,你可以直接使用SSH URL克隆,或者指定密钥路径(避免和机器上其他SSH密钥冲突):
# 方式1:如果密钥在默认路径或已被ssh-agent加载 git clone git@your-gitlab-instance.com:your-group/your-project.git # 方式2:指定密钥路径(更稳妥,适合脚本环境) git clone -c core.sshCommand="ssh -i ~/.ssh/gitlab_deploy_key -o StrictHostKeyChecking=no" git@your-gitlab-instance.com:your-group/your-project.git
-o StrictHostKeyChecking=no:跳过首次连接时的主机密钥确认,适合脚本自动化(注意:如果是安全要求高的环境,建议提前把GitLab实例的主机密钥加入~/.ssh/known_hosts)
方案二:利用GitLab的SSH证书(进阶,适合大规模部署)
如果你的GitLab实例启用了SSH证书颁发功能,你可以用认证令牌向GitLab请求短期的SSH证书,用证书来完成认证。不过这个配置相对复杂,适合团队大规模自动化场景:
- 确保GitLab实例开启了SSH证书颁发功能(管理员在「管理中心」→「SSH」里配置)
- 用你的认证令牌请求SSH证书:
curl --header "PRIVATE-TOKEN: your-deploy-token" "https://your-gitlab-instance.com/api/v4/user/ssh_certificates" -X POST -d "key=$(cat ~/.ssh/id_ed25519.pub)"
- 把返回的证书保存到
~/.ssh/id_ed25519-cert.pub,之后就可以用这个证书进行SSH认证克隆了。
常见误区澄清
很多人会想把令牌套用到SSH URL里,但SSH的URL格式是git@host:repo.git,其中git是固定的SSH用户名,无法替换成令牌,所以这种方式是行不通的。令牌本质上是HTTPS的Bearer凭证,和SSH的认证体系不兼容,所以不要强行尝试这种方式。
内容的提问来源于stack exchange,提问作者Cilyan




