WXL's blog

Talk is cheap, show me your work.

0%

一台主机生成多个ssh_key,无冲突提交代码至远程仓库

我的情况

我之前创建了一个github账号wangxl12,当时也按照教程生成了ssh key,并且将公钥放在了github中保存了。现在我又创建了一个github账号wxltop,并新建了一个仓库,我想将仓库clone到本地,编辑之后上传代码。但是,我遇到了如下的问题:

  • 在没有向wxltop账号里存放ssh key的情况下,使用ssh协议克隆可以成功?
  • 克隆成功之后,进行修改代码,然后上传,即git push -u origin main报错,说用户wangxl12没有权限,为什么可以克隆但是不能上传?为什么用户是wangxl12?我没有显示指定呀?

我的系统是windows 10,下面解决这个问题。

解决问题

  1. 打开Git Bush,然后输入如下指令重新生成一个ssh key(注意new_id_rsa可以换成你喜欢的名字):

    1
    ssh-keygen -t rsa -C 'xxxxx@youremail.com' -f ~/.ssh/new_id_rsa

    切换到C:\Users\name\.ssh(注意将name换成自己的windows用户名)目录下,可以发现新增了如下2个文件:

    1
    2
    new_id_rsa
    new_id_rsa.pub
  2. 查看系统ssh-key代理,执行如下命令:

    1
    ssh-add -l

    如果报错Could not open a connection to your authentication agent.则需要先执行以下如下的指令:

    1
    ssh-agent bash

    重新执行:

    1
    ssh-add -l

    以上命令如果输出 The agent has no identities. 则表示没有代理。如果系统有代理,可以执行下面的命令清除代理:

    1
    ssh-add -D
  3. 然后依次将不同的ssh添加代理,执行命令如下:

    1
    2
    ssh-add ~/.ssh/id_rsa
    ssh-add ~/.ssh/new_id_rsa
  4. 配置~/.ssh/config文件:

    为什么之前不配置也可以呢?因为之前只有一个ssh key,github使用SSH与客户端连接。如果是单用户(first),生成密钥对后,将公钥保存至 GitHub ,每次连接时SSH客户端发送本地私钥(默认~/.ssh/id_rsa)到服务端验证。单用户情况下,连接的服务器上保存的公钥和发送的私钥自然是配对的。但是如果是 多用户 (first,second),我们在连接到second的帐号时,second保存的是自己的公钥,但是SSH客户端依然发送默认私钥,即first的私钥,那么这个验证自然无法通过。

    创建一个config文件,然后添加如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Default github user(first@mail.com)
    Host github.com
    HostName github.com
    User git
    IdentityFile C:/Users/username/.ssh/id_rsa

    # new account (second_email@mail.com)
    Host github-new
    HostName github.com
    User git
    IdentityFile C:/Users/username/.ssh/new_id_rsa

    其中参数含义如下:

    Host : 相当于一个别名,远程仓库地址的域名别名它涵盖了下面一个段的配置,我们可以通过他来替代将要连接的服务器地址。这里可以使用任意字段或通配符。访问ssh的时候如果服务器地址能匹配上这里Host指定的值,则Host下面指定的HostName将被作为最终的服务器地址使用,并且将使用该Host字段下面配置的所有自定义配置来覆盖默认的~/.ssh/config配置信息。

    HostName :真正连接的服务器地址

    User:自定义的用户名 (直接用git就行)

    PreferredAuthentications :指定优先使用哪种方式验证,支持密码和秘钥验证方式

    IdentityFile:指定本次连接使用的密钥文件

    在连接非默认账号的github仓库时,远程库的地址要对应的做一些修改,比如现在添加second账号下的一个仓库,则需要这样添加:

    1
    git remote add wxltop git@github-new:wxltop/wxltop.git

    如果是下面这样的话就会添加默认账号下的仓库:

    1
    git remote add wxltop git@github.com:wxltop/wxltop.git

    从这里我们看出,一开始就算没有将第二个账号的秘钥生成并放入GitHub中,我们直接clone下来是可以成功的,因为我们默认用的是第一个账户:

    1
    2
    # 这里的github.com对应的就是config文件中的Host github.com
    git clone git@github.com:wxltop/wxltop.git

    如果我们要用第二个账号的秘钥克隆,就需要修改为下面这样,当然需要提前将new_id_rsa中的内容放入github中,添加新的ssh key。

    1
    2
    # 这里的github-new对应的就是config文件中的Host github-new
    git clone git@github-new:wxltop/wxltop.git

    这样就是基于第二个账号下载过来的。克隆过来了之后弄几个配置(特别是用户名和邮箱,必须配置,不然提交修改之后去github查看还是默认用户提交的修改):

    1. 配置用户名:git config -global user.name "xxx",将xxx替换为你想设置的用户名。
    2. 配置邮箱:git config -global user.email "xxx",将xxx替换为邮箱
    3. 配置大小写敏感:git config -global core.ignorecase false,直接输入这个指令即可。
    4. 查看配置信息:git config --list

    这里的用户名和邮箱建议和第二个账号的用户名和邮箱一致,我原本以为这个并不影响,所以一开始克隆过来之后没有配置,但是后面的代码修改在GitHub上查看都是以第一个账号为名义修改的,查了很多教程都无法解决这个问题。然后抱着尝试的心态将用户名和邮箱改成第二个账号的用户名和邮箱之后,重新修改代码、提交代码,在GitHub上查看是以第二个账号为名义修改的。

  5. 测试ssh

    测试第一个账号:

    1
    ssh -T git@github.com
    1
    Hi wangxl12! You've successfully authenticated, but GitHub does not provide shell access.

    测试第二个账号:

    1
    ssh -T git@github-new
    1
    Hi github-new! You've successfully authenticated, but GitHub does not provide shell access.
  6. 修改代码并上传

    经过add、commit可以push一下:

    1
    git push -u origin main
  7. 有一个问题

    比如我刚刚打开一个Git Bash shell之后,将上述步骤都走了一遍,然后关掉了当前的Git Bash shell(会提示当前有一个进程正在进行,是否继续关掉),等到下一次打开Git Bash shell的时候,需要重新执行一下ssh-agent bash,然后再次测试一下看看是否连接成功:ssh -T git@wxltop,连接成功之后才可以确认是在wxltop账号下。

Reference

https://www.cnblogs.com/ayseeing/p/4445194.html

https://www.zhihu.com/people/wxl-59-25

http://167.86.101.119/lV5mrUYsucU/how-to-fix-github-permission-denied-publickey-fatal-could-not-read-from-remote-repository

补充

不知道为什么前段时间还可以用的,但是最近突然使用git push的时候报错:

我猜想可能是我把GitHub上的ssh删掉了?重新将本地的id_rsa.pub内容粘贴过去但是报错:

随后参考了这篇博客:

git Key is already in use

将如下指令输入但是无效:

1
ssh -T -ai ~/.ssh/id_rsa git@github.com

最后是通过参考这篇博客解决的:

[解决]git-ssh: connect to host github.com port 22: Connection timed out

即先测试可用性:

1
ssh -T -p 443 git@ssh.github.com

发现可以用,所以打开~/.ssh/config文件,将里面的两个用户的HostName改成:ssh.github.com之前是github.com),然后添加一个字段:Port 443,再次测试就可以了:

测试第一个账号:

1
ssh -T git@github.com
1
Hi wangxl12! You've successfully authenticated, but GitHub does not provide shell access.

测试第二个账号:

1
ssh -T git@github-new
1
Hi github-new! You've successfully authenticated, but GitHub does not provide shell access.
行行好,赏一杯咖啡吧~