ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows OpenSSH在线与离线安装完全指南:从原理到实践

Windows OpenSSH在线与离线安装完全指南:从原理到实践 最近这几个月身边问OpenSSH在Windows上怎么装的人突然多起来了。有的是因为要往Windows Server上做文件同步有的是想用VS Code的Remote-SSH连回家里那台Windows开发机还有的是公司内网环境压根连不上外网只能靠内网源或者U盘拷安装包。我把在线和离线两条路都实际走了一遍把踩过的坑和绕过的弯整理成这篇方便你直接照着操作。先说个结论如果你手头是Windows 10 1809以上版本或者Windows Server 2019以上系统里其实已经自带了OpenSSH客户端服务器端sshd也内置了但默认不启用。你要做的不是“安装”而是“启用”功能。而离线安装的本质是把系统自带的OpenSSH可选功能包从某台能上网的机器上提取出来再拷贝到目标机上手动加进去。搞清楚这个逻辑后面所有步骤就顺了。1. 内容整体设计与思路拆解1.1 为什么OpenSSH在Windows上这么重要以前Windows之间传文件最常用的是共享文件夹或者FTP但这俩在跨网段、跨域、穿透防火墙时特别难受而且明文传输总觉得不踏实。OpenSSH直接把Linux世界那套成熟的远程管理和文件传输能力带到了Windows上你可以在本地用ssh命令连到Windows机器也可以用scp、sftp命令直接传文件还能通过公钥登录彻底告别密码。对做运维和开发的人来说这意味着统一管理入口。你不需要再记住Windows远程桌面那个IP加端口不需要再为共享文件夹的权限配置头大一条ssh命令就能进到Windows的命令行环境再配合PowerShell能做的事非常多。对普通用户来说OpenSSH最大的价值是安全传文件。以前往服务器上传压缩包我都是先传到跳板机再转发现在直接用sftp拖过去就行加密通道不用担心被截获。1.2 在线安装与离线安装的方案选型对比选哪种方式主要看你的网络环境和系统版本。我做了一个对比方便你快速判断对比维度在线安装离线安装前置条件系统能正常访问外网Windows Update服务正常无网络要求但需要一台同架构x64/ARM64、同系统版本的在线机器做“搬运工”操作复杂度低鼠标点几下或两条命令搞定中等需要提取组件、拷贝文件、手动注册适用场景个人开发机、家庭服务器、有外网权限的办公机内网隔离环境、等保要求严格的服务器、无外网的虚拟机失败率较低偶尔会遇到Windows Update服务卡住较低但容易因为系统版本不匹配导致组件无法识别迁移性差换台机器要重新装好打成一个离线包之后同版本系统都能用我的建议是只要网络条件允许优先走在线安装省心省力。但如果你的Windows Server是放在IDC机房、且安全策略比较严的那种还是老老实实做离线包别想着临时开外网权限流程审批能让你等到怀疑人生。1.3 安装前必须确认的系统前提在动手之前有件事比安装本身更重要确认你的Windows版本和系统架构。支持内置OpenSSH的系统版本Windows 10 18092018年10月更新及之后的所有版本、Windows Server 2019及之后的所有版本。如果你的系统比这个旧先升级系统别浪费时间折腾老版本。查看系统版本的方法WinR输入winver回车看版本号或者打开PowerShell输入Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, OsArchitecture。查看系统架构在PowerShell里输入echo $env:PROCESSOR_ARCHITECTURE输出AMD64就是64位ARM64就是ARM机器这个信息在离线安装时尤其重要因为不同架构的组件包不通用。另外无论在线还是离线安装安装完成后都建议把Windows防火墙的对应端口放行默认是22端口。这一步经常被忽略结果装完发现连不上排查半天才发现是防火墙拦了。2. 在线安装最快的路径与实操细节2.1 通过图形界面启用OpenSSH服务器这个方法适合不熟悉命令行的朋友跟着鼠标点就行。打开“设置”点击“应用”然后选择“可选功能”。点击“添加功能”按钮在搜索框里输入“OpenSSH”。你会看到两个结果“OpenSSH客户端”和“OpenSSH服务器”。客户端是用于连接别人的服务器是让别人连你的。如果你只是需要ssh连接到别的机器装客户端就行如果你需要被连接必须装服务器端。建议两个都装上免得后面用到再补。勾选后点击“安装”系统会开始安装一般两三分钟就能完成具体时间取决于你的网络和硬盘速度。装完之后按WinX选择“终端管理员”或者“Windows PowerShell管理员”输入Get-Service sshd如果能看到状态为“已停止”的sshd服务说明安装成功只是还没启动。2.2 通过PowerShell命令快速安装如果你习惯用命令行这个方法更快。用管理员身份打开PowerShell依次执行以下命令# 安装OpenSSH客户端 Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 # 安装OpenSSH服务器 Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0命令执行完后会显示一个Path和RestartNeeded字段。如果RestartNeeded为False说明无需重启即可继续如果是True建议重启后再启动服务。然后启动服务并设置为开机自启# 启动sshd服务 Start-Service sshd # 设置sshd服务为自动启动这样重启电脑后也会自动运行 Set-Service -Name sshd -StartupType Automatic # 顺便把ssh-agent也配置好方便后面做密钥管理非必须但推荐 Set-Service -Name ssh-agent -StartupType Automatic Start-Service ssh-agent这里有个小细节Add-WindowsCapability这个命令是向Windows功能存储中添加功能包而不是传统的下载安装包。它本质上是解析系统自带的组件清单所以你不需要去官网下载任何东西只要系统能联网就行。2.3 在线安装后的防火墙放行与首次测试安装完成后Windows防火墙大概率会弹出提示问你是否允许sshd通信如果没弹就手动放行。管理员PowerShell执行# 放行22端口TCP所有配置文件都生效 New-NetFirewallRule -Name sshd -DisplayName OpenSSH Server (sshd) -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22接着测试一下服务状态# 查看服务状态 Get-Service sshd # 查看监听端口 netstat -an | findstr :22如果服务已经在运行且22端口处于LISTENING状态说明安装成功。这时候你可以在同一局域网的另一台机器上用ssh 用户名这台机器的IP试连一下用户名就是Windows登录用户名比如Administrator或者你自己的账号名。这里有个很坑的地方当你第一次用密码登录时如果用户名写的是administrator计算机名系统会提示密码错误。需要确认你用的用户名是不是纯用户名比如ssh admin192.168.1.100而不要加主机名后缀。Windows的OpenSSH对用户名解析有时比较挑剔多试几次就明白了。3. 离线安装内网环境的救命稻草3.1 离线安装的核心原理提取系统内建组件离线安装OpenSSH并不是去网上下载一个像Linux那样的.tar.gz或.rpm然后解压配置。Windows的OpenSSH是一个“可选功能”它其实已经躺在系统镜像里了我们要做的是把它从功能存储里提取出来再在目标机上以离线方式安装。具体来说Windows的功能包存储在C:\Windows\WinSxS目录里OpenSSH功能包也在这里。在一台能联网的同版本机器上我们可以用Add-WindowsCapability让它装好而在离线机器上我们需要把那几个.cab文件找到并拷贝过去。这个思路和Linux离线装软件完全不一样Linux是下载rpm/deb包Windows是把系统内部的功能组件拷出来用。理解了这一点你就明白为什么离线安装需要“同系统版本”了——因为WinSxS里的组件是和系统版本强关联的Win10 21H2的组件包放在Win10 1909上大概率是装不上的。3.2 在在线机器上提取OpenSSH离线组件包第一步找一台与你目标机系统版本一致必须一致最好连补丁级别也接近的在线电脑。在这台电脑上以管理员身份打开PowerShell执行以下命令查看OpenSSH的详细信息# 查看OpenSSH组件的详细信息 dism /online /get-featureinfo /featurename:OpenSSH.Server dism /online /get-featureinfo /featurename:OpenSSH.Client执行完后你会看到类似于“文件C:\Windows\WinSxS\...”的信息里面列出了这个功能对应的所有文件路径。接下来用dism命令把组件的安装源导出。具体做法是# 创建一个临时目录 mkdir C:\openssh_offline mkdir C:\openssh_offline\Server mkdir C:\openssh_offline\Client # 导出服务器端组件 dism /online /export-source /featurename:OpenSSH.Server /source:C:\openssh_offline\Server # 导出客户端组件 dism /online /export-source /featurename:OpenSSH.Client /source:C:\openssh_offline\Client执行完后C:\openssh_offline下会有两个子文件夹里面就是.cab格式的组件包。把整个openssh_offline文件夹拷到U盘或者内网共享路径上备用。3.3 在离线机器上手动安装组件包拿到离线包后在目标机器上把U盘插好或把离线包放到本地磁盘然后用管理员权限打开命令提示符或PowerShell执行# 进入离线包目录 cd /d D:\openssh_offline # 添加服务器端组件 dism /online /add-package /packagepath:D:\openssh_offline\Server # 添加客户端组件 dism /online /add-package /packagepath:D:\openssh_offline\Client需要注意上面这个/packagepath参数要替换成你实际的路径。如果目录下有多个.cab文件可以这样一次性加多个包dism /online /add-package /packagepath:D:\openssh_offline\Server\xxx.cab /packagepath:D:\openssh_offline\Server\yyy.cab实际上你会在Server目录里看到不止一个.cab文件它们分别是功能主体和语言包之类的依赖项。用/packagepath:D:\openssh_offline\Server这种方式dism会把这个目录下所有的.cab都尝试添加进去很方便。添加完成后用以下命令确认功能已经变为“启用”状态dism /online /get-featureinfo /featurename:OpenSSH.Server dism /online /get-featureinfo /featurename:OpenSSH.Client看到“状态已启用”就说明组件安装成功了。3.4 为什么离线安装容易失败及如何避免离线安装失败最常见的原因就两个系统版本不匹配和组件路径错误。系统版本不匹配你在一台Windows 10 21H2上导出的组件拿到Windows 10 22H2上去装可能就会报“组件存储已损坏”或者“无法添加程序包”。解决方法是严格匹配版本最好连内部版本号如19044、19045这种都一致。组件路径错误有些教程会让你直接拷贝C:\Windows\WinSxS下的某个文件夹但WinSxS里的文件名带了一长串哈希后缀手动找很容易漏。用dism /online /export-source导出的目录结构是干净的不会有这个问题。还有一个易错点如果你在离线机器上执行Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0它会尝试联机查找更新如果内网没有WSUS或Windows Update服务器命令就会卡住或报错。所以离线环境一定要用dism /online /add-package不要用Add-WindowsCapability。3.5 快速打包便携版OpenSSH备用方案除了正经的dism方式还有一个“野路子”直接从GitHub上微软的Win32-OpenSSH仓库下载最新版的压缩包解压到目标机器的C:\Program Files\OpenSSH然后手动安装服务。这个方法的好处是不依赖系统版本任何Windows都能用而且能拿到比系统内置更新的版本。缺点是需要你在有网的时候提前下载好压缩包并且需要手动配置服务稍微麻烦一点。具体做法是这样的在有网的机器上打开https://github.com/PowerShell/Win32-OpenSSH/releases下载最新的OpenSSH-Win64.zip64位系统或OpenSSH-Win32.zip32位系统。解压后把整个目录拷到目标机的C:\Program Files\OpenSSH。管理员权限打开PowerShell进入该目录执行cd C:\Program Files\OpenSSH powershell -ExecutionPolicy Bypass -File install-sshd.ps1脚本执行完成后服务就装好了。后面启动服务、防火墙放行的步骤和前面在线安装一致。这个方案比dism离线包更适合“跨版本迁移”比如你的目标机是Windows Server 2016这种不带内置OpenSSH的老系统用这个方案就能直接补上。我实测过在Server 2016上部署Win32-OpenSSH运行起来很稳定唯一要注意的是PowerShell执行策略需要改一下否则脚本会被拦。4. 配置初始化与密钥登录实操4.1 修改sshd配置文件的几个必要项安装完成后ssh服务的配置文件在C:\ProgramData\ssh\sshd_config。这个路径比较隐蔽因为ProgramData默认是隐藏文件夹。用管理员权限打开记事本编辑它或者直接用PowerShellnotepad C:\ProgramData\ssh\sshd_config打开后有几个配置项需要检查Port 22默认是22如果你要改端口改完记得同步更新防火墙规则。PermitRootLogin这个参数在Windows上默认是prohibit-password对应的是Administrator账户是否允许登录。如果你用管理员账户登录保持默认即可。PasswordAuthentication yes确认这一行的值是yes否则密码登录会被禁用只能走密钥新手很容易在这里卡住。PubkeyAuthentication yes这个是公钥认证开关如果要配密钥登录必须确认它是yes。改完配置后记得重启sshd服务让配置生效Restart-Service sshd这里有个坑如果你修改了配置但没有重启服务连接时可能还是会走旧配置而且Windows事件日志里也不会报错非常隐蔽。每次改配置都养成重启服务的习惯。4.2 密钥登录配置全流程免密码登录如果你厌倦了每次输密码可以配密钥登录。流程和Linux上很像但有些细节不一样。第一步在客户端生成密钥对假设你用的Windows客户端ssh-keygen -t ed25519 -C your_emailexample.com一路回车会在C:\Users\你的用户名\.ssh\下生成id_ed25519私钥和id_ed25519.pub公钥。第二步将公钥上传到服务器单条命令就能完成type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh 用户名服务器IP mkdir -Force $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value $input如果这条命令执行报错问题多半出在远程命令的引号解析上。可以把公钥内容复制到剪贴板然后登录服务器手动在服务器上创建C:\Users\你的用户名\.ssh\authorized_keys文件把内容粘贴进去。注意authorized_keys文件不要加扩展名很多新人会存成authorized_keys.txt这样是不生效的。第三步测试免密登录ssh 用户名服务器IP能直接进入命令行就说明配置成功。4.3 服务启动类型与安全加固建议OpenSSH服务默认不是开机自启的需要手动设置。除了前面提过的Set-Service命令也可以在“服务”管理界面services.msc里找到OpenSSH SSH Server把启动类型改为“自动”。安全方面有几件事我建议你在配置完服务后顺手做掉改默认端口编辑sshd_config把Port 22改成其他高位端口比如2222可以减少很多扫描器的骚扰。但改完要同步改防火墙规则和客户端连接参数。禁用密码登录如果使用了密钥登录可以把sshd_config里的PasswordAuthentication设置为no彻底杜绝暴力破解。但前提是你的密钥别丢否则你就进不去了。限制登录用户在sshd_config末尾加上AllowUsers 用户名1 用户名2只允许指定用户登录其他用户一律拒绝。防火墙限制来源IP在防火墙规则里设置RemoteAddress为你信任的IP网段这样即使端口暴露在外网不信任的来源也连不进来。这些操作都不复杂但确实能显著提高安全性。我见过太多人把22端口裸奔在公网上日志里全是凌晨三点从国外IP来的登录尝试看得人头皮发麻。5. 常见问题与排查技巧实录5.1 服务启动失败或无法监听的排查思路OpenSSH服务启动失败时Windows事件查看器会记录错误原因。打开“事件查看器”展开“Windows日志”-“应用程序”找来源为OpenSSH的事件记录往往能看到具体的报错信息。常见报错一sshd: no hostkeys available说明系统里没有主机密钥需要手动生成。管理员PowerShell执行以下命令ssh-keygen -A它会生成ssh_host_rsa_key、ssh_host_ecdsa_key等文件。生成后重启sshd服务即可。常见报错二端口被占用比如其他程序已经占用了22端口。用netstat -ano | findstr :22查看占用进程的PID然后用tasklist | findstr PID确认是哪个进程。如果确定要杀掉taskkill /PID PID /F。常见报错三权限问题导致服务无法启动Windows的OpenSSH对配置文件权限要求比较严格。如果sshd_config或authorized_keys文件的所有者不是SYSTEM或Administrators服务可能启动失败。可以右键文件-属性-安全把Administrators的完全控制权限加上。5.2 连接被拒绝或超时的排查思路如果服务正常监听但客户端连不上按以下顺序排查防火墙确认防火墙里有没有放行对应端口。可以用Test-NetConnection 服务器IP -Port 22在客户端测试如果显示TcpTestSucceeded为False说明端口不通检查防火墙规则。服务监听地址确认sshd监听的是0.0.0.0而不是127.0.0.1否则只能本机访问。在服务器上执行netstat -an | findstr :22如果看到的是127.0.0.1:22说明配置有问题检查sshd_config里有没有ListenAddress 0.0.0.0。网络连通性确认两台机器能互相ping通。如果ping不通检查是否在同一网段、路由是否正常、有没有开防火墙的ICMP回显。5.3 密码正确却提示拒绝授权的排查思路这个坑比较隐蔽。如果你的密码肯定没错但登录时提示Permission denied, please try again可能性有三个用户名问题Windows用户名区分大小写的情况不多但如果你启用了“仅允许特定用户”的配置可能会因大小写不匹配被拒。用whoami查一下自己的完整用户名。账户被锁定如果你用Windows的Microsoft账户登录系统会通过联机验证这时候OpenSSH可能无法正常验证微软账户密码。解决办法是改用本地账户或者在system上创建一个专门用于登录的本地账户。服务账户问题sshd服务默认以LocalSystem账户运行如果你改过服务的“登录身份”设置可能会导致验证逻辑异常。在服务管理里把sshd的登录身份改回“本地系统账户”。5.4 开始之前必须养成的备份习惯无论在线还是离线安装操作前我都建议你对系统做一个还原点。尤其是在服务器上别觉得自己操作熟练就跳过这一步。万一配置改错了导致服务起不来一个还原点能把你从深夜加班中解救出来。创建还原点的方法WinR输入sysdm.cpl回车切到“系统保护”选项卡选择系统盘通常是C盘点击“配置”确认已开启保护然后点击“创建”并输入一个描述即可。6. 两类安装方式的适用场景再回顾写到这里在线和离线的安装逻辑已经完整铺开了。最后再根据我这段时间的实操经验把两条路线的适用场景做一次总结。在线安装适合谁开发人员想把远程开发环境搭起来图省事。家里有多台Windows设备需要互传文件不想插U盘。公司办公机有外网权限但不想走IT流程申请软件分发。离线安装适合谁内网机房的Windows Server零外网权限但有同版本的跳板机可以操作。客户现场部署网络环境未知提前准备好离线包最稳妥。对系统版本有严格要求不敢轻易从外网下载未知来源的安装包。我个人在实际操作中体会最深的一点是离线安装OpenSSH真正的难点不在“执行安装”那一步而在于“如何理清Windows功能包的逻辑”。很多人觉得Linux上装软件是解压配置Windows应该也差不多结果被dism和WinSxS搞得晕头转向。其实只要记住“Windows的OpenSSH是系统可选功能不是独立软件”后面的一切都能对上号。最后再分享一个小技巧无论在线还是离线安装安装完成后都第一时间用ssh -V确认一下版本号然后记录到文档里。不同版本的OpenSSH在某些行为细节上有差异比如Windows自带的8.x版本不支持某些新的加密算法而GitHub上的9.x版本则更完整。把版本记录下来后续排查问题时能节省大量时间。
返回列表