GitLab Runner SSH连接失败:‘Host key verification failed.’问题求助
你遇到的这个问题挺典型的——GitLab Runner的gitlab-runner系统用户原本能正常SSH登录服务器,新增机器后突然报错Host key verification failed.,连之前正常的服务器也出问题,清空known_hosts后还不弹信任提示,直接报错。我来帮你一步步排查解决:
1. 优先检查SSH目录的权限(最常见原因)
SSH对~/.ssh目录和文件的权限要求非常严格,如果权限太宽松,会直接拒绝使用相关文件,甚至连提示添加主机密钥的流程都走不下去。
先切换到gitlab-runner用户:
sudo su - gitlab-runner
然后检查目录和文件权限:
ls -ld ~/.ssh ls -l ~/.ssh
正常情况下:
.ssh目录权限必须是700(只有所有者可读、写、执行)- 目录内的文件(比如
known_hosts、私钥文件)权限必须是600
如果权限不对,立刻修复:
chmod 700 ~/.ssh chmod 600 ~/.ssh/*
2. 手动触发主机密钥信任流程
修复权限后,手动在gitlab-runner用户下执行SSH命令,强制接受目标主机的密钥:
ssh -o StrictHostKeyChecking=no your-user@target-server-ip
执行这个命令后,主机密钥会自动写入known_hosts,之后正常连接就不会报错了。
如果想更稳妥,也可以手动添加主机密钥:
先在任意能连通目标服务器的机器上获取公钥:
ssh-keyscan target-server-ip
把输出的内容复制到gitlab-runner用户的~/.ssh/known_hosts文件末尾即可。
3. 在CI/CD脚本中显式配置SSH环境
有时候GitLab Runner的Job执行环境会受限,默认的SSH配置可能不生效。可以在你的CI/CD脚本里提前做初始化:
deploy_job: script: # 确保SSH目录存在且权限正确 - mkdir -p ~/.ssh - chmod 700 ~/.ssh # 手动添加目标服务器的主机密钥 - ssh-keyscan target-server-ip >> ~/.ssh/known_hosts - chmod 600 ~/.ssh/known_hosts # 执行部署命令 - ssh your-user@target-server-ip "your-deploy-commands-here"
这样能避免Job执行时的环境问题导致的SSH认证失败。
4. 排查安全模块限制(SELinux/AppArmor)
如果你的服务器开启了SELinux或者AppArmor,可能会阻止gitlab-runner用户写入~/.ssh目录。可以临时关闭SELinux测试:
sudo setenforce 0
如果关闭后问题解决,就需要调整SELinux策略,允许gitlab-runner用户访问其SSH目录(比如用semanage命令配置)。
内容的提问来源于stack exchange,提问作者Sven van Zoelen

