Windows 系统内置 OpenSSH 之后,搭建 SFTP 服务不必再依赖 FTP 软件或额外的 Linux 虚拟机。OpenSSH 服务端通过 SSH 加密通道提供文件传输能力,默认支持 SFTP 子系统,客户端使用 WinSCP、FileZilla 或命令行 sftp 即可连接。安装过程主要涉及可选功能添加、sshd 服务启动、防火墙放行以及配置文件调整,本文将按步骤说明。

安装前需要区分的组件与系统版本
在 Windows 上安装 OpenSSH 前,需要先分清 OpenSSH Server 与 OpenSSH Client 两个可选功能。OpenSSH Client 用于从本机发起 SSH 或 SFTP 连接,例如执行 ssh user@host 命令;OpenSSH Server 才是真正监听 22 端口、对外提供 SSH 和 SFTP 服务的组件。如果只是想让别人通过 SFTP 上传下载文件,必须安装 OpenSSH Server,仅安装 Client 无法启动 sshd 服务,这也是实际操作中常见的误区。
系统版本方面,Windows 10 1809 及以上、Windows Server 2019 及以上都已经内置 OpenSSH 可选功能。可以在“设置”的“应用”页面中查看,也可以执行 PowerShell 命令查询当前系统是否已安装。安装前建议确认当前用户具有管理员权限,因为添加可选功能、启动服务以及修改 C:\ProgramData\ssh\sshd_config 都需要管理员或 SYSTEM 权限。另外,如果之前手动解压过 OpenSSH 可移植版本,应避免与内置组件混用,以免出现服务路径冲突。
安装完成后,OpenSSH 的服务端程序位于 C:\Windows\System32\OpenSSH 目录,主要文件包括 sshd.exe、sftp-server.exe 和 ssh.exe。sshd.exe 是主服务进程,sftp-server.exe 是默认的 SFTP 子系统程序。了解这些路径有助于后续排查服务启动失败或配置文件加载问题。
通过设置界面或 PowerShell 安装 OpenSSH Server
图形安装适合不熟悉命令的用户。打开“设置”,进入“应用”和“可选功能”,点击“添加功能”,在搜索框中输入 OpenSSH,然后勾选“OpenSSH 服务器”并点击安装。等待进度条结束后,系统会自动把 sshd 服务注册为 Windows 服务。如果列表中没有 OpenSSH 服务器,先检查系统更新,因为较旧的 1803 或 1709 版本可能不提供该可选功能。
PowerShell 安装更便于批量部署和脚本化操作。以管理员身份运行 PowerShell,执行以下命令可以查看当前 OpenSSH 状态:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
输出中 State 为 Installed 表示已安装,NotPresent 表示未安装。如果确认未安装,执行下面的命令添加 OpenSSH 服务端:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
这条命令会从 Windows 更新源下载并安装 OpenSSH Server。安装完成后再次查询状态,应显示 Installed。整个过程中不需要手动下载安装包,也不需要设置环境变量。若公司网络禁止访问 Windows 更新,可以通过离线包部署,但建议优先使用系统自带的可选功能,便于后续更新。
某些精简版系统或长期未更新的环境可能在执行 Add-WindowsCapability 时报错,此时可先运行 sfc /scannow 修复系统组件,或安装最新累积更新后再试。安装成功后,sshd 服务默认处于停止状态,需要手动启动。
启动 sshd 服务并放行防火墙端口
OpenSSH Server 安装完成后,服务并不会自动运行。可以在“服务”管理器中找到 OpenSSH SSH Server,将其启动类型改为“自动”,然后点击启动。也可以使用 PowerShell 完成同样操作,命令如下:
Set-Service sshd -StartupType Automatic Start-Service sshd
执行后可以通过 Get-Service sshd 查看状态,Running 表示服务已在监听 22 端口。若启动失败,常见原因是配置文件语法错误或 22 端口被其他程序占用。可以运行 netstat -ano | findstr :22 确认端口占用情况,也可以查看 C:\ProgramData\ssh\logs\sshd.log 日志文件获取具体错误信息。
Windows 防火墙默认不会放行 22 端口,必须手动添加入站规则。管理员 PowerShell 执行:
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
这条规则允许外部主机通过 TCP 22 端口访问本机 SSH 服务。如果公司安全策略要求限制来源 IP,可以在命令中追加 -RemoteAddress 参数,例如 -RemoteAddress 192.168.1.0/24。放行端口后,同一局域网内的其他机器就能使用 SFTP 客户端连接。注意不要同时开放不必要的端口,SSH 服务只监听 22 即可满足 SFTP 需求。
调整 sshd_config 配置 SFTP 目录与认证方式
OpenSSH 的配置文件位于 C:\ProgramData\ssh\sshd_config。使用记事本以管理员身份打开该文件,可以看到默认的 Subsystem sftp 配置。Windows 版通常写为:
Subsystem sftp sftp-server.exe
这意味着客户端连接后启动 sftp-server.exe 处理文件传输。默认情况下,用户登录后根目录是自己的用户目录,例如 C:\Users\用户名。如果想限制用户只能访问某个指定目录,可以使用 ChrootDirectory 参数,但 Windows OpenSSH 的目录隔离与 Linux 不同,需要确保目标目录及其上级目录的 ACL 不允许用户写入上级目录。简单做法是保持默认用户目录,再通过 Windows 权限控制文件访问范围。
认证方面,sshd_config 中的 PasswordAuthentication 默认允许密码登录,适合内网快速验证。如果需要更高的安全性,可以生成密钥对并配置公钥认证。修改配置后必须重启 sshd 才会生效,命令为 Restart-Service sshd。修改配置前建议备份原文件,避免误改导致服务无法启动。
PasswordAuthentication yes PubkeyAuthentication yes
此外,Windows OpenSSH 对 Administrators 组有特殊处理:默认只有 administrators_authorized_keys 文件生效,普通用户则使用 .ssh\authorized_keys。若发现公钥登录失败,优先检查用户目录下的 .ssh 文件夹权限以及 authorized_keys 文件编码,必须是 UTF-8 无 BOM。
使用 SFTP 客户端连接验证与常见故障排查
服务启动并放行端口后,可以在同一台机器上用命令行先做本地测试。执行 sftp username@127.0.0.1,输入密码后如果出现 sftp 提示符,说明 SFTP 子系统工作正常。也可以使用 WinSCP 或 FileZilla,协议选择 SFTP,主机名填服务器 IP,端口填 22,用户名和密码与 Windows 账户一致。连接成功后即可浏览用户目录并上传下载文件。
常见的连接失败原因包括:sshd 服务未启动、防火墙未放行 22 端口、配置文件语法错误、账户密码策略导致认证失败。排查顺序建议先确认本机 22 端口监听状态,再检查防火墙规则,最后查看 C:\ProgramData\ssh\logs\sshd.log。日志中通常会记录认证失败的具体原因,例如 invalid user、password authentication failed 等,根据提示调整账户或配置即可。
如果企业网络中有组策略限制,可能会导致防火墙规则被覆盖或服务被禁用。此时需要联系域管理员将 OpenSSH SSH Server 加入允许列表。完成以上步骤后,Windows 主机就可以作为稳定的 SFTP 服务器使用,无需安装第三方 FTP 服务,也避免了明文传输密码的风险。