想要在Windows和Mac上都能顺畅地写博客,就得熟练地使用ssh。之前不喜欢用Windows开发,一方面是Windows确实有各种各样的阻碍(特别是char encoding相关的问题);另一方面就是Windows不能像MacOS和Linux那样登录就自动解锁ssh key,每次都要输入密码,就很烦。
但是我寻思,堂堂Windows会这么垃圾?于是不死心,今天又进行了一次摸索,结果还真搞定了。
Windows自己的文档只教了怎么生成key和把key添加到keychain里——实际上存储ssh key的东西名字叫ssh-agent——剩余的“怎么让git使用ssh-agent”和“怎么配置ssh_config”倒是没有交代。
生成
官方文档 User Key Generation 这一节教的就是生成并添加key进ssh-agent。其实这一步跟其他平台上用openssh是一致的:
1
ssh-keygen -t ed25519
根据提示先输入private key的存储路径,然后设置private key的密码(输两次),就会生成一对ssh key了。
在用户目录下的.ssh文件夹里现在应该有这样的两个文件(可能名字不同):
C:\Users\username\.ssh/
`-- example
`-- example.pub
ssh-agent
生成了key之后,就需要把它添加进ssh-agent,来实现以后自动解锁、不需要输密码的目的。关于ssh-agent存储private key的安全性,官方文档是这样说的:
Use ssh-agent to securely store the private keys within a Windows security context, associated with your Windows account.
Microsoft - https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
首先根据文档,启动ssh-agent服务,这些命令需要在管理员权限的Powershell下运行:
1
2
3
4
5
6
7
8
# 这个服务在 计算机管理-服务 里面的显示名字是OpenSSH Authentication Agent
# 服务名称则是 ssh-agent
# 设置ssh-agent服务启动类型为“自动”
Get-Service ssh-agent | Set-Service -StartupType Automatic
# 启动服务
Start-Service ssh-agent
# 查看服务运行状态,正确的结果应该是Running
Get-Service ssh-agent
然后就可以添加key了:ssh-add $env:USERPROFILE\.ssh\example
,系统会要求输入private key的密码,输对了的话就会回显一行 Identity added: key的完整路径(备注)
。
配置git使用windows这套机制
根据Chris Hastie - Setting up SSH-Agent in Windows for Passwordless Git Authentication,是这么一行命令:
1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe
这条命令配置的是git调用的ssh程序,设置成Windows自带的openssh才能使用内置的ssh-agent功能。
.ssh/config
在其他平台上能够用.ssh/config
文件根据连接的Host不同进行相应的配置,其实Windows也可以。比如对github.com配置用户名、端口、认证文件和代理:
1
2
3
4
5
6
Host github.com
ProxyCommand connect -H 127.0.0.1:8080 %h %p
user git
Port 22
Hostname github.com
IdentityFile ~/.ssh/git_ssh