您的位置:首页 > 编程语言

通过SSH 密钥连接GitHub/Bitbucket

2015-06-18 18:47 399 查看
GitHub, Bitbucket 都是项目托管服务器,都支持Gib版本控制,不过二者是有区别的。

Github 一般是能够正常访问的,Bitbucket访问不稳当;

Github 提供公开库和私有库,私有库需要付费,Bitbucket同时提供公有库和私有库,均免费。

Github只支持Git,Bitbucket同时支持Git和Mercurial(Hg)

参考:http://blog.aboutc.net/linux/37/github-bitbucket-connect-via-ssh-keys

本地克隆远程仓库 bitbucket.org,一般默认是这样:

git clone https://username@bitbucket.org/username/xxx.git[/code] 
如果配置了SSH之后,且SSH连接正常,那么就可以

git clone ssh://git@bitbucket.org/username/xxxx.git


注意 :

以上的 git@bitbucket.org 或 git@ip地址 是固定的,如果是 username@bitbucket.org 那克隆不下来。

本地克隆远程仓库github.com,一般默认是这样:

git clone https://username@github.com/username/xxxx.git[/code] 
如果配置了SSH之后,且SSH连接正常,那么就可以

git clone ssh://git@github.com/username/xxxxx.git


注意:

以上的 git@github.com 或 git@ip地址 是固定的,如果是 username@github.com 那克隆不下来。

具体SSH配置步骤如下:

1. 环境win7, 安装 msysGit (windows版本的Git)

安装完成后会有Git Bash命令行工具,自带了ssh工具

2. 在开始菜单会看到有个Git Bash,打开Git Bash

会自动切换到当前用户目录下, Eg: /c/Users/xxxx

然后检测是否有 .ssh目录,初始安装git的时候是没有.ssh目录的

可以查看ssh版本

$ ssh -V
OpenSSH_6.6.1p1, OpenSSL 1.0.1m 19 Mar 2015


3. 通过 ssh-keygen 命令生成公钥和私钥

ssh-keygen -t  rsa  -f  ~/.ssh/id_rsa -C youemail@example.com


其中参数t 是密钥类型,如果没有指定则默认生成用于SSH-2的RSA密钥,这里固定是rsa, 至少github和bitbucket都是rsa;

参数f 是指定生成密钥的文件名,如果没有指定此f参数,默认文件名是id_rsa,(注意这里文件名要固定id_rsa,因为Git Bash 的ssh命令连接的时候它只去找id_rsa文件,其它的不认,本人经过验证,这不知道算不算是一个BUG)

参数C 是备注

在执行命令的时候,会提示是否需要密码

Enter passphrase (empty for no passphrase): [输入一个密码]
Enter same passphrase again: [重新输入密码]


这个密码个人理解是使用私钥文件的时候是否需要密码,这里就不需要,直接回车 就可以。

ssh-keygen 命令的具体参数说明,

可参考: /article/4173680.html

命令执行完后,会在 .ssh 目录下生成 id_rsa, id_rsa.pub 两个文件,一个是私钥文件,一个是公钥文件,私钥文件本地保管,公钥文件在bitbucket.org和github.com 服务器上有用到

4. 分别打开 github.com和bitbucket.org 用之前注册过的账号登录。

在账号设置里有个SSH KEY 相关的,Add Key ,然后将公钥文件id_rsa.pub文件里的内容复制到各自里面。

(bigbucket.org github.com可以公用一套公钥和私钥)

5. 测试连接

$ssh -T git@github.com –p 22
$ssh -T git@bitbucket.org –p 22


注意 以上必须是 git@ 而不是 username@

这时有人会问 为什么,这里我也不知道,只知道一定要这样,否则连接失败的。

参考:

http://stackoverflow.com/questions/23404204/ssh-keys-cygwin-bitbucket-permission-denied-publickey

还有 ssh 默认端口是22,github.com,bigbucket.org也是22, 所以上面的 –p可以忽略,如果是自己的git服务器那么就根据实际情况看配置的端口是多少,如果不是22,那么就需要参数 p

6. 如果出现错误: Permission denied(publickey) 可按照如下步骤检查

(步骤1): 检查生成的密钥文是否是 id_rsa , id_rsa.pub ,如果不是 请改名过来。

