一、为什么要在 Windows 上装 OpenSSH
2014 年微软开始和 PowerShell 团队一起开发 Win32-OpenSSH,2018 年起 Win10 1809+ / Win11 默认内置。SSH 是 Linux / macOS 的标配远程协议,把 Windows 暴露成 SSH 服务端有几个常见收益:
- 从 Linux / macOS 终端直接 ssh 上去操作 Windows(比 mstsc 远程桌面更适合开发机)
- VS Code Remote - SSH 插件远程开发 Windows 上的代码
- CI / CD 工具(Jenkins / GitHub Actions)用 SSH 协议往 Windows 推文件
- PowerShell Remoting over SSH —— 把 PowerShell 会话走 SSH 隧道
OpenSSH 完全替代老旧的 telnet / rsh / WinRM HTTP 模式。Win10 1809+ 和 Win11 都内置了 OpenSSH 客户端和服务端。
二、查 OpenSSH 是否已装
| |
输出形如:
| |
Installed 表示已装,NotPresent 表示未装。
三、在线安装
| |
装完:
- 客户端:
C:\Windows\System32\OpenSSH\+ssh.exe在 PATH 中 - 服务端:
C:\Windows\System32\OpenSSH\+sshd.exe守护进程
四、离线安装
适用场景:生产 Windows Server 不能上网、企业内网无外网、Win10 老版本没有内置 OpenSSH
4.1 下载离线包
微软官方仓库:https://github.com/PowerShell/Win32-OpenSSH/releases
下载两个文件:
OpenSSH-Win64-v9.2.2.0.msi(服务端 + 客户端 + 工具)- 或
OpenSSH-Win32-v9.x.x.x.msi(32 位——老机器)
路径示例:
https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.2.2.0p1-Beta/OpenSSH-Win64-v9.2.2.0.msi
4.2 安装
双击 .msi 走 GUI 安装向导;或者静默安装:
| |
安装位置:%SYSTEMROOT%\System32\OpenSSH\(默认 C:\Windows\System32\OpenSSH\)
五、启动服务
5.1 启动 sshd
| |
5.2 验证防火墙规则
| |
应该看到一条 OpenSSH-Server-In-TCP 的入站规则,默认已 enable。
5.3 手动添加防火墙规则(如果没有)
| |
六、连接测试
6.1 从 Linux / macOS 连接
| |
或者指定端口:
| |
6.2 第一次连接的 fingerprint 确认
| |
输入 yes,公钥会保存到 ~/.ssh/known_hosts,下次不再提示。
6.3 PowerShell 验证 OpenSSH 版本
| |
输出形如:OpenSSH_for_Windows_8.0 或 OpenSSH_for_Windows_9.2p1。
七、SSH 密钥认证
强烈推荐:用公私钥对代替密码认证,安全性 + 自动化双提升。
7.1 在客户端生成密钥对
| |
ed25519 是 2014+ 推荐算法,比 RSA 短而快。公私钥生成在 ~/.ssh/id_ed25519 和 ~/.ssh/id_ed25519.pub。
7.2 把公钥传到 Windows
| |
或者手动:
| |
7.3 关闭密码认证(可选)
服务端 C:\ProgramData\ssh\sshd_config:
| |
改完重启 sshd:
| |
八、PowerShell Remoting over SSH
Win10 / Win11 + PowerShell 7+ 支持 PSRemoting over SSH:
8.1 服务端准备
| |
8.2 客户端连接
| |
进入交互式会话,跟本地 PowerShell 用法完全一样。
8.3 脚本化调用
| |
九、常见问题排查
9.1 sshd 启动失败:sshd: no hostkeys available
| |
9.2 客户端报 “Permission denied (publickey)”
- 检查
~/.ssh/authorized_keys文件权限(Windows 下用 icacls):1 2 3 4icacls "C:\Users\username\.ssh\authorized_keys" /inheritance:r icacls "C:\Users\username\.ssh\authorized_keys" /grant "username:(R)" icacls "C:\Users\username\.ssh" /inheritance:r icacls "C:\Users\username\.ssh" /grant "username:(OI)(CI)F" - 检查
sshd_config:PubkeyAuthentication yes - 看服务端日志:
Get-EventLog -LogName Application -Source OpenSSH -Newest 20
9.3 连接慢 / 卡顿
服务端 sshd_config 加:
| |
关掉反向 DNS 查询——Windows Server 经常因为 DNS 配置不当卡几十秒。
十、彻底卸载
| |
如果是 MSI 安装:
| |
卸载后
C:\ProgramData\ssh\的配置和C:\Users\<USER>\.ssh\的客户端密钥仍保留——Add-WindowsCapability重新装会复用。
十一、SSH 客户端常用命令(Win11 自带)
| |
11.1 VS Code Remote - SSH
VS Code 装 Remote - SSH 扩展后,Ctrl+Shift+P → “Remote-SSH: Connect to Host” 就能连到 Windows 远程开发。
11.2 scp 跨机传文件
| |
十二、Win10 / Win11 自带 OpenSSH 局限性
- 没有完整 sftp-server:Win10 1809+ 的 OpenSSH 支持 SFTP 子系统,但 2018-2020 期间有 bug,2021+ 才稳定
- 没有 ssh-agent 转发:默认不启用
- 没有 ControlMaster / ControlPersist:多窗口复用得手动
- 不支持 AuthorizedKeysCommand:大集群的集中密钥分发得自己写脚本
如果对 SSH 有重度需求(如集群管理、跳板机、堡垒机),用 WSL2 装 OpenSSH 服务端更稳:
| |
十三、常见 5 个坑
UseDNS yes卡顿——改sshd_config设为no- authorized_keys 权限错误——Windows 下用
icacls而非 Linux 风格的chmod 600 - PowerShell Remoting 默认走 WinRM——加
-SSHTransport参数才走 SSH - MSI 装的服务端和 PowerShell 装的不冲突——优先用
Add-WindowsCapability装,MSI 是离线备用方案 - OpenSSH 服务端绑 0.0.0.0——默认所有网卡都监听,生产环境改
ListenAddress 192.168.x.x限内网
十四、总结
- Win10 1809+ / Win11 自带——
Add-WindowsCapability一行装 - 离线安装用
OpenSSH-Win64-9.x.x.x.msi - sshd 自动启动 + 防火墙默认开启 22 端口——一行命令搞定
- 强烈推荐 SSH 公私钥认证,关密码
- PSRemoting over SSH——PowerShell 7 + 跨平台远管
- 服务端局限:SFTP bug 修复在 2021+,复杂需求用 WSL2 的 openssh-server
