如何解决git ssh key不更新的问题

我们在使用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: 这问题看了半天差点就要通过重启电脑解决了?,但似乎重启电脑用的时间比自己找问题的时间要短?。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYKnJVHc' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片