前面我也说过 –f ~/.ssh/id_rsa ,固定名称id_rsa, 或者不指定f,默认id_rsa,为什么要这样,我也不知道,不过我经过实际验证的确要这样。如果你不相信,可以按照下面的去试试:

Eg:

ssh-keygen -t rsa -f ~/.ssh/id_rsa_gitbitbucket -C "sshkey for git bitbucket"


然后按照别人说的新建一个config文件,在里面配置

Host gitbitbucket
HostName bitbucket.org
Port 22
User git
IdentityFile ~\.ssh\id_rsa_gitbitbucket


参考: http://dhq.me/use-ssh-config-manage-ssh-session

完了之后把 生成的id_rsa_gitbitbucket.pub 文件内容拷贝到 github.com,bitbucket.org 里面的SSH 里。

然后再执行

ssh –t git@bitbucket.org


还是会出现 Permission denied (publickey)

我就是按照网上说的配置config文件,或许你这样做不会出现错误,但本人的电脑还是出现那样的错误。为了查看原因的话,你可以在执行 ssh 命令的时候打开日志调试开关:

ssh –vT git@bitbucket.org


就会发现有这样的日志:

debug1: identity file /Users/you/.ssh/id_rsa type -1
# debug1: identity file /Users/you/.ssh/id_rsa-cert type -1
# debug1: identity file /Users/you/.ssh/id_dsa type -1
# debug1: identity file /Users/you/.ssh/id_dsa-cert type -1
.....
debug1: Next authentication method: publickey
debug1: Trying private key: /c/Users/lw.JET/.ssh/id_rsa
debug1: Trying private key: /c/Users/lw.JET/.ssh/id_dsa
debug1: Trying private key: /c/Users/lw.JET/.ssh/id_ecdsa
debug1: Trying private key: /c/Users/lw.JET/.ssh/id_ed25519
debug1: No more authentication methods to try.
Permission denied (publickey).


debug1: identity file /Users/you/.ssh/id_rsa type -1

如果是 -1 说明SSH找不到文件

所以说明Gib bash的ssh命令之后,只认id_rsa文件,在ssh-keygen -t rsa -f 的时候 文件名只能是 id_rsa, 其它的文件是无效的。

参考:

https://help.github.com/articles/error-permission-denied-publickey/

(步骤2) 如果(步骤1) 没问题,那请检查 复制到github.com 和 bitbucket.org的密钥内容是否和id_rsa.pub 文件里面的内容一样(除了 –C 的备注内容)

要确保一致

(步骤3)如果(步骤2)没问题,有的人说新生成的key没有加入ssh,会导致连接不上bitbucket

先ssh-agent,然后ssh-add ~/.ssh/id_rsa (私钥文件)

如果出现报错

Could not open a connection to your authentication agent,


那么说明Git Bash的ssh工具生成的key直接保存在ssh中了。

参考:http://blog.sina.com.cn/s/blog_83d846330101imf0.html

参考 http://www.tuicool.com/articles/3ayYRr

经过验证,Git Bash的ssh工具生成的key的时候确实将key直接保存在ssh中了。所以关键还是(步骤1) (步骤2)

通过执行

ssh -vT git@bitbucket.org


可以在日志里面看到ssh它还是去找 id_rsa文件,加上bitbucket.org和github.com 可以共用一套公钥和私钥, 所以个人认为配置 .ssh/config文件已经失去意义了,不需要配置了

如果步骤(1) (2) (3) 都检查OK的话,

执行命令

ssh -t git@bitbucket.org


如果出现这样的信息:

PTY allocation request failed on channel 0


那么也可以执行如下命令验证:

$ ssh -l git bitbucket.org
PTY allocation request failed on channel 0
logged in as xxxxx.
You can use git or hg to connect to Bitbucket. Shell access is disabled.
Connection to bitbucket.org closed.


如果出现以上信息,那说明已经ssh连接成功

剩下的就是上面开头提到的:

如果配置了SSH之后,且SSH连接正常,那么就可以

git clone ssh://git@bitbucket.org/username/xxxx.git


注意:以上的 git@bitbucket.org 或 git@ip地址 是固定的,如果是 username@bitbucket.org 那克隆不下来。

如果配置了SSH之后,且SSH连接正常,那么就可以

git clone ssh://git@github.com/username/xxxxx.git


注意:以上的 git@github.com 或 git@ip地址 是固定的,如果是 username@github.com 那克隆不下来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: