我们在使用git拉代码的时候通常用的是ssh的方式,即本地在~/.ssh
下生成密钥对,把公钥传到git服务器上,就可以了。这里主要介绍下当需要切换到另一个账号的key的时候,其他都不变的情况下本地如何更新key。
最近就碰到了需要生成并把本地pull/push代码时用新账号的key,但是遇到了命令行里一直在使用老的key去服务器验证的情况,导致代码拉不下来。先来看下如何失败:
失败的情况及问题所在
最初以为在.ssh
目录下用ssh-keygen
生成个新的key,换个其他文件名,然后在.ssh/config
里相同Host下IdentityFile
换成新的key的文件名就OK了,但是重新拉的时候还是提示无权限,用以下命令验证返回的还是老的用户命名:
ssh -T git@git.xxx.com
# Welcome to xxx, 老的用户名!
已上显示的用户名还是老的,说明发起验证的时候还是用的老的key,继续debug,使用以下命令查看ssh-agent里的key:
ssh-add -l
# 类似以下的输出
# 4096 SHA256:cCUa.../xxx/...tdA key-1 (RSA)
# 256 SHA256:xjsl...jfAE key-2 (ED25519)
列出来的key里没有我新加的,说明我新加的key,哪怕config文件里更新了,但是它实际上还是用的内存里的老的key。
通过查询相关资料,发现每个命令行session(相当于iTerm里的每个tab)都有运行独立的ssh-agent,如果这个session一直开着,并且之前已经有老的key加入,哪怕更新了config文件,后续还是使用内存里已存在的key
,所以导致一直验证失败。
ssh key 更新的解决方案
自己尝试了一些方法,大概有以下几种方式更新ssh key:
1. 手动删除ssh-agent里的key
通过以下命令可以删除当前命令行session里的agent里的key, 删除后再重新添加新的key, 或者如果config
文件里配了AddKeysToAgent yes
的话,直接拉代码会自动加进去:
# 删除老的key
ssh-add -d ~/.ssh/id_rsa
# 打出
# Identity removed: ./id_rsa RSA
# 手动加新key
ssh-add ~/.ssh/id_rsa_new
# 或者全部删掉, 大写D
ssh-add -D
2. 重启ssh-agent
如果不想手动删的话,可以直接关掉当前session的agent, 再重开就可以了:
eval "$(ssh-agent -s)"
# Agent pid 20654
# 然后杀进程
kill -9 20654
# 启动agent
eval `ssh-agent -s`
我发现好像也不用杀进程,直接调启动agent的命令,就变成新的agent了?
上面2种方式只能更新当前用的session, 如果你开了很多个tab,其他tab如果之前拉过代码,还是不会自动更新,以下就是简单粗暴的方法:
杀掉所有agent进程
# kill所有agent, 再启动新的agent
killall ssh-agent; eval `ssh-agent`
这样一来,其他tab拉代码也会用新的key了?。应该还有更优雅的方式,了解的大佬们可以分享下?!
BTW: 这问题看了半天差点就要通过重启电脑解决了?,但似乎重启电脑用的时间比自己找问题的时间要短?。