我刚刚使用 ssh key gen 生成了公钥和私钥。我将公钥上传到GitLab(基本上是 git hub 的克隆)我大学的系统,并收到一封电子邮件,说我成功上传了密钥。当我尝试运行 git clone 命令时,我得到
Cloning into 'csci6990-hci-f13'...
ssh_exchange_identification: Connection closed by remote host
fatal: The remote end hung up unexpectedly
在指责 git 实验室系统之前,我试图了解我是否做对了所有事情。话虽如此,当我将公钥上传到 git lab 时,没有任何说明/步骤来告诉 gitlab 私钥在我的 mac os x 上的位置。这让我想到也许 sshkeygen 会自动将密钥放入某种标准存储库位置?是这样吗?如果没有,那么我如何上传公钥并使其工作而不告诉远程系统相应的私钥位于文件系统中的位置?
编辑:这是 ssh -vvv 的输出
OpenSSH_5.6p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /etc/ssh_config
debug1: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to gitlab.cs.uno.edu [137.30.120.92] port 22.
debug1: Connection established.
debug1: identity file /Users/abramhandler/.ssh/id_rsa type -1
debug1: identity file /Users/abramhandler/.ssh/id_rsa-cert type -1
debug1: identity file /Users/abramhandler/.ssh/id_dsa type -1
debug1: identity file /Users/abramhandler/.ssh/id_dsa-cert type -1
ssh_exchange_identification: Connection closed by remote host
答案1
没有说明/步骤告诉 gitlab 私钥在我的 mac os x 上的位置
远程服务器不需要知道你的本地私钥在哪里。它永远不会看到它,也不应该看到它。它保留在您的计算机上并且永远不会被传输。
这让我想到也许 sshkeygen 会自动将密钥放入某种标准存储库位置?
当它要求您(可选)设置您自己的密钥名称时,会提到一个默认文件名,可能是/home/you/.ssh/id_rsa
.这就是私钥。它还创建带有后缀的公钥.pub
。如果您自己命名它们,则可以将它们放在任何地方,但据我所知,这两个文件必须位于同一目录中。
如果您不使用默认名称,为了使用密钥,您必须使用ssh-agent
via注册它ssh-add
,或者在调用 ssh 时在命令行上指定它,例如:
ssh -i ~/.ssh/mykey ....
请注意,这不是mykey.pub
,但是(如上所述)mykey.pub
应该与 位于同一目录中mykey
。即,-i
指的是私钥。如果密钥受密码保护,系统会要求您提供该密钥。然后 ssh 发送公钥到服务器。
如果您未使用 指定密钥-i
,/home/you/.ssh/id_rsa
则将使用该密钥(如果有)。如果您使用默认密钥,则可以忽略其余部分。
要使用非默认密钥git
(即,如果您选择退出“id_rsa”),您必须首先使用ssh-agent
. ssh-agent 背后的想法是,您使用它来调用 shell 或其他一些持久应用程序,这些应用程序将成为您调用 git 的 shell 的父级(例如 GUI 本身,可能有 OSX 特定的方法)。例如:
> ssh-agent bash
在 ssh-agent 下启动一个新的 bash 子 shell。下一个:
> ssh-add ~/.ssh/mykey
再次,私钥。您可以根据需要添加任意数量的这些内容。随后,当在该 shell 或其子 shell 中使用 ssh 时,它将自动与远程服务器尝试该密钥列表。使用 git 克隆:
git clone ssh://me@wherever/some/repo/path
答案2
是的。您的私钥应位于 ~/.ssh/id_rsa 或 ~/.ssh/id_dsa 中,具体取决于您生成的密钥类型。确保文件的权限严格。
您可能还需要设置一个代理来缓存与密钥一起使用的密码,以进一步简化配置。
答案3
您是否有可能位于路由器后面,该路由器以某种方式过滤或破坏您与 的 SSH 端口的传出连接137.30.120.92
?因为我可以很好地连接到该服务器:
martin@martin ~ % ssh 137.30.120.92
The authenticity of host '137.30.120.92 (137.30.120.92)' can't be established.
ECDSA key fingerprint is 45:45:c0:59:c6:c9:50:22:7d:45:bf:cc:e2:9a:99:31.
+--[ECDSA 256]---+
| .o=@*+o |
| o+o= . |
| .. .|
| . o .|
| S . + |
| . . |
| E . |
| B |
| = |
+-----------------+
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '137.30.120.92' (ECDSA) to the list of known hosts.
Ubuntu 12.04.2 LTS gitlab ssh-pty
Password:
然而,您的输出Connection closed by remote host
表明您的ssh
客户端永远无法真正与 SSH 服务器通信 - 服务器确实接受连接,但它不会回复您的ssh
客户端。
另外,相关说明 -Connection closed by remote host
可能是服务器崩溃的症状,至少这是我遇到此错误的常见情况。但这里不应该是这种情况,因为那样我就会得到同样的错误。