我的办公室网络中有一台 Ubuntu 12.04 服务器,用于托管我们的 git 存储库。该服务器运行的是 Gitlab 7.1.1,并在非标准端口上有 SSH。
它完美地适用于办公室网络内外的所有人,但有一个例外。这个例外是托管公司的托管服务器,因此我只能有限地访问它。
当我尝试在非标准端口上克隆 repo 时,它会超时。我认为这是因为托管公司阻止了传出端口。为了解决这个问题,我在办公室路由器上设置了端口转发,将端口 22 上的传入流量转发到 git 服务器上的非标准端口。我通过从 Digial Ocean VPS 克隆进行了测试,没有指定端口,并且运行良好。
但是有问题的服务器现在出现以下错误:
Access denied.
fatal: The remote end hung up unexpectedly
git 服务器正在注册正在建立的 SSH 连接,并接受公钥,如下所示/var/log/auth.log
:
Jan 20 15:09:07 gitlab sshd[3043]: Accepted publickey for git from 10.0.1.254 port 60771 ssh2
Jan 20 15:09:07 gitlab sshd[3043]: pam_unix(sshd:session): session opened for user git by (uid=0)
Jan 20 15:09:09 gitlab sshd[3162]: Received disconnect from 10.0.1.254: 11: disconnected by user
Jan 20 15:09:09 gitlab sshd[3043]: pam_unix(sshd:session): session closed for user git
这看起来与日志中的任何其他身份验证请求没有什么不同,所以我不知道为什么克隆失败了?
我在 Github 上设置了一个测试仓库,有问题的服务器可以通过 SSH 正常克隆。只是出于某种原因,通过 SSH 克隆我办公室服务器上的仓库时出现了问题。
还值得注意的是,有问题的服务器可以通过 HTTP 使用用户名和密码进行克隆,只有通过 SSH 才会出现问题。
知道这里的问题是什么吗?
PS,我更像是一名程序员,而不是服务器管理员,我参与其中是为了尝试改进公司的部署流程,所以其中很多内容对我来说都是新的
答案1
我已经解决了这个问题。
问题在于,有问题的服务器的公钥已作为“部署密钥”添加到 Gitlab,用于之前无关的测试。然后它作为部署密钥被删除,但出于某种原因,该密钥仍保留在 Gitlab 数据库中。然后,Gitlab 允许我将相同的密钥重新添加到测试用户,而不会抱怨它已经存在于数据库中的其他地方。但是,当尝试使用该密钥进行身份验证时,Gitlab 会查找该密钥,并获取第一个“孤立”密钥,因此它只会提供匿名访问,这显然不允许克隆。
为了解决这个问题,我找到了孤立的密钥 ID,并使用 git-shell 将其删除:
./bin/gitlab-keys rm-key key-21
21
孤立密钥的 ID 在哪里?
现在一切都按预期进行。