生成

1
ssh-keygen -t rsa -C 'youremail@example.com'

一般默认回车确认就可以了,如果对秘钥保存不放心,那就设置个密码,每次Git客户端使用该秘钥的时候都要求输入密码才行。.pub是公钥,不带后缀的是私钥,两个文件尤其是私钥自己妥善保存。

部署

秘钥本地生成后上传到服务器也行,如果ssh登录一直出现需要密码,或者复制的密钥总是不对,可能是权限不对,那试试下面的方法,也推荐直接用命令拷贝,不必处理权限和文件名的的问题

1
ssh-copy-id -i ~/.ssh/id_rsa.pub 'username@githost' -p 'ssh端口'

测试

使用文本编辑器打开将公钥文件,将里面所有的内容复制【喜欢操作命令直接用clip < ~/.ssh/id_rsa.pub也行】,添加到Git账号或者项目部署公钥中,然后用以下命令测试:

1
ssh -Tv 'username@githost' -p 'ssh端口'  #测试ssh连接是否成功

其中-v是输出详细的调试信息,其他具体参数可见ssh帮助说明。如果如下显示信息则表示该秘钥部署正确。

1
2
Coding 提示: Hello xxx, You've connected to Coding.net via SSH. This is a personal key.
xxx,你好,你已经通过 SSH 协议认证 Coding.net 服务,这是一个个人公钥

多账户多秘钥问题

如果是不同平台,如GitHub和coding,那么你就生成一个公钥,分别添加到GitHub和coding平台上直接使用即可,生成不同的秘钥分别部署也行,他们并没有什么冲突。

这里要讲的是同一个平台不同账号,如在coding上自己有两个账号,同时在一个机器上使用。由于是同一个平台,添加同一个公钥的时候会提示该公钥已存在,此时你肯定想着新生成一个,可这样你会发现只会认到默认的,或者有A无B,有B无A。

如果希望两个公钥同时使用,还不出现 Permission Denied,那么还需要做如下改造:

  1. 编辑配置文件 ~/.ssh/config ,没有就新建:touch ~/.ssh/config
  2. 加入如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
# 第一个秘钥
Host user1.git.coding.net //别名1,这个别名一会儿推送要用到
HostName git.coding.net
User user1
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa

# 第二个秘钥
Host user2 //别名2,别名可以是任意字符串
HostName git.coding.net
User user2
PreferredAuthentications publickey
IdentityFile ~/.ssh/z_rsa

以上配置保存后,此时默认还是使用的默认的秘钥,非默认秘钥那个账户的仓库去操作的时候仍会出现 You have no permission to access this repo,要让你的仓库使用对应的秘钥,你需要将仓库地址用别名代替,如:

有个仓库地址,官方ssh地址是:

1
git@git.coding.net:xxx/yyy.git

我们用别名2代替后为:

1
git@user2:xxx/yyy.git

这里关键是用别名地址,这个坑反反复复试了n回!!!此时就能用上指定的秘钥推送或者拉取了。

参考文档

同一客户端下使用多个git账号

多 SSH Key 管理技巧与 Git 多账户登录问题

在一台电脑上使用两个Github账号