服务器上的 Git - 生成 SSH 公钥以及多个用户使用同一台电脑生成多个 SSH 密钥
SSH Key 是一种方法来确定受信任的计算机,从而实现免密码登录。Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置。
生成 SSH 公钥
大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。 首先先确认一下是否已经有一个公钥了。SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。进去看看:
1 | ➜ ~ cd .ssh |
关键是看有没有用 something 和 something.pub 来命名的一对文件,这个 something 通常就是 id_dsa 或 id_rsa。有 .pub 后缀的文件就是公钥,另一个文件则是密钥。假如没有这些文件,或者干脆连 .ssh 目录都没有,可以用 ssh-keygen 来创建。该程序在 Linux/Mac 系统上由 SSH 包提供,而在 Windows 上则包含在 MSysGit 包里:
1 | ➜ .ssh ssh-keygen |
首先确保在终端里面已经进入 .ssh 目录下,然后执行命令 ssh-keygen,它先要求你确认保存公钥的位置(.ssh/id_rsa),然后它会让你重复一个密码两次,如果不想在使用公钥的时候输入密码,可以留空,回车进行下一步,知道最后生成 RSA。
现在,所有做过这一步的用户都得把它们的公钥给你或者 Git 服务器的管理员(假设 SSH 服务被设定为使用公钥机制)。他们只需要复制 .pub 文件的内容然后发邮件给管理员。
公钥的样子大致如下:
1 | ➜ .ssh cat id_rsa.pub |
关于在多个操作系统上设立相同 SSH 公钥的教程,大家可以查阅 GitHub 上有关 SSH 公钥的向导:http://github.com/guides/providing-your-ssh-key
2019.3.6 更新
遇到一个问题想在自己另一台电脑上用另一个 git 账号 使用代码仓库对代码进行管理,发现 ssh 权限存在一些问题,然后就各种尝试,查看官方文档尝试配置,但是还是有些问题。最后看了 这位老哥 的配置,才弄明白,在此记录一下。
如果你已经有了一套名为 id_rsa 的公秘钥,将要生成另外一个公钥,比如 aysee ,你也可以使用任何你喜欢的名字。
大致步骤如下:
生成一个新的自定义名称的公钥:
1 | ssh-keygen -t rsa -C "YOUR_EMAIL@YOUREMAIL.COM" -f ~/.ssh/aysee |
执行命令后,生成命名的公钥和生成默认公钥的步骤一样。
执行完成后,会在 ~/.ssh/目录下生成一个 aysee 和 aysee.pub 文件。
在 SSH 用户配置文件 ~/.ssh/config 中指定对应服务所使用的公秘钥名称,如果没有 config 文件的话就新建一个,并输入以下内容:
1 | Host github.com www.github.com |
添加 aysee.pub 到你的 git/github 服务器网站上
测试配置文件是否正常工作
1 | ssh -T git@gitcafe.com |
如果,正常的话,会出现如下提示:
1 | Hi USERNAME! You've successfully authenticated, but github does not provide shell access. |
如果出现如下提示,则说明有权限问题:
1 | Permission denied (publickey) |
如果有权限问题的情况下,你对项目执行push操作的时候,会得到如下提示:
1 | Warning: Permanently added the RSA host key for IP address '192.30.252.129' to the list of known hosts. |
多用户时出现权限问题的原因:
github使用SSH与客户端连接。如果是单用户(first),生成密钥对后,将公钥保存至 GitHub ,每次连接时SSH客户端发送本地私钥(默认~/.ssh/id_rsa)到服务端验证。单用户情况下,连接的服务器上保存的公钥和发送的私钥自然是配对的。但是如果是 多用户 (first,second),我们在连接到second的帐号时,second保存的是自己的公钥,但是SSH客户端依然发送默认私钥,即first的私钥,那么这个验证自然无法通过。
解决ssh权限问题():
通常一台电脑生成一个ssh不会有这个问题,当一台电脑生成多个ssh的时候,就可能遇到这个问题,解决步骤如下:
查看系统ssh-key代理,执行如下命令
1 | $ ssh-add -l |
以上命令如果输出 The agent has no identities. 则表示没有代理。如果系统有代理,可以执行下面的命令清除代理:
1 | $ ssh-add -D |
然后依次将不同的ssh添加代理,执行命令如下:
1 | $ ssh-add ~/.ssh/id_rsa |
你会分别得到如下提示:
1 | 2048 8e:71:ad:88:78:80:b2:d9:e1:2d:1d:e4:be:6b:db:8e /Users/aysee/.ssh/id_rsa (RSA) |
和
1 | 2048 8e:71:ad:88:78:80:b2:d9:e1:2d:1d:e4:be:6b:db:8e /Users/aysee/.ssh/id_rsa (RSA) |
如果使用 ssh-add ~/.ssh/id_rsa的时候报如下错误,则需要先运行一下 ssh-agent bash 命令后再执行 ssh-add …等命令
1 | Could not open a connection to your authentication agent. |
配置 /.ssh/config 文件/.ssh目录创建config文件,该文件用于配置私钥对应的服务器
如果没有就在
1 | #Default github user(first@mail.com) |
Host随意即可,方便自己记忆,后续在添加remote是还需要用到。 配置完成后,在连接非默认帐号的github仓库时,远程库的地址要对应地做一些修改,比如现在添加second帐号下的一个仓库test,则需要这样添加:
1 | git remote add test git@github-aysee:ay-seeing/test.git |
ay-seeing 是github的用户名
测试 ssh
1 | ssh -T git@github.com |
你会得到如下提示,表示这个ssh公钥已经获得了权限
1 | Hi USERNAME! You've successfully authenticated, but github does not provide shell access. |
上一张我操作的图