最近好几个朋友都来问我同一个问题公司服务器是 Windows Server或者自己笔记本是 Windows 11但合作方非要走 SFTP 传文件不想装乱七八糟的第三方 FTP 软件能不能直接用系统自带的能力把 SFTP 服务搭起来。答案是能而且比你想象中简单。从 Windows Server 2016 和 Windows 11 开始微软已经把 OpenSSH Server 做成了可选功能勾上就能用底层就是 SSH 协议SFTP 只是 SSH 自带文件传输子系统。装好之后Windows 机器就是一个标准的 SFTP 服务器WinSCP、FileZilla、MobaXterm、vscode 的 Remote-SSH 全都能直接连。这篇文章我把完整的配置流程、权限设置、坑位和排查方法都梳理了一遍照着操作基本半小时内能跑通。适合要给 Windows 服务器加 SFTP 能力的运维也适合在本地 Windows 机器上临时开个 SFTP 供开发测试的同学。1. 为什么要在 Windows 上搭 SFTP需求与方案选型1.1 什么场景下需要原生 SFTP很多团队的文件传输需求一开始是用 FTP 或 SMB 共享解决的但实际用起来总有各种别扭。FTP 明文传输密码和文件内容都裸奔公网环境下基本不敢用SMB 共享在企业内网很方便可一旦跨网段、跨防火墙或者合作方是外部公司端口不通、权限模型不一致都是麻烦。SFTP 不一样它跑在 SSH 协议之上默认走 22 端口传输全程加密认证方式支持密码和密钥还能够做到用户级目录隔离。最关键的一点它是所有类 Unix 和 Windows 系统“内置支持”的协议从 Linux 服务器拉文件的命令叫 sftp从 Windows 客户端传文件也自带 sftp 命令互相之间不用关心对方用的是什么软件。我接触过的典型场景大概有这么几类一是给外部合作方开设一个受限账号让对方只能往指定目录上传文件不能 SSH 登录到系统里乱敲命令二是内网多台 Windows 机器之间做程序化文件分发脚本里直接调 sftp 命令比搞个 FTP 服务再装客户端靠谱得多三是为了兼容已有工具链比如代码编辑器里的 Remote-SSH 插件、CI/CD 流水线里的 sftp 上传步骤它们天然需要 SSH 服务端而 SFTP 就是顺手附带的。如果你只是想在局域网里偶尔传个文件SMB 共享或者微信文件助手可能更顺手。但只要牵扯到跨网络、跨团队、自动化或者需要精确控制“谁能上传、谁能下载、能碰哪些路径”原生 SFTP 就是最稳的选择。1.2 为什么选 OpenSSH 而不是第三方 SFTP 软件市面上有不少成熟的 SFTP 服务端软件比如 FreeSSHd、Bitvise SSH Server、Cerberus FTP Server功能很全界面也友好。但我给朋友和企业客户做方案时只要系统是 Windows Server 2016 或 Windows 11 以上默认都会先推荐微软官方集成的 OpenSSH Server原因很直接微软官方维护系统更新会同步修补安全漏洞不用额外管一个第三方软件的升级周期。安装零成本Windows 可选功能里勾选一下或者一条 PowerShell 命令就搞定不需要破解、不需要授权费。与 Windows 账号体系天然集成。认证走的是本地账号或 AD 域账号不用单独维护一套用户密码权限控制直接复用 NTFS 权限。没有多余的攻击面。一个专门做 SFTP 的第三方软件可能带着 Web 管理界面、FTP 协议支持、邮件通知之类一大堆你根本用不上的功能装上就等于多暴露了一堆服务。第三方软件也不是一无是处。Bitvise 这类工具在 Windows 老版本、或者需要图形化批量管理多个虚拟用户的时候确实更方便。但如果你要的是“干净、可控、免费、长久维护”OpenSSH Server 是我的首选。2. 搭建前的准备检查清单动手之前先花五分钟把环境和需求理清楚省得配置到一半发现系统版本不支持或者端口被占用又回去翻文档。2.1 系统版本与安装条件确认OpenSSH Server 作为可选功能从 Windows Server 2016 和 Windows 10 1809 开始提供Windows 11 全版本内置。所以你手里的 Server 2016、Server 2019、Server 2022、Windows 11 家庭版/专业版/企业版都可以装。有两个例外要注意一是 Windows Server 2012 及更老的系统没有这个可选功能只能用第三方方案二是 Windows 11 家庭版虽然能装 OpenSSH Server但一些组策略和防火墙的高级管理项受限如果你需要做细致的安全策略建议还是专业版起步。权限要求安装系统功能、修改 sshd_config、改防火墙规则都需要管理员权限。如果你在域环境里账号要有本地管理员权限如果你用的是标准用户先准备好管理员账号的密码UAC 弹窗的时候会用到。2.2 检查是否已经安装过Windows 11 的某些版本可能已经预装了 OpenSSH Client但 Server 一般默认不装。检查方法是打开 PowerShell输入Get-WindowsCapability -Online | Where-Object Name -like OpenSSH*输出会列出 OpenSSH.Client 和 OpenSSH.Server 两个组件State 列显示 Installed 表示已安装显示 NotPresent 表示没有。注意区分 Client 和 ServerClient 是让别人连你的工具Server 是让别人连进来的服务我们这篇要装的是 Server。还有个更直接的办法在 PowerShell 里执行Get-Service sshd如果提示找不到这个服务就是没装如果服务存在但状态是 Stopped说明之前装过但没启动。2.3 规划账号、端口与路径安装之前先把三件事定下来后续配置会特别顺。账号SFTP 登录用的 Windows 用户。最简单的做法是新建一个专用本地账号比如 sftpuser不要直接用 Administrator 跑业务。如果你打算接入域账号那也先想好是允许所有域用户登录还是只允许特定组。端口SSH 默认 22 端口如果这台机器还要暴露其他服务或者你纯粹不想让扫描器轻易猜端口建议改成高位端口比如 2222 或 2200。改端口不复杂等会儿在配置文件里改一个数字就行。目录用户登录后默认落在哪个文件夹。建议提前建好比如 C:\SFTPRoot\sftpuser然后给这个目录配置好权限。不要在配置完服务之后才想起来目录还没建到时候排查起来很绕。3. 安装与启用 OpenSSH Server两种方法实测3.1 方法一图形界面安装如果你的 Windows 是带桌面环境的最快的方式是在“设置”里点选。路径是设置 → 系统 → 可选功能 → 查看功能然后在搜索框里输入 OpenSSH会看到“OpenSSH 服务器”和“OpenSSH 客户端”两个条目。点选“OpenSSH 服务器”点击安装等一两分钟就好。安装完成后在“服务”管理工具里找到 OpenSSH SSH Server 这个服务右键启动并且把启动类型改成“自动”防止重启以后服务不在了。这个服务的显示名称不一定叫 sshd不同语言版本的 Windows 显示名可能不一样认准名称里带 SSH Server 那个就行。图形界面适合一次性的机器配置但如果你是批量服务器交付用脚本会更高效。3.2 方法二PowerShell 命令安装我实际部署时多数用命令行因为可以直接写进自动化脚本。管理员身份打开 PowerShell执行# 安装 OpenSSH Server Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 # 安装 OpenSSH Client可选但建议装方便本机测试 Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0安装完成后启动服务并设置开机自启# 启动 sshd 服务并设为自动启动 Start-Service sshd Set-Service -Name sshd -StartupType Automatic # 确认服务状态 Get-Service sshd如果执行 Add-WindowsCapability 时报错最常见的原因是系统镜像源不可用或者当前系统版本缺少更新。可以先跑一下 Windows Update把系统补丁打全再试。3.3 ssh-agent 服务要不要管OpenSSH 安装的时候还会顺带装一个 ssh-agent 服务它主要负责管理密钥缓存。如果你只是做 SFTP 服务端不涉及用这台机器去连别人的 SSH那 ssh-agent 可以不启动不影响 SFTP 功能。但如果你打算在这台 Windows 机器上做密钥登录或者本身还要通过 SSH 去连别的 Linux 服务器那建议把 ssh-agent 也设成自动启动后面配置免密登录的时候会方便很多。这里有个 Windows 特有的注意点OpenSSH 的 ssh-agent 服务默认是手动启动而且它只对交互式登录的会话生效。如果你用计划任务或其他自动化方式调用 SSH 客户端可能遇到“agent 里明明有密钥却提示找不到”的问题实际是服务没跑起来。4. 配置 sshd_config核心参数逐一说明4.1 配置文件位置与备份习惯OpenSSH 安装好之后配置文件在C:\ProgramData\ssh\sshd_config注意不是 C:\Windows\System32\OpenSSH 下的那个模板文件那个只是默认样例真正生效的是 ProgramData 下的 sshd_config。ProgramData 默认是隐藏目录你可以在资源管理器地址栏里直接粘贴路径进去或者用编辑器打开。改文件之前养成好习惯先备份。Copy-Item C:\ProgramData\ssh\sshd_config C:\ProgramData\ssh\sshd_config.bak改配置最怕改完记不清改了什么服务一崩回滚都难。备份文件是底线操作别省这几秒。4.2 端口、监听地址与协议sshd_config 里最常改的几项我用一个实际配置样例来说明# 修改默认端口为 2222避免 22 端口被扫描爆破 Port 2222 # 只监听内网网卡的 SSH 请求如果只在内网用可以指定 IP # ListenAddress 0.0.0.0 表示监听所有网卡 # ListenAddress 192.168.1.10 表示只监听这个 IP # 协议版本OpenSSH 7.x 以上默认只支持 SSH2不用改 Protocol 2 # 登录超时时间单位秒 LoginGraceTime 60 # 最大认证尝试次数 MaxAuthTries 4修改端口这个动作值得多说一句。Windows 自带的 OpenSSH 默认监听 22而公网上的自动化扫描器每时每刻都在扫 22 端口一旦扫到就开始暴力破解密码。改成高位端口不会绝对安全但能把 99% 的批量扫描挡在门外。端口改完之后防火墙规则要同步放行新端口否则客户端连不上。后面专门讲防火墙配置。4.3 认证方式与用户访问控制接下来是认证相关配置。Windows 版 OpenSSH 的认证方式和 Linux 版有些不同有几个坑要提前知道# 是否允许空密码登录必须改成 no PermitEmptyPasswords no # 密码认证开关默认 yes。如果用密钥登录可以改成 no 强制走密钥 PasswordAuthentication yes # 管理员账号是否能 SSH 登录 # 默认情况下 Windows 的 Administrators 组成员是可以登录的 # 如果有安全要求建议限制为 no PermitRootLogin no在 Windows 上“root 用户”这个概念不存在所以你不需要纠结 PermitRootLogin 这个参数到底管不管用它主要影响的是 Administrators 组。实际测试下来Windows 版 OpenSSH 对管理员账号的处理和 Linux 不太一样管理员组成员默认能登录如果你希望“只允许普通用户通过 SFTP 传文件管理员只能本地登录”我建议在配置里加入 AllowGroups 或者 AllowUsers 来显式限定。比如只想让 sftpuser 这个账号登录加上一行AllowUsers sftpuser或者允许整个 sftp_users 组登录AllowGroups sftp_usersWindows 版的 AllowUsers/AllowGroups 可以直接写 Windows 用户名或者组名实测是有效果的。这个配置能防止你创建的一堆 Windows 账号全都暴露出来。4.4 SFTP 子系统与目录隔离SFTP 子系统的配置是这次搭建的核心默认配置里有一行Subsystem sftp sftp-server.exe正常情况下不用动。但如果要做目录隔离让用户登录之后只能看到某一个目录不能跳出这个目录去翻 C 盘其他文件需要用 ChrootDirectory 参数配合实现。Windows 版 OpenSSH 对 ChrootDirectory 的支持比 Linux 差一些但基本可用。配置方式是Subsystem sftp sftp-server.exe Match User sftpuser ChrootDirectory C:\SFTPRoot\sftpuser ForceCommand internal-sftp解释一下这两行Match User只对这个用户生效的配置块。ChrootDirectory用户登录后被锁定的根目录。ForceCommand internal-sftp强制只允许 SFTP 操作不允许执行任意命令。这一行很关键如果不加用户理论上可以请求 SSH Shell那就不只是传文件的问题了。需要特别注意如果 ChrootDirectory 指向的目录权限设置不对用户会被直接拒绝登录。这不是玄学Windows 版 OpenSSH 对根目录的权限检查非常严格要求根目录不能被用户账号本身拥有写权限。说白了你要把那个目录的所有者设置成 Administrator 或者 SYSTEM用户的写权限只能在根目录下的子目录里。5. Windows 权限配合NTFS 权限是最大隐藏坑5.1 理解 Windows SSH 的权限模型Linux 下配置 SSH 服务权限控制主要靠文件权限和所有者Windows 下则完全依赖 NTFS ACL。同样的目录给用户的 NTFS 权限不对SSH 服务端会直接拒绝会话建立。这是 Windows 版 OpenSSH 和 Linux 版差异最大的地方也是新手最容易卡住的地方。核心规则一句话用户要对 Chroot 根目录有读取和执行权限但不能有写入权限对根目录下的子目录按需赋予读写权限。拿我们的例子来说结构是C:\SFTPRoot\ └── sftpuser\ - Chroot 根目录用户不能在这里写文件 └── upload\ - 用户真正能上传文件的目录对应的 NTFS 权限分配如下路径用户 sftpuser 的权限C:\SFTPRoot\sftpuser读取和执行C:\SFTPRoot\sftpuser\upload修改、写入、读取和执行设置方法右键目录 → 属性 → 安全 → 编辑 → 添加用户 → 勾选对应权限。注意要先在“高级权限”里禁止从父目录继承的权限否则会带上一些奇怪的继承项导致权限判断异常。5.2 权限设置实操步骤我一步步说下怎么操作。第一步新建目录结构。在资源管理器里创建 C:\SFTPRoot\sftpuser\upload右键 sftpuser 目录选择属性进入安全选项卡。第二步点击“高级”在弹出窗口底部点击“禁用继承”选择“将已继承的权限转换为此对象的显式权限”。这样原来的继承权限就会变成显式权限方便我们清理。第三步把除了 SYSTEM、Administrators 之外的用户逐个选中并删除。然后点击“添加”输入 sftpuser点“检查名称”确认无误后确定。第四步在权限列表里给 sftpuser 勾选“读取和执行”、“列出文件夹内容”、“读取”。这三个够了不要给“写入”和“修改”。第五步对 upload 子目录重复同样的操作但权限改成“修改”、“读取和执行”、“列出文件夹内容”、“读取”、“写入”。这里的“修改”权限实际上已经包含了写入和删除用户对 upload 目录有完全控制权。完成后用 sftpuser 试着登录一次。如果能登录但上传文件时报权限不足多半是 upload 目录的 NTFS 权限没给对重新去检查这一步。5.3 用户主目录与默认路径的处理Windows 版 OpenSSH 在用户登录时会尝试切换到用户的主目录也就是 C:\Users\用户名 这个目录。如果你创建了一个新用户 sftpuser但没有让它产生过用户配置文件那个 C:\Users\sftpuser 目录可能根本不存在。一旦用户主目录不存在SSH 连接会有个奇怪的现象密码验证成功但 SFTP 会话建立失败或者登录后落在根目录 / 而不是用户主目录。解决办法有两种一是让 sftpuser 账号在本地登录一次 Windows让它自动生成用户配置文件目录。这个操作在服务器上有点麻烦因为你可能不希望这个账号能本地登录。二是在 sshd_config 里手动指定用户主目录。在配置文件中加上Match User sftpuser ChrootDirectory C:\SFTPRoot\sftpuser ForceCommand internal-sftp只要 ChrootDirectory 和 ForceCommand 配置了用户登录后直接就进入 chroot 环境主目录是否存在已经不重要了。这也是我推荐的做法权限隔离和主目录问题一起解决。6. 防火墙放行与客户端连接验证6.1 添加防火墙规则安装 OpenSSH Server 的时候安装程序一般会自动创建一条防火墙规则放行 22 端口的入站连接。但如果你在配置文件里改了端口这条自动规则就不管用了必须手动加一条。图形界面方式控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则选择端口填上你的端口号比如 2222选择允许连接配置文件全勾上名称随便写比如 OpenSSH-SFTP。命令行方式更快管理员 PowerShell 执行New-NetFirewallRule -Name OpenSSH-Server-Custom -DisplayName OpenSSH Server (SFTP) -Enabled True -Direction Inbound -Protocol TCP -LocalPort 2222 -Action Allow加完规则之后可以用 Test-NetConnection 验证端口是否可用Test-NetConnection 127.0.0.1 -Port 2222看到 TcpTestSucceeded 为 True说明防火墙已经放行服务也在正常监听。6.2 本地命令行验证 SFTP 登录服务配置好之后先在本机做一次完整验证免得客户端连不上还误以为是网络问题。打开 PowerShellWindows 11 自带 sftp 客户端命令sftp -P 2222 sftpuser127.0.0.1注意 Windows 的 sftp 命令参数是 -P 大写 P表示端口小写 -p 是 Linux sftp 里表示端口Windows 下通用性没那么好。登录成功后会进入一个 sftp 提示符可以敲 help 查看支持的命令。验证上传sftp put C:\test.txt /upload/test.txt验证下载sftp get /upload/test.txt C:\download\test.txt验证目录隔离sftp cd / sftp ls如果你只看到 upload 目录说明 ChrootDirectory 生效了。如果你还能看到 Windows 的其他目录那说明 Chroot 配置没生效回头检查 Match 块是否写对。6.3 常用客户端连接参数速查命令行验证通过之后就该用图形化客户端了。记住几个常用客户端的关键字段客户端协议端口备注WinSCPSFTP2222文件协议选 SFTP不要选 FTPFileZillaSFTP - SSH File Transfer Protocol2222主机填 IP端口填 2222MobaXtermSFTP2222新建会话时选择 SSHSFTP 自动关联vscode Remote-SSHSSH2222配置 ~/.ssh/config写入 Port 2222其中 vscode Remote-SSH 是很多开发者的标配配置文件常见写法Host windows-sftp HostName 192.168.1.100 User sftpuser Port 2222保存后vscode 里连接这个 Host它会自动打开远程资源管理器文件读写走的就是 SSH 协议。对这台 Windows 远程机来说既支持命令行 SFTP又支持图形化文件管理一台服务器全搞定。这里提醒一句vscode 连接 SSH 时会要求在远程端安装一个 vscode server 组件如果远程机是 Windows Server可能会遇到扩展冲突的提示。那个提示说的是某些扩展不支持远程 SSH 主机并非配置错误不影响 SFTP 基本使用。7. 常见问题与排查实录7.1 连接被拒绝或超时这个现象表现为客户端连接时提示 connection refused 或 timeout。排查顺序首先确认 sshd 服务在运行Get-Service sshd如果服务是停止状态手动启动一次看有没有报错。如果启动失败先看配置文件有没有语法错误。然后确认端口监听。执行netstat -ano | findstr 2222有 LISTENING 状态的行说明服务端口正常。没有的话检查 sshd_config 里的 Port 配置是否被多个块重复定义或者配置语法有问题。最后确认防火墙。用 Test-NetConnection 从客户端机器测试端口Test-NetConnection 192.168.1.100 -Port 2222如果 TcpTestSucceeded 是 False优先查防火墙入站规则。这是 90% 的“连不上”的最终原因。7.2 密码正确但登录失败提示 permission denied但你确定密码没输错。这种情况在 Windows 上很常见原因往往是 Administrator 组的策略限制或者账户被锁定。快速排查路径检查事件查看器的安全日志找到对应的审核失败记录看看失败原因是什么。常见原因账号已禁用。检查一下 sftpuser 账号属性里“账户已禁用”是否被勾选。账号被锁定。多次失败尝试后 Windows 会自动锁定用管理员在域控或本地安全策略里解锁。sshd_config 里配置了 AllowUsers 或 AllowGroups但用户不在允许名单里。改过端口后客户端还在用旧端口连接。这种情况提示的也是认证失败因为连到错误服务上了。顺便提一下Windows 的 SSH 日志默认记录在事件查看器里的 OpenSSH Operational 日志中路径是应用程序和服务日志 → OpenSSH → Operational。看这个日志比看 sshd 命令行的提示信息详细得多。7.3 Chroot 目录配置后直接登录失效配置了 ChrootDirectory 之后用户反而登录不了了或者登录成功后立刻断掉。这个问题几乎都是 NTFS 权限不满足要求导致的。Windows 版 OpenSSH 强制要求Chroot 根目录只能被 SYSTEM、Administrators 或者容器本身拥有并且用户不能对根目录有写权限。检查目录权限的步骤右键根目录 C:\SFTPRoot\sftpuser → 属性 → 安全。看用户 sftpuser 的权限列里写入或修改有没有被勾选。如果有去掉这些权限只保留读取和执行、列出文件夹内容、读取。改完权限后重启 sshd 服务Restart-Service sshd再连接一次一般就恢复正常了。如果仍然不行去事件查看器的 OpenSSH Operational 日志里看会有具体报错信息比如身份验证失败或者权限检查失败之类。7.4 端口被占用导致服务无法启动默认端口 22 被其他软件占用sshd 服务能启动成功但实际没在监听。这种情况在安装了其他 SSH 服务或者某些网络软件的机器上不少见。检查端口占用netstat -ano | findstr :22会看到占用端口的进程 PID再到任务管理器里查一下是哪个进程。如果是恶意进程或者不需要的旧服务可以把它们停掉如果那个进程是系统关键服务不要强杀直接改 sshd_config 的端口更省事。7.5 SSH 命令执行过程中退出命令还会继续吗有个热搜问题挺有意思SSH 命令执行过程中退出命令还会继续跑吗。这个在 Windows 环境同样适用。如果你通过 SSH 在远程 Windows 机器上启动了一个长时间运行的进程SSH 会话一断开那个进程会被强制终止除非它是以服务方式运行或者用计划任务方式脱离当前会话。这跟 SFTP 本身关系不大但如果你想在 SSH 远程执行自动化任务就要注意这个特性。比较稳妥的做法是把远程脚本做成 Windows 计划任务用 schtasks 命令注册再通过 SSH 触发这样 SSH 断开不会影响任务继续执行。8. 安全加固与日常运维建议8.1 用密钥登录替代密码密码认证最怕的就是爆破尤其是暴露在公网上的服务器。改成密钥登录之后就算黑客拿到了你的密码也登不进去因为没有私钥。在 Windows 客户端上生成密钥对PowerShell 里执行ssh-keygen -t ed25519 -C your_emailexample.com生成后会得到两个文件公钥 id_ed25519.pub 和私钥 id_ed25519。把公钥内容追加到远程 Windows 服务器上 sftpuser 用户主目录下的 .ssh\authorized_keys 文件里。Windows 版 OpenSSH 的密钥文件路径是 C:\Users\sftpuser.ssh\authorized_keys。注意这个文件内容末尾必须换行文件编码不能是带 BOM 的 UTF-8否则验证会出错。这是 Windows 上配置密钥登录最常见的坑优先级排第一。追加完公钥后在 sshd_config 里把密码登录关掉PasswordAuthentication no然后重启 sshd 服务之后的 SFTP 连接就全部走密钥认证了。8.2 登录限速与失败次数Windows 自带 account lockout 策略但对 SSH 的暴力破解更直接的办法是在 sshd_config 里限制认证次数和超时时间MaxAuthTries 3 LoginGraceTime 30MaxAuthTries 3 表示最多允许 3 次认证尝试超过直接断开。LoginGraceTime 30 表示如果 30 秒内没完成认证连接自动终止。这两个参数能极大降低暴力破解的效率。再配合修改默认端口基本能把扫描器的骚扰挡在门外。极端场景下还可以配置防火墙只允许特定 IP 访问 SSH 端口比如用高级防火墙规则限制源 IP。8.3 日志监控与审计Windows 版 OpenSSH 的日志分开两块。安全日志记录认证成功和失败OpenSSH Operational 日志记录 SSH 会话的详细操作包括 SFTP 文件上传下载记录。日常巡检重点看这几个信息登录成功的用户、源 IP、时间。登录失败的次数如果短时间内同一个 IP 连续失败大概率是有人在爆破。SFTP 会话活动哪些账号在什么时候传了什么文件操作日志里会有记录。如果你需要把日志集中管理可以设置事件日志转发或者用脚本定期导出把安全事件同步到 SIEM 平台方便统一审计。8.4 给 SFTP 目录做定期备份SFTP 服务一旦上线目录里就会积累业务文件出问题再想恢复就晚了。建议把 SFTP 根目录纳入备份策略至少做到每日增量。Windows 自带文件历史记录和 Windows Server 的备份功能也可以直接用 robocopy 做同步robocopy C:\SFTPRoot E:\Backup\SFTPRoot /MIR /LOG:C:\Backup\sftp_backup.log/MIR 参数表示镜像备份源目录删除的文件备份目录也会同步删除。如果你希望保留历史版本就不要用 /MIR改用 /E 并配合版本管理工具。写在最后这套 Windows 原生 OpenSSH SFTP 方案我前前后后给不同环境配置过不下十次最大的感触是思路比命令重要。只要你理解了 Windows 版 OpenSSH 的权限模型——认证走 Windows 账号、授权走 NTFS ACL、目录隔离靠 ChrootDirectory——那么无论遇到什么问题都能顺着这个思路定位到具体环节。最后再分享一个小技巧配置完 sshd_config 后可以用sshd -t检查配置语法是否正确。Windows 版 OpenSSH 也支持这个参数位置在 C:\Windows\System32\OpenSSH\sshd.exe -t如果配置有语法错误它会直接提示在哪一行。这个命令能帮你省掉很多“改完配置重启服务失败”的排查时间。