资讯动态

OpenSSH-Win64部署指南:Windows下SSH服务、密钥登录与批量管理

发布时间:2026/10/7 3:35:02 来源:尧图企业网站定制
简介OpenSSH-Win64.zip 是面向 Windows 平台的 OpenSSH 64 位资源包整合远程登录与文件传输的服务端和客户端组件解决开发人员和系统管理员在 Windows 下缺少原生命令行远程管理工具的问题适用于跨平台连接 Linux 服务器、执行远程命令与安全传输文件等场景。压缩包共 29 个文件大小约 4.86MB以可执行程序、自动化脚本、配置信息、文本说明和动态链接库为主要类型其中可执行程序提供远程登录、安全复制、文件传输、服务守护等常用命令脚本用于安装、卸载和权限修复配置与文档帮助用户快速理解并完成基础设置。目前已有 800 人浏览学习适合偏好命令行操作、不愿依赖第三方图形化软件的用户安装后可在命令提示符中直接调用工具无需额外图形界面。包内还包含密钥管理组件、安全文件传输能力、默认服务配置与辅助文档部署后可建立加密通信隧道有效防范中间人攻击与网络嗅探同时提供独立于系统版本的稳定部署方案。1. 从 Win64 压缩包到 Windows SSH 服务这条部署路径为什么值得复制看到OpenSSH-Win64.zip这个文件名多数人的第一反应是「解压、把 ssh.exe 扔进 PATH、完事」。但实际在 Windows Server 上把 OpenSSH 真正跑起来至少要过三道坎服务怎么注册、密钥权限怎么设、防火墙和 Shell 默认策略怎么配合。这份资源就是一个预编译好的 Windows OpenSSH 发行包解压即用省去自己编译或从 GitHub 拉源码的折腾。它适合三类人需要从 Linux 跳板机管理 Windows 资产的运维、想给内网 Windows 开 SFTP 替代 FTP 的网管、以及在开发机上想用统一ssh命令连 Windows 的开发者。我以前在 CentOS 上升级 OpenSSH 被 PAM 和 SELinux 折腾过好几次换到 Windows 平台之后反而觉得这套 zip 包的设计清爽得多——目录固定、脚本齐全、配置项和 Linux 版几乎一一对应。这篇文章把安装、配置、密钥、避坑一次讲完照着走基本不会翻车。2. 解压之前先看懂包结构目录规划、文件用途与版本确认2.1 OpenSSH-Win64.zip 里到底装了什么下载下来的OpenSSH-Win64.zip建议先解压到固定目录不要随手丢在下载文件夹里就开跑。官方预编译包的目录结构大体如下OpenSSH-Win64/ ├── bin/ │ ├── ssh.exe │ ├── sshd.exe │ ├── scp.exe │ ├── sftp.exe │ ├── ssh-keygen.exe │ ├── ssh-add.exe │ └── ... ├── etc/ │ ├── ssh_config │ └── sshd_config ├── install-sshd.ps1 ├── uninstall-sshd.ps1 ├── FixHostFilePermissions.ps1 ├── FixUserFilePermissions.ps1 └── sshd_config.defaultbin 目录里的sshd.exe就是服务端主程序ssh.exe是客户端sftp.exe和scp.exe负责文件传输。etc 目录下的sshd_config是服务端核心配置ssh_config是客户端默认配置。PowerShell 脚本里最常用的是install-sshd.ps1——它会自动把 sshd 注册成 Windows 服务同时创建sshd这个服务账号。我一般会把整个目录放到C:\Program Files\OpenSSH下后续维护路径好记避免权限错乱。提示解压后的目录路径里尽量不要带中文和空格否则后续 PowerShell 脚本执行和配置解析会多出很多不可控问题。2.2 版本确认与依赖检查Windows 版本太老或者缺少补丁会导致 sshd 启动失败。在解压目录里执行ssh -V和sshd -V能看到具体的子版本号常见输出如下ssh -V # OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2版本号里9.5p1中的 9.5 是 OpenSSH 版本p1 是补丁级别LibreSSL 是它依赖的加密库版本。这个组合信息在排查「某客户端连不上」的时候很有用比如老版本 PuTTY 对ssh-rsa签名算法的支持和新版 OpenSSH 的默认策略已经出现偏差你至少需要知道服务端用的到底哪个算法套件。在正式安装之前我还建议做一次依赖检查。OpenSSH-Win64 包依赖 Windows 自带的几个 DLL少了任何一个 sshd 都起不来。检查方法很简单# 在管理员 PowerShell 中执行 Get-Item C:\Windows\System32\ws2_32.dll, C:\Windows\System32\crypt32.dll -ErrorAction SilentlyContinuews2_32.dll是 Winsock 库sshd 网络通信全靠它crypt32.dll负责证书和加密操作。这两项缺了的话系统本身就已经不正常了建议先补系统补丁再继续装 OpenSSH。用 zip 包部署的优势在这个环节体现得最明显——你完全不需要改注册表或者动系统自带的 WinRM 配置所有东西都隔离在这个目录里。3. 从解压目录到可连服务安装脚本、服务注册与防火墙放行3.1 用 install-sshd.ps1 把 sshd 注册成 Windows 服务很多人在这一步卡住直接双击sshd.exe运行窗口一闪而过回头ssh localhost报 connection refused。原因是 sshd 在 Windows 上必须作为服务运行不能像 Linux 下那样前台跑。正确做法是走官方自带脚本# 必须以管理员身份打开 PowerShell cd C:\Program Files\OpenSSH powershell.exe -ExecutionPolicy Bypass -File .\install-sshd.ps1脚本执行完之后会自动做三件事创建sshd和sshd_server两个账号、把 sshd 注册成名为sshd的 Windows 服务、将服务启动类型设为 Automatic。看到这里你别多想直接用就行。为了确认注册是否成功可以执行Get-Service sshd | Format-List Name, Status, StartType正常情况下输出里 Status 是 Stopped、StartType 是 Automatic。如果这里报错找不到服务多半是执行策略挡住了脚本或者当前 PowerShell 窗口不是管理员权限。以管理员身份打开 PowerShell 之后Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine可以解除脚本执行限制但这会改动本机 PowerShell 策略有安全洁癖的团队建议只对这一个脚本做 Bypass。3.2 首次启动、防火墙放行与自检服务注册成功之后就能启动了分两步走# 启动 sshd 服务并把启动类型设为自动 net start sshd sc config sshd start autosc config里的start auto注意等号后面必须有一个空格这是sc命令的老规矩少了空格会报参数错误。net start sshd如果提示服务已经启动说明 install 脚本里已经自动拉起了服务。接下来最重要的验证是端口监听状态netstat -ano | findstr :22 netstat -ano | findstr :22 | findstr LISTENING第一条能看到所有和 22 端口相关的连接记录第二条只看LISTENING状态。如果这里能看到0.0.0.0:22的监听行说明 sshd 服务本身已经起来了。但外部机器要连过来还差最后一步防火墙放行# 放行 22 端口只允许 TCP 入站 New-NetFirewallRule -Name OpenSSH-Server-In-TCP -DisplayName OpenSSH Server (sshd) -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 -Profile Any这条防火墙规则名里带-Inbound、-TCP、-LocalPort 22含义是只对 TCP 22 端口的入站连接放行不涉及 ICMP 之类的东西。有的环境里安全组策略锁得严还需要在组策略层面额外加一条入站规则但通常New-NetFirewallRule这一步就够了。3.3 sshd_config 首改端口、认证方式和登录权限服务能跑通之后配置文件就要动了。sshd 的主配置在C:\Program Files\OpenSSH\etc\sshd_config进去先看三个关键项# 修改前确认原值再用管理员权限保存 Port 22 PermitRootLogin no PasswordAuthentication yesPort 22是默认端口公网暴露的机器建议改成高位端口比如 22022但内网资产用默认值省心省事。PermitRootLogin在 Windows 上对应的是 Administrator 账号是否允许直接登录测试阶段可以先开 yes上线前务必关掉。PasswordAuthentication决定是否允许密码登录测试阶段保持 yes后面配好密钥再改成 no。改完配置文件必须重启服务才能生效net stop sshd net start sshd每次改配置重启之后建议做一轮自检而不是直接拿生产机器去试。自检命令# 本机回环测试确认服务端自身正常 ssh -p 22 adminlocalhost如果本机能连上说明服务端配置和防火墙规则都正常问题只可能出在网络路由或远端安全组。很多新手在这时候直接拿公网机器来连连不上就怀疑配置实际上本机自检能过滤掉 80% 的误判。4. 密钥登录与多机免密Win64 下生成密钥、拷公钥、改权限4.1 生成密钥对选 Ed25519 还是 RSAWindows 上用ssh-keygen生成密钥对和 Linux 下的语法完全一致# 在客户端机器上生成 Ed25519 密钥对 ssh-keygen.exe -t ed25519 -C opswin-client -f %USERPROFILE%\.ssh\id_ed25519-t ed25519指定算法类型Ed25519 密钥短、性能好、安全性也够-C是注释建议写上用途和归属便于以后区分哪台机器连哪台机器-f指定输出路径Windows 下默认路径是C:\Users\用户名\.ssh\id_ed25519。如果你要连接的旧系统不支持 Ed25519再用-t rsa -b 4096生成 4096 位的 RSA 密钥。生成的私钥文件默认只有当前用户能读Windows 上这一步偶尔会出权限问题后面 4.3 里专门讲。公钥文件扩展名是.pub这个文件可以随便拷没有任何风险。4.2 把公钥部署到 Windows 服务端两种方式公钥部署有两种常见做法第一种是手动把公钥内容追加到服务端的authorized_keys文件里。Windows OpenSSH 的授权文件路径在C:\ProgramData\ssh\administrators_authorized_keys注意不是用户目录下的~/.ssh/authorized_keys——这是 Windows 版和 Linux 版最大的路径差异# 在服务端以管理员身份执行 cd C:\ProgramData\ssh type C:\Users\admin\.ssh\id_ed25519.pub administrators_authorized_keys第二种做法是用ssh-copy-id的 Windows 等价操作——直接scp公钥过去再追加。比如从 Linux 跳板机上往 Windows 推送公钥# 在 Linux 客户端执行把公钥推到 Windows 服务端的临时文件 scp -P 22 ~/.ssh/id_ed25519.pub admin10.0.0.8:C:/ProgramData/ssh/id_ed25519.pub推过去之后再到 Windows 服务端上执行追加命令。我个人推荐第二种因为跳板机上推送公钥是高频场景手动复制粘贴容易漏换行符或截断内容。4.3 权限修正脚本Windows 上密钥失效的头号原因公钥内容放对了但连的时候仍然提示要输密码十有八九是权限问题。Windows OpenSSH 对authorized_keys文件的 ACL 检查比 Linux 严格得多任何「其他用户」的读权限都会导致文件被忽略。官方包提供了一个修正脚本直接执行# 在 OpenSSH 解压目录下执行 powershell.exe -ExecutionPolicy Bypass -File .\FixHostFilePermissions.ps1 powershell.exe -ExecutionPolicy Bypass -File .\FixUserFilePermissions.ps1FixHostFilePermissions.ps1修的是sshd_config、ssh_host_*_key等系统级文件的 ACLFixUserFilePermissions.ps1修的是用户密钥和authorized_keys文件的 ACL。这两个脚本执行完之后可以再手动检查一下授权文件的属主icacls C:\ProgramData\ssh\administrators_authorized_keys输出里应该只能看到NT AUTHORITY\SYSTEM和BUILTIN\Administrators两组权限。如果出现Authenticated Users或Users组说明 ACL 没清干净手动用 icacls 踢掉多余权限icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant SYSTEM:(R) /grant Administrators:(R)/inheritance:r意味着移除所有继承权限/grant SYSTEM:(R)和/grant Administrators:(R)分别给系统和管理员只读权限。这一步做完密钥登录基本就通了。4.4 配置客户端用密钥免密登录服务端部署完公钥客户端这边做两处小调整就能直接免密登录了。在~/.ssh/config里写一个主机别名Host win-prod HostName 10.0.0.8 Port 22 User admin IdentityFile ~/.ssh/id_ed25519Host后面是别名HostName是真实 IP 或域名IdentityFile指向刚才生成的私钥路径。保存后执行ssh win-prod如果还需要输入密码先检查 4.3 的权限再检查这条 config 文件的换行符是不是被 Windows 记事本写成了 CRLF——OpenSSH 对配置文件换行符有严格要求Linux 客户端读取时遇到 CRLF 会报Bad configuration option。至此从 Windows 访问另一台 Windows 或者从 Linux 跳板机访问 Windows 的免密通道已经打通了。5. 常见问题与排查从「连不上」到「连上就被踢」的四个高频翻车现场5.1 现象ssh: connect to host ... port 22: Connection refused的三大原因这个报错是出现频率最高的看到它先分情况如果是「本机连自己」都报这个错说明 sshd 服务根本没在运行。排查顺序# 第一步查服务状态 Get-Service sshd # 第二步查端口监听 netstat -ano | findstr :22 # 第三步如果服务没起来看具体报错 sc query sshd第一次net start sshd失败时事件查看器里会留下启动失败的日志路径是「应用程序和服务日志」→「OpenSSH」→「Operational」。最常见的原因是解压路径有问题C:\Program Files\OpenSSH和默认的C:\Windows\System32\OpenSSH冲突。Windows 10 自带了一个旧版 OpenSSH 客户端如果你的 PATH 里系统目录排在解压目录前面sshd服务加载的配置文件路径会指向系统目录下的sshd_config而你改的是解压目录下的那份结果就是改了等于没改。注意如果你已经用了sc query sshd确认服务在跑但 netstat 看不到 22 端口那基本上就是服务配置文件里的监听项出了问题去看sshd_config的Port行或者在sshd_config同目录下执行sshd -t检查语法。5.2 现象公钥已部署但始终要求密码直到看懂administrators_authorized_keys密钥登录不生效这件事90% 的锅在文件路径和 ACL 上。Windows 上管理员组成员登录时OpenSSH 认的是C:\ProgramData\ssh\administrators_authorized_keys不认~/.ssh/authorized_keys——这是 Windows OpenSSH 特意做的隔离设计避免普通用户把自己的公钥写进管理员授权文件里提权。如果你把公钥放到了用户目录下服务端日志里会反复出现Authentication refused但没有任何明面报错。解决办法就是把公钥挪到 ProgramData 路径下并修正权限。另 10% 的锅在「权限过宽」icacls输出里如果出现NT AUTHORITY\Authenticated Users这种组OpenSSH 出于安全策略会强制忽略这个文件解决方式是走 4.3 节的FixUserFilePermissions.ps1脚本它比手动icacls更全面。5.3 现象Windows 防火墙已放行 22 端口外部机器仍连不上这种情况多发于 Windows Server 上启用了「网络配置文件」隔离。New-NetFirewallRule创建规则时默认-Profile Any但部分云平台的安全组会强制网络类型为 Public而 Server 版本默认对 Public 网络的入站策略是拒绝所有流量。排查方法# 查看当前网络配置类型 Get-NetConnectionProfile # 查看防火墙规则适用的 profile Get-NetFirewallRule -Name OpenSSH-Server-In-TCP | Get-NetFirewallProfile如果 Profiles 列表里没有 Public就重新创建一条只针对 Public 的规则New-NetFirewallRule -Name OpenSSH-Server-In-TCP-Public -DisplayName OpenSSH (Public) -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 -Profile Public另一种可能跟防火墙完全无关sshd_config里配了ListenAddress指定了内网网卡 IP而外部连接走的公网 IP 不在此网卡上。直接把ListenAddress注释掉让 sshd 监听所有网卡。5.4 现象密钥能登录但不执行 Shell或一登录就被断开这多半不是 SSH 本身的问题而是 Windows 侧的默认 Shell 设置异常。OpenSSH 在 Windows 上连接成功后要启动一个 Shell默认是 cmd.exe。如果机器上装了 Git for Windows 或 PowerShell 7它们的安装程序可能会改动注册表里的DefaultShell值指向一个不存在的路径# 查看当前默认 Shell Get-ItemProperty -Path HKLM:\SOFTWARE\OpenSSH -Name DefaultShell # 修改为 cmd.exe Set-ItemProperty -Path HKLM:\SOFTWARE\OpenSSH -Name DefaultShell -Value C:\Windows\System32\cmd.exe改完之后重启 sshd 服务。另外检查sshd_config里有没有Subsystem sftp这一行被注释掉如果注释了sftp连接会直接失败而ssh正常。配置参考Subsystem sftp C:\Windows\System32\OpenSSH\sftp-server.exe注意这里的路径要和你的 sshd 所在路径一致否则 sftp 子系统起不来。6. 从单机部署到多机批量交付用 Win64 包的 ssh.exe 做 Windows 到 Linux 的密钥推送6.1 在 Windows 上做跳板Windows 客户端连接多台 Linux如果你手头是一台 Windows 工作机要为几十台 Linux 服务器批量推送公钥不需要额外安装任何 Linux 工具OpenSSH-Win64包里的ssh.exe、scp.exe和ssh-keygen.exe就足够完成全流程。先在 Windows 上生成密钥对然后用一个批处理脚本循环推送echo off for /f %%i in (servers.txt) do ( echo %%i type %USERPROFILE%\.ssh\id_ed25519.pub | ssh -p 22 admin%%i mkdir -p ~/.ssh cat ~/.ssh/authorized_keys )servers.txt里每行写一台 Linux 服务器的 IP 或主机名。这条命令的含义是读取本机公钥内容通过管道送给远程主机的ssh进程远程端先建目录再追加到authorized_keys。第一次连接会提示确认指纹输入yes即可。注意这台 Windows 机器上需要预先把ssh.exe所在目录加入系统 PATH否则for循环里每一次迭代都要写全路径。6.2 批量部署后必须做的连通性校验推完公钥之后不校验就收工是运维事故的温床。写一个批量校验脚本echo off for /f %%i in (servers.txt) do ( ssh -o BatchModeyes -o ConnectTimeout5 -p 22 admin%%i hostname )-o BatchModeyes是关键参数它禁止 ssh 在需要密码或确认时交互式提示任何需要人工输入的环节都会直接失败——这正是校验免密是否配好的正确姿势。-o ConnectTimeout5限制连接等待时间为 5 秒避免某台机器不响应导致脚本挂死。跑完之后凡是输出主机名的机器就是免密成功的凡是报错或超时的机器需要回头检查公钥和权限。6.3 通过 Win64 内置 sftp 做文件分发替代共享文件夹密钥通道打通之后文件分发可以不再依赖 Windows 共享文件夹。直接用sftp.exe批量上传# 把本地 dist 目录下的所有文件上传到远程服务器的 /data/app 目录 sftp -b batch.txt admin10.0.0.20batch.txt里写的是 sftp 子命令cd /data/app put C:\build\dist\*.zip quitsftp子命令put支持通配符这比scp在批量场景下更灵活。-b参数指定批处理文件避免交互式输入。这套流程配合计划任务就能在 Windows 工作机上实现「编译 → 打包 → 推送到多台 Linux」全程不需要手工登录任何一台机器。从那以后我每次往服务器推包都强制走一遍这套基于 Win64 OpenSSH 的批处理流程再没出现过漏传文件或者权限不对的低级事故。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