目录
- 问题描述
- 尝试过的失败方法
- 问题分析
- 最终采用的解决方案:利用 ssh key 提供密码免输入功能
- 安装 git windows 命令工具
- 在windows本地生成 ssh key
- 将公钥安装到 git 服务器
- 第一种方法
- 第二种方法
- 调试方法
- 参考资料:
问题描述
在 Windows 上,使用 Visual Studio Code 开发 typescript 项目,提交 git 代码总是会要求输入密码。
希望能像 IDEA 那样让 git 记住密码,不要每次都重新输入。
尝试过的失败方法
- 网上有人说可以用
git config --global credential.helper store
,但测试了不行,因为我的 git 服务是 ssh 协议。 - 企图使用
ssh-agent
来解决问题,但其实可以不用 ssh-agent 参与也能解决问题。因为 ssh-agent 只是帮助提供 ssh key 的passphrase
。
什么是ssh-agent
、ssh key
以及passphrase
,请看这里。简单解释就是ssh key
指的是‘非对称加密算法’中的一对字符串,一般比较长所以存放在文件中,分为私钥(private key)和公钥(public key),用公钥加密、私钥解密。要使用这个私钥(private key)时,为了安全起见,会再加一个简短的密码,要求用户手工输入,这个简短的密码就叫做passphrase (口令)
。 - 查找 VSCode 的 git 插件,企图让 VSCode 像 IDEA 那样记住 git 密码,但没有找到可用的插件。
问题分析
有一个很重要的考虑因素是你的 git 服务所提供的访问协议。常见的 git 服务协议大体有以下几类:
- ssh 协议
- git 协议
- https 协议
- git 管理系统,如 github、gitlab 等。
因为 ssh 协议简单,所以我目前采用的是这种协议,如果你的协议不是 ssh,那么下面的解决方案就只能提供参考了,不一定对症。
最终采用的解决方案:利用 ssh key 提供密码免输入功能
如果 git 的协议是 ssh,那么需要用 ssh key
方式访问 git 服务器,这样就可以避免每次提交/拉取时输入密码了,具体方法如下。
安装 git windows 命令工具
从这里下载并安装好 git windows 命令工具。git 命令行工具是一组命令程序的集合,而不只是一个简单的 exe 文件。包括 git.exe、ssh-add.exe 等 git 和 ssh 相关工具。
在windows本地生成 ssh key
生成的命令是:
ssh-keygen -o
-o
参数表示使用新的秘钥格式,而不是旧格式,更安全些。它会生成 rsa 私钥/公钥 对。
秘钥路径不要修改,就放在默认路径下,即c:\Users\[用户名]\.ssh\
中。
成功后,会看到下面2个文件:
将公钥安装到 git 服务器
这一步是将你的公钥注册到 git 服务器,以便 git 服务器允许你连接、访问,通常问题就出现在这一步。
有两种方法实现公钥注册
工作。
不管哪种方法,核心都是将公钥文件的内容复制、写入到服务器上 git 用户的一个文件中。
假设 Linux 服务器上,git程序的用户名是 gits,那么这个文件的路径就是 /home/gits/.ssh/authorized_keys
。
内容是一个公钥占一行,像下面这样:
公钥1
公钥2
只要将公钥内容放入这个指定文件,并设置好目录 .ssh/ 和文件 authorized_keys 的权限,最好设置为 600
、700
,不需要重启 sshd 等任何额外操作,就能生效了。如果有问题,也是其他问题,和 sshd 服务基本没有关系。
下面介绍两种注册公钥到git服务器的方法。
第一种方法
使用ssh-copy-id
命令。
ssh-copy-id gits@gits.yourdomain.com
这里的 gits 是用户名,服务器域名是 gits.yourdomain.com
。替换成你实际的用户名和域名即可,注意是能用ssh登录服务器的git系统用户名,不是所谓 git 管理系统的用户名。
然后输入gits用户的密码,程序会自动将当前windows本地用户的公钥写入到服务器的 authorized_keys
文件中。但这种方法只会写入 rsa 公钥,如果你还有其他公钥,它是不会写入的,需要你自己手工写入,这点需要注意。我也是在这里折腾了很长时间。
第二种方法
手工复制公钥文件的内容,然后登录 git 服务器,修改 /home/gits/.ssh/authorized_keys
文件,粘贴进公钥内容即可。
注意有多个公钥文件(.pub)文件时,要全部写入,如果有遗漏那么可能登录失败,因为 ssh 可能用的就是你遗漏的那个公钥。我就是在这里折腾了很久,最后发现 git 使用的是 id_ed25519.pub 而不是新版的 rsa.pub 公钥。
调试方法
按照上面的步骤配置后,如果用 git pull
等命令时还是要求输入密码,那么可以用 xshell 等工具进行除错,查找问题原因。
方法是先确保用 ssh 可以无密码登录、连接 git 服务器。如果能达成这一步,那么就没问题了。
并且要注意,有多个公钥,那么多个公钥都需要测试成功,因为 git 指不定使用哪个公钥。
添加ssh key访问 git 服务器的 xshell 配置如下。
参考资料:
- ssh-agent 文档 清晰明了地解释了
ssh-agent
的作用,可以一读。 - ssh agent详解,知乎文章,没点出 ssh-agent 的作用主要是管理 passphrase,不是必须的。
- vscode 中用 ssh 协议访问 git,使用 ssh key 方式访问 git 服务的方法,但讲得不够清楚。
- 用ssh访问git,git 官方文档,讲得过于简单。
- ssh-copy-id 文档