news 2026/10/14 9:47:33

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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服务器端”并安装。安装完之后,打开“服务”管理器(Win+R输入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,或者你想稍微隐蔽一点,可以改端口,比如2299:

Port 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,用户名是winuser,Linux端直接:

ssh winuser@192.168.1.100

如果没有改端口,默认走22端口;如果改了端口:

ssh -p 2299 winuser@192.168.1.100

这时候会要求输入Win10用户名的登录密码。输入密码后,你会进入一个看起来“怪怪”的shell——默认是cmd.exe的模拟环境,执行dir能列出目录,cd C:\Users\winuser能切换路径。

4.2 scp互传:核心用途

文件互传的核心命令是scp。从Linux推文件到Win10:

scp /home/ubuntu/report.tar.gz winuser@192.168.1.100:C:/Users/winuser/Desktop/

注意那个盘符冒号后面直接跟路径的写法:C:/Users/winuser/Desktop/。这里是正斜杠,不能写成Windows习惯的反斜杠C:\Users\...——在shell里反斜杠是转义符,很容易被吞掉。

从Win10拉文件到Linux:

scp winuser@192.168.1.100:C:/Users/winuser/Desktop/数据报表.xlsx /home/ubuntu/

实测小技巧:Windows路径里如果含空格或者中文,最好把整个远程路径用单引号包起来:

scp 'winuser@192.168.1.100:C:/Users/winuser/Desktop/我的文件/测试报告.pdf' /home/ubuntu/

4.3 sftp交互式传输

scp适合单次传文件,但如果要反复浏览、下载或上传多个文件,sftp更顺手:

sftp winuser@192.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 winuser@192.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。

排查链路:

  1. 先在Linux端ping一下Win10的IP,排除网络通断问题。
ping -c 3 192.168.1.100
  1. 在Win10端确认sshd服务确实在跑:
Get-Service sshd
  1. 检查防火墙。用管理员身份打开PowerShell执行:
New-NetFirewallRule -Name 'OpenSSH-Server' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

如果之前装服务时没自动放行防火墙,上面这条命令手动补上。

  1. 在Win10本地用netstat -ano | findstr :22确认监听。

这四步走完,绝大多数“连接拒绝”问题都能定位到具体环节。

5.2 坑二:密码总是验证失败

现象:账号密码明明是对的,但Linux这边输进去就是Permission denied, please try again。

排查链路:

  1. 确认输入的是Win10本地账户密码,不是微软账户的在线密码。**如果你的Win10登录的是微软账号,但系统里没有关联本地账户,OpenSSH默认验证的是本地用户密码,会出现“在线密码对、本地密码不对”的情况。**处理办法:创建一个本地用户用于SSH登录,或在微软账户设置里添加本地登录密码。

  2. 检查sshd_config里的PasswordAuthentication是否为yes。

  3. 查看Win10的事件日志。在“事件查看器 → Windows 日志 → 应用程序”里找sshd来源的错误事件,里面有具体的拒绝原因。

我帮某同事排查过一次,搞了半小时才发现密码是微软在线密码,重设本地密码后秒连。

5.3 坑三:scp传文件报错“Permission denied”或“Couldn't read packet”

现象:能登录,但scp传输中报权限错误。

排查链路:

  1. 在sftp会话里用ls -l确认目标目录是不是当前用户有写权限。比如传到C:/Program Files这类系统目录,普通用户没有写权限,必须传到用户目录或者Admin用户可写的目录。

  2. 确认Win10的sshd默认强制隔离用户到自己的profile目录?实际上默认配置没有强制chroot,但权限控制遵循NTFS ACL。如果你觉得Linux的权限模型能直接套用在Windows上是完全错误的——Win10侧的文件权限由NTFS ACL决定,而不是chmod。普通用户能访问的只有自己的用户目录和公共目录。

  3. 如果传的是中文文件名,检查是不是编码问题。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环境,建议通过新版本OpenSSH(8.x以上)并确保子系统配置完整。

6. 密钥认证与安全加固:别把22端口裸奔在内网

文件互传打通之后,接下来要考虑的是长期使用的安全性。毕竟SSH服务一旦开着,等于给Windows开了一个远程管理口子,处理不当容易变成内网漏洞。

6.1 用密钥认证替代密码认证

密钥认证至少要做一次,原因很简单:密码认证容易被暴力猜解,而且在内网+外网双重环境下,密码等于明文放在你能拿到的地方。

在Linux端生成密钥:

ssh-keygen -t ed25519 -a 100

然后把公钥内容追加到Win10的authorized_keys文件里。注意上面提到的ACL权限问题,追加完要执行权限修正。

全部配好后测试:

ssh -i ~/.ssh/xxx_key winuser@192.168.1.100

确认能免密登录之后,再去改sshd_config去掉密码认证:

PasswordAuthentication no

改完记得重启Win10的sshd服务。

6.2 防火墙层面精准放行

不需要把22端口对全内网开放。如果只固定一台Linux服务器需要连Win10,在防火墙里把源IP限定为那台服务器的IP:

Set-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 用cron+scp做定时拉取

在Linux侧写一个简单脚本:

#!/bin/bash # 每天02:00从Win10拉取数据 STAMP=$(date +\%Y\%m\%d) scp -i /home/ubuntu/.ssh/win_key 'winuser@192.168.1.100:C:/data/daily_report.xlsx' /home/ubuntu/archive/daily_report_${STAMP}.xlsx

然后写进crontab:

0 2 * * * /home/ubuntu/scripts/sync_win.sh >> /home/ubuntu/logs/sync_win.log 2>&1

实测下来,密钥配好之后这个流程完全可以无人值守。唯一要注意的是:Win10机器不能休眠,否则到点连不上。

7.2 用sftp批量上传

如果要从Linux往Windows批量上传多个文件,sftp的put命令配合mput(部分版本支持)或循环脚本可以搞定。我的习惯是写一个expect脚本,或者直接写成一个交互式sftp批处理脚本:

sftp winuser@192.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`再追加公钥,保证属主是自己。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 9:47:18

二层RSTP防环技术全解析:从原理到实战排障

干网络这行&#xff0c;整天说“防环”&#xff0c;其实很多人对二层RSTP的理解只停留在“配个STP就行”。真正遇到环网事故时&#xff0c;广播帧在交换机之间来回兜圈&#xff0c;几分钟就能让设备CPU飙到100%&#xff0c;全网时断时通。我自己处理过不少类似故障&#xff0c;…

作者头像 李华
网站建设 2026/10/14 9:47:09

SpringBoot+Vue+MySQL构建电商系统全栈开发实践

1. 项目概述这个基于SpringBootVueMySQL的在线商城系统是我去年指导的一个毕业设计项目&#xff0c;经过三个月的开发和优化&#xff0c;最终实现了一个功能完善、性能稳定的电商平台。作为一个完整的全栈项目&#xff0c;它涵盖了从用户注册登录到商品展示、购物车管理、订单处…

作者头像 李华
网站建设 2026/10/14 9:47:07

企业级API权限开放平台核心功能与安全实践

1. 平台定位与核心价值解析 Surpass API权限开放平台是企业级接口管理和分发的专业解决方案&#xff0c;其核心价值在于构建标准化、安全可控的API服务生态。我在实际企业数字化转型项目中多次采用该平台&#xff0c;发现它特别适合解决以下三类痛点&#xff1a; 权限管控颗粒…

作者头像 李华
网站建设 2026/10/14 9:47:02

SpringBoot+Vue线上辅导班系统开发实战

1. 项目概述与核心价值 这个基于SpringBootVue的线上辅导班系统管理平台&#xff0c;本质上是一个面向教育行业的轻量级SaaS解决方案。我在实际开发这类系统时发现&#xff0c;它完美解决了传统线下培训机构在学员管理、课程排期、线上互动等方面的痛点。系统采用前后端分离架构…

作者头像 李华
网站建设 2026/10/14 9:45:56

React Native鸿蒙跨平台开发实战:优惠券页面实现

1. 项目背景与目标 最近在探索React Native的鸿蒙跨平台开发能力&#xff0c;决定从实际案例入手&#xff0c;模拟一个电商应用中常见的优惠券页面。这个看似简单的界面实际上涉及了多个关键技术点&#xff0c;包括列表渲染、状态管理、平台适配等。通过这个案例&#xff0c;新…

作者头像 李华
网站建设 2026/10/14 9:45:34

Agent技能化设计:让大模型调用能力稳定可控的工程实践

1. 先把Agent技能化这件事说清楚最近一段时间&#xff0c;“agent-skills”这个词在AI应用开发圈子里出现得越来越频繁。如果你关注过几个智能体项目&#xff0c;大概率见过类似的代码结构&#xff1a;一个skills目录&#xff0c;里面按功能拆了一堆子文件夹&#xff0c;每个文…

作者头像 李华