Windows 10 1709之后,系统中默认会安装OpenSSH客户端,并且加入了环境变量:
才更新的时候,导致了Git工作不正常,即每次拉取都需要输入SSH Key的passphrase。按照以往的习惯和教程,都会在Shell(Bash、PowerShell)启动的时候,运行一下ssh-agent,并手动输入一次passphrase即可。而更新后,由于环境变量的缘故,git运行的是C:\Windows\System32\OpenSSH中的ssh,不知道什么原因找不到Shell启动的ssh-agent,导致每次都需要输入passphrase。
解决方法就是让git使用系统自带的OpenSSH,并且设置OpenSSH的服务为自启动。
Git修改~/.gitconfig文件,设置sshCommand:
[core] sshCommand = \"C:/Windows/System32/OpenSSH/ssh.exe\"
并且,配置ssh-agent服务为自启动,默认情况下该服务被禁用:
之后,通过ssh-add将远程仓库的key添加至ssh-agent,并输入passphrase即可。好处是passphrase只需要输入一次,Windows会使用DPAPI将passphrase保存至注册表,坏处是当机器沦陷后,可以将passphrase读出,参考[2]。
Tips:
- 如果删除了已添加的SSH Key,需要运行ssh-add -D删除全部SSH Key,再重新添加新的SSH Key,否则ssh-agent会因为找不到之前的文件而终止添加新的SSH Key
- SourceTree依然会使用git for Windows自带的ssh,并且无法设置SSH路径。Issue已经提交,但目前没有更新。
参考
- Installation of OpenSSH For Windows Server 2019 and Windows 10, https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse
- Extracting SSH Private Keys from Windows 10 ssh-agent, https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/