openssh on windows

于 2023-08-26 发布 , 于 2023-08-26 更新

想要在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

目录