Win10开启OpenSSH Server:Linux与Windows文件互传实战指南

发布时间:2026/10/14 9:47:39
Win10开启OpenSSH Server:Linux与Windows文件互传实战指南 你有没有遇到过这种场景公司的文件服务器是Linux但同事们的办公机全是Windows。每次想从一台Win10机器上拉个报表到服务器或者把服务器上的安装包推到Windows机器上都得靠U盘、网盘或者临时搭个SMB共享来回折腾。其实Win10自带一个被很多人忽略的开关——OpenSSH Server打开之后Linux服务器可以直接通过SSH连进Windows系统然后像操作Linux一样用scp、sftp做文件互传整个过程不需要额外安装任何第三方工具。这篇文章就来完整走一遍这条路从Win10端开启SSH服务、配置防火墙开始到Linux端用密钥登录、scp互传文件再到把实操中踩过的权限、编码、路径坑全部摊开讲清楚。内容适用对象很明确需要维护混合OS环境的技术人员或者正在搭个人NAS、远程实验室的开发者。1. 为什么选择Win10当SSH服务端这个方案解决的真实痛点一开始我接到这个需求的时候第一反应是“反向操作”——平时大家接触更多的是在Linux上装sshd然后Windows用Putty或者PowerShell的ssh命令去连Linux。但这次标题写得很清楚是Linux服务器去连Win10这就意味着Win10必须作为SSH的服务端存在。1.1 对比一下常见的三种文件互传方案我简单梳理了一下手头在用的几种跨平台文件互传方式各有各的局限。方案优点痛点临时搭SMB共享图形界面操作直观需要设置共享权限、防火墙规则而且每个Windows用户都要单独配账号密码FTP服务器历史兼容性好明文传输不安全而且Win10默认没装FTP服务端网盘中转简单直接绕一遍外网大文件传输效率低隐私也是个问题OpenSSH方案的优势在于加密传输、命令行操作、天然支持断点续传sftp而且从Win10 1809开始系统就内置了OpenSSH Server可选功能完全不需要额外安装任何商业软件。对做自动化脚本的工程师来说这意味着以后可以用shell脚本直接跨平台拉取文件不用再折腾图形界面。1.2 这套方案的适用边界如果你的Windows机器是企业域环境、被安全策略锁死了服务安装权限那这个方案可能会受阻。但面对个人开发机、实验室机器、或者自己有管理员权限的办公电脑基本就是几分钟的事。另外要注意Win10的OpenSSH Server是基于Windows OpenSSH移植版它模拟的是Unix shell环境默认shell是cmd.exe或者PowerShell。这意味着你已经习惯的Linux命令不一定都在Windows侧可用——比如ls在默认shell里可能不存在得用dir。这个差异在后面文件互传的时候会有具体体现。2. 开启Win10自带的OpenSSH Server两种方式与踩坑点在Win10上开启SSH服务端有两种路径图形化“可选功能”面板和PowerShell命令行。我建议第一次操作的人用图形界面因为能看到明显状态反馈批量部署的时候用命令行脚本更合适。2.1 图形界面方式打开“设置 → 应用 → 可选功能”点击“添加可选功能”搜索“OpenSSH”你会看到两个条目OpenSSH客户端默认可能已经装了OpenSSH服务器端需要手动添加点击“OpenSSH服务器端”并安装。安装完之后打开“服务”管理器WinR输入services.msc找到名为“OpenSSH SSH Server”的服务把它的启动类型改成“自动”然后点击“启动”。2.2 PowerShell方式如果你习惯命令行管理员身份打开PowerShell输入Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0安装完成后设置服务自动启动并启动服务Set-Service -Name sshd -StartupType Automatic Start-Service sshd有一个比较容易忽略的点安装完默认sshd服务可能是禁用状态而且启动失败后错误日志在“事件查看器”里而不是Linux那种/var/log/messages里。我第一次装完直接在Linux那边连接结果超时排查了半天才发现服务压根没跑起来。2.3 验证服务与端口监听在Win10上执行Get-Service sshd netstat -ano | findstr :22如果看到LISTENING状态且进程号对得上说明服务端已经就绪。到这里Win10端的SSH服务就算开了。3. Win10的sshd_config关键配置项怎么改才顺手OpenSSH在Windows上的配置文件路径是C:\ProgramData\ssh\sshd_config注意不是Linux的/etc/ssh/sshd_config。这个文件默认内容已经能用但为了顺手上路我一般会改几个地方。3.1 端口与监听地址默认监听22端口。如果内网有其他设备占用了22或者你想稍微隐蔽一点可以改端口比如2299Port 2299 ListenAddress 0.0.0.0注意Windows防火墙放行的端口要同步改否则改了端口之后外部还是连不上。3.2 认证方式密码登录的开关默认配置是允许密码认证的PasswordAuthentication yes如果想改成密钥登录建议内网也这么做需要确认/设置PubkeyAuthentication yes PasswordAuthentication no这里尤其要提醒Windows的sshd默认对authorized_keys文件的路径解析和Linux有差异具体后面单独讲。3.3 允许登录的用户和shell默认情况下sshd允许所有本地用户登录除了Administrator默认受限。可加AllowUsers yourname限制只有指定用户能连安全性会好很多。shell相关配置在Windows上体现为Subsystem sftp默认指向C:\Windows\System32\openssh\sftp-server.exe一般不用动。3.4 修改配置后重启服务每次改完sshd_config都要重启服务Restart-Service sshd注意别用net stop sshd再net start sshd组合偶尔会遇到服务未完全释放导致端口占用的问题。4. Linux端连接与文件互传实际命令和路径坑Win10那边服务开好、配置改好之后真正的重头戏才刚开始——从Linux服务器连过来完成文件互传。这里我把登录、scp、sftp三条路径都实测了一遍把命令和注意事项直接列出来。4.1 SSH远程登录假设Win10的IP是192.168.1.100用户名是winuserLinux端直接ssh winuser192.168.1.100如果没有改端口默认走22端口如果改了端口ssh -p 2299 winuser192.168.1.100这时候会要求输入Win10用户名的登录密码。输入密码后你会进入一个看起来“怪怪”的shell——默认是cmd.exe的模拟环境执行dir能列出目录cd C:\Users\winuser能切换路径。4.2 scp互传核心用途文件互传的核心命令是scp。从Linux推文件到Win10scp /home/ubuntu/report.tar.gz winuser192.168.1.100:C:/Users/winuser/Desktop/注意那个盘符冒号后面直接跟路径的写法C:/Users/winuser/Desktop/。这里是正斜杠不能写成Windows习惯的反斜杠C:\Users\...——在shell里反斜杠是转义符很容易被吞掉。从Win10拉文件到Linuxscp winuser192.168.1.100:C:/Users/winuser/Desktop/数据报表.xlsx /home/ubuntu/实测小技巧Windows路径里如果含空格或者中文最好把整个远程路径用单引号包起来scp winuser192.168.1.100:C:/Users/winuser/Desktop/我的文件/测试报告.pdf /home/ubuntu/4.3 sftp交互式传输scp适合单次传文件但如果要反复浏览、下载或上传多个文件sftp更顺手sftp winuser192.168.1.100进去之后是交互式会话基本命令和Linux的ftp类似ls列出当前远程目录实际是Windows目录cd C:/Users/winuser/Desktop切换远程目录lcd /home/ubuntu切换本地目录get 文件名下载文件到本地put 文件名上传文件到远程bye退出实测下来sftp比scp更稳定的一点是可以在传输大文件前用ls -l确认双方文件大小避免传了一半才发现不对。4.4 路径反斜杠与正斜杠的迁移教训说一个我踩过的真实教训第一次用scp拉取Win10桌面的文件时我照着Windows习惯写了反斜杠路径scp winuser192.168.1.100:C:\Users\winuser\Desktop\a.txt /home/ubuntu/结果shell把\U、\w这些当成转义字符解析命令根本没法正确执行。后来统一改成正斜杠C:/Users/winuser/Desktop/a.txt一次通过。这是Linux连Windows方案里最隐蔽但最常见的失败点。5. 实测中的高频坑权限、编码、防火墙的完整排查链路整个链路最耗时间的不是搭服务而是出了问题之后怎么定位。我把自己建模拟项目时反复踩过的几个坑整理出来每条都带完整的排查过程。5.1 坑一Linux端连接被拒绝或者超时现象ssh: connect to host 192.168.1.100 port 22: Connection refused。排查链路先在Linux端ping一下Win10的IP排除网络通断问题。ping -c 3 192.168.1.100在Win10端确认sshd服务确实在跑Get-Service sshd检查防火墙。用管理员身份打开PowerShell执行New-NetFirewallRule -Name OpenSSH-Server -DisplayName OpenSSH Server (sshd) -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22如果之前装服务时没自动放行防火墙上面这条命令手动补上。在Win10本地用netstat -ano | findstr :22确认监听。这四步走完绝大多数“连接拒绝”问题都能定位到具体环节。5.2 坑二密码总是验证失败现象账号密码明明是对的但Linux这边输进去就是Permission denied, please try again。排查链路确认输入的是Win10本地账户密码不是微软账户的在线密码。**如果你的Win10登录的是微软账号但系统里没有关联本地账户OpenSSH默认验证的是本地用户密码会出现“在线密码对、本地密码不对”的情况。**处理办法创建一个本地用户用于SSH登录或在微软账户设置里添加本地登录密码。检查sshd_config里的PasswordAuthentication是否为yes。查看Win10的事件日志。在“事件查看器 → Windows 日志 → 应用程序”里找sshd来源的错误事件里面有具体的拒绝原因。我帮某同事排查过一次搞了半小时才发现密码是微软在线密码重设本地密码后秒连。5.3 坑三scp传文件报错“Permission denied”或“Couldnt read packet”现象能登录但scp传输中报权限错误。排查链路在sftp会话里用ls -l确认目标目录是不是当前用户有写权限。比如传到C:/Program Files这类系统目录普通用户没有写权限必须传到用户目录或者Admin用户可写的目录。确认Win10的sshd默认强制隔离用户到自己的profile目录实际上默认配置没有强制chroot但权限控制遵循NTFS ACL。如果你觉得Linux的权限模型能直接套用在Windows上是完全错误的——Win10侧的文件权限由NTFS ACL决定而不是chmod。普通用户能访问的只有自己的用户目录和公共目录。如果传的是中文文件名检查是不是编码问题。Win10 OpenSSH默认是UTF-8但如果系统区域设置是GBK简体中文默认会出现文件名乱码甚至找不到文件。处理办法在Win10的“区域设置”里勾选“Beta: 使用Unicode UTF-8提供全球语言支持”然后重启。这个操作对中文文件名的互传非常关键。5.4 坑四公钥认证配好了却仍然要求输密码现象按照Linux公钥认证的经验把id_rsa.pub内容加到了authorized_keys里但连接时还是要求密码。排查链路这是Windows OpenSSH最大的“隐藏差异”。在Windows上公钥认证的authorized_keys文件路径不是~/.ssh/authorized_keys而是C:\Users\用户名\.ssh\authorized_keys而且这个文件的权限要求极其严格只有当前用户和系统SYSTEM可以有完全控制权限如果其他用户有读权限sshd会判定为不安全的授权文件而去掉密钥认证。这在Linux上是很少见的权限检查逻辑。处理办法在Win10上以管理员打开PowerShell执行$authorizedKey Get-Content C:\Users\winuser\.ssh\authorized_keys $acl Get-Acl C:\Users\winuser\.ssh\authorized_keys $acl.SetAccessRuleProtection($true) $rule New-Object System.Security.AccessControl.FileSystemAccessRule(NT AUTHORITY\SYSTEM, FullControl, Allow) $acl.AddAccessRule($rule) $rule New-Object System.Security.AccessControl.FileSystemAccessRule(winuser, FullControl, Allow) $acl.AddAccessRule($rule) Set-Acl C:\Users\winuser\.ssh\authorized_keys $acl没执行这个权限纠正之前所有密钥登录配置都是白搭。5.5 坑五改了默认shell之后的连锁反应现象有人图方便把sshd的默认shell从cmd.exe改成了powershell.exe结果发现scp传完文件后shell报错“unsupported subsystem”或者无法执行某些命令。原因Windows OpenSSH对subsystem和shell的处理依赖sshd_config里的配置。默认情况下用的是cmd.exe它对scp的subsystem路径处理更直接。改成PowerShell之后某些旧版OpenSSH会出现兼容问题。处理建议做文件互传阶段不需要改默认shell保持cmd.exe就够了。如果确实想用PowerShell环境建议通过新版本OpenSSH8.x以上并确保子系统配置完整。6. 密钥认证与安全加固别把22端口裸奔在内网文件互传打通之后接下来要考虑的是长期使用的安全性。毕竟SSH服务一旦开着等于给Windows开了一个远程管理口子处理不当容易变成内网漏洞。6.1 用密钥认证替代密码认证密钥认证至少要做一次原因很简单密码认证容易被暴力猜解而且在内网外网双重环境下密码等于明文放在你能拿到的地方。在Linux端生成密钥ssh-keygen -t ed25519 -a 100然后把公钥内容追加到Win10的authorized_keys文件里。注意上面提到的ACL权限问题追加完要执行权限修正。全部配好后测试ssh -i ~/.ssh/xxx_key winuser192.168.1.100确认能免密登录之后再去改sshd_config去掉密码认证PasswordAuthentication no改完记得重启Win10的sshd服务。6.2 防火墙层面精准放行不需要把22端口对全内网开放。如果只固定一台Linux服务器需要连Win10在防火墙里把源IP限定为那台服务器的IPSet-NetFirewallRule -Name OpenSSH-Server -RemoteAddress 192.168.1.50这样只有指定IP能触达22端口其他机器即使扫描到也是超时。实测定点放行比直接放行整个子网安全得多而且不影响正常连接。6.3 用Fail2ban做防爆破如果Linux端想控制访问频率既然入口在Linux端反向防护也可以用Linux侧工具限制连接频率。但注意限制ssh服务端Windows的连接频率本质上是限制Linux发起的连接频率对大多数场景意义不大。更实际的做法是在Win10端通过防火墙规则限制来源IP以及配置MaxAuthTries参数。在sshd_config里加MaxAuthTries 3限制认证尝试次数能极大降低爆破风险。同时建议开审计日志Win10的sshd会把连接日志写到C:\Windows\System32\winevt\Logs\Microsoft-Windows-OpenSSH%4Operational.evtx排查异常登录的时候可以直接翻。7. 批量场景与自动化扩展脚本怎么省心文件互传如果只是偶尔手动用一次前面几步就够了。但实际干活时往往有批量需求比如每天定时把Windows机器上的数据同步到Linux服务器。7.1 用cronscp做定时拉取在Linux侧写一个简单脚本#!/bin/bash # 每天02:00从Win10拉取数据 STAMP$(date \%Y\%m\%d) scp -i /home/ubuntu/.ssh/win_key winuser192.168.1.100:C:/data/daily_report.xlsx /home/ubuntu/archive/daily_report_${STAMP}.xlsx然后写进crontab0 2 * * * /home/ubuntu/scripts/sync_win.sh /home/ubuntu/logs/sync_win.log 21实测下来密钥配好之后这个流程完全可以无人值守。唯一要注意的是Win10机器不能休眠否则到点连不上。7.2 用sftp批量上传如果要从Linux往Windows批量上传多个文件sftp的put命令配合mput部分版本支持或循环脚本可以搞定。我的习惯是写一个expect脚本或者直接写成一个交互式sftp批处理脚本sftp winuser192.168.1.100 EOF cd C:/uploads put /home/ubuntu/data1.csv put /home/ubuntu/data2.csv bye EOF这样至少是一次性连接、批量上传效率比逐条scp高非常多。7.3 日志监控与告警提醒跑了自动化之后记得检查scp是否成功。我一般定时任务后面挂一个判断if [ -f /home/ubuntu/archive/daily_report_${STAMP}.xlsx ]; then echo OK - file synced sync_result.log else echo FAIL - file missing sync_result.log fi这套下来以后我基本不再用U盘做跨平台传文件了。不管是临时拉取还是定时同步Linux连Win10的OpenSSH方案已经成了我日常运维混合环境的一个基础底座。8. 超实用经验总结核心要点再确认最后把我实际操作中反复确认的几个要点汇总一下每个都对应一次踩坑换来的经验希望你能少走冤枉路。8.1 操作前务必核对的小清单检查Win10版本低于1809的需要考虑用Win32-OpenSSH手动安装1809以上直接可选功能即可确认sshd服务启动且自动启动确认防火墙放行22端口或自定义端口记住远程路径必须用正斜杠C:/Users/...中文路径或者含空格路径用单引号包裹涉及保存文件的目标目录要确认NTFS权限允许写入8.2 需要长期维护的注意点Win10更新可能重置sshd配置或服务启动类型更新后记得确认服务状态不要同时开着密码认证和远端口映射尽量只用密钥认证文件互传完成后建议关掉不再需要的Windows账户的远程登录权限也就是从sshd_config里删掉对应的AllowUsers如果Windows机器是笔记本注意功耗策略防止休眠导致连接失败8.3 更进一步的方向如果你已经通过OpenSSH打通了文件互传下一步可以考虑把这一层做深——比如用远程转发到一个内部服务把Linux服务器变成Windows机器的反向代理入口或者用Win10的OpenSSH配合计划任务让定时任务主动把文件推到Linux端。这些都是在不引入额外中间件的情况下、纯粹基于系统自带能力完成的事情。需要特别注意的一个细节在配置authorized_keys权限的时候如果你用的是非管理员用户OpenSSH会拒绝读取该文件。这时候需要在目标用户目录下先手动创建.ssh文件夹并确保权限继承是干净的。我踩过一次直接用echo追加公钥结果.ssh目录归属是Administrator普通用户一直认证失败。正确做法是先登录到那个Windows用户执行mkdir .ssh再追加公钥保证属主是自己。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询