在Windows命令行里查看SSH服务器是否在运行,核心就一条命令:sc query sshd,它会直接告诉你服务状态是RUNNING还是STOPPED。如果你用的系统版本较旧或做了精简,可能连服务名都不一样,那就得先确认OpenSSH Server到底装没装,下面我把完整的排查路径、启动命令和端口测试方法一次讲透。
用服务命令查看SSH服务当前状态
SSH服务在Windows上以“服务”的形式常驻后台,要查看它是否在运行,最稳妥的方式就是查询服务状态,这里涉及两条常用命令,适用场景略有区别。
sc query是最直接的检查方式
按下Win + R,输入cmd回车打开命令行窗口,如果你想检查本机是否安装了SSH服务器并且正在运行,执行:
sc query sshd
返回的结果里,关键是看STATE这一行,如果显示RUNNING,说明SSH服务活着;如果显示STOPPED,说明服务装了但没启动;如果提示“指定的服务未安装”,说明你这台机器压根没装OpenSSH Server。
行业共识认为,sc query这种查询方式对所有Windows版本通用,而且返回结果稳定,不受PowerShell执行策略限制,它在命令行环境下的响应速度也是最快的,适合写进批量运维脚本。
PowerShell版服务状态查询
如果你习惯用PowerShell,等价命令是Get-Service sshd,它会输出一个表格,Status列显示Running表示正常,Stopped表示已停止。
Get-Service的好处是能按需要格式化输出,比如只看状态:
Get-Service sshd | Select Name, Status, StartType
从实用角度看,sc query更适合快速看结果,Get-Service适合做后续脚本处理,两个命令本身效果一致,选哪个看你手头环境。
服务显示未运行,命令行怎么启动
不少人在排查时发现SSH服务确实装了,但状态是STOPPED,那就要主动拉起来,这一步用管理员权限打开命令行,执行:
net start sshd
正常会提示“服务已经启动成功”,这个操作是即时生效的,不需要重启电脑,如果你想让它在每次开机时自动运行,还需要改一下启动类型:
sc config sshd start= auto
注意auto前面有个空格,这是sc命令的语法要求,写错了会报参数错误,改完之后可以用sc query sshd再次确认,看到RUNNING就说明状态正常了。
启动失败的常见原因
实际操作中,net start sshd偶尔会启动失败,报错信息通常是两种:一是“服务启动后停止”,二是“系统错误5”。
- 服务启动后停止:多半是配置文件
C:ProgramDatasshsshd_config写错了,最常见的是端口被占用或监听地址配了无效IP,可以查看Windows事件查看器里的OpenSSH日志来定位具体原因。 - 系统错误5:说明当前命令窗口没有管理员权限,右键以管理员身份重新打开再执行即可。
还有一种隐蔽情况:系统里安装了第三方SSH工具比如Bitvise SSH Server或FreeSSHd,它们也占用22端口,这时候内置的sshd自然起不来,建议先用下面介绍的端口检查方法全局看一下。
用命令行验证SSH端口是否在监听
服务显示RUNNING不一定代表SSH就能连上,因为端口可能被防火墙拦截,命令行本身就是最好的检测工具,我们分两步走。
本机端口监听状态
执行这条命令,会显示当前所有TCP监听状态:
netstat -ano | findstr :22
如果看到LISTENING,说明SSH服务确实在22端口上监听了,如果什么都没有,说明要么服务没起,要么SSH改了非默认端口,这时候再看一下sshd_config里的Port配置,确认实际端口号,再改netstat的过滤条件。
比较专业的建议是直接用PowerShell的Test-NetConnection来测连通性:
Test-NetConnection 127.0.0.1 -Port 22
输出的TcpTestSucceeded字段为True时,代表从本机视角看端口是通的,这一招对Windows 10和Windows Server 2019以上版本都有效。
Windows默认防火墙是否放行
如果端口没监听,另一个常见原因是防火墙把入站规则拦了,查看22端口入站规则:
netsh advfirewall firewall show rule name=all | findstr "22"
Windows安装OpenSSH Server时一般会自动创建名为“OpenSSH SSH Server”的入站规则,但有些精简版系统或改过配置后规则会丢失,重新添加规则可以这样干:
netsh advfirewall firewall add rule name=OpenSSH dir=in action=allow protocol=TCP localport=22
执行后建议再跑一次Test-NetConnection验证,确认端口从外部视角已经可访问,很多手头没有远程机器的人,容易在这一步卡住,实际上就是用本机IP测一遍就能解决问题。
win10查看ssh服务是否安装?分清两种情形
检查SSH服务状态之前,先要确认服务到底在不在,Windows的OpenSSH分客户端和服务器端两个组件,不少人装完客户端就以为服务器也装了,其实完全不是一回事。
用命令行查已安装的Windows功能
PowerShell下执行:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH'
结果会显示OpenSSH.Client
和OpenSSH.Server两个条目,State字段为Installed代表已安装,只看到Client的话,你的SSH服务端还没装,sc query sshd当然查不到东西。
早期Windows 10 1803及之前版本的检查方式略有不同,可以用:
dism /online /get-features | findstr OpenSSH
这种方式比较老,但依然能跑,安装SSH服务器端组件则执行:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
安装完成后,sc query sshd就能识别到服务项了,命令执行需要一定的权限,普通用户无法直接添加系统功能组件。
服务器版系统上的差异
Windows Server系统自带的是OpenSSH.Server功能,管理员可以通过Server Manager图形界面安装,但更加快捷的依然是命令行方式,在2019/2026版本上,执行和Win10完全相同的Add-WindowsCapability命令即可。
服务器的服务名称和客户端Windows一致,也是sshd,但需要注意的是,Windows Server默认可能启用的是sshd和ssh-agent两个服务,前者是主要的SSH服务,后者用于代理密钥,检查运行状态时务必区分两者。
能ping通远程服务器但SSH连不上
这个场景在远程运维时出现率极高,服务器上确保sshd服务在运行后,SSH连接仍然失败,一般问题出在以下几个环节,从命令行判断,一条条排除。
换个端口试试远程SSH服务是否可以连接
可以拿本地OpenSSH客户端指定端口推出一个连接试试:
ssh -p 22 用户名@远程IP
如果客户端主动超时或直接拒绝,说明服务端的问题,可以加-v参数获得详细的调试输出:
ssh -v 用户名@远程IP
输出的信息里,Connection established表示TCP链路通,后面SSH2_MSG_KEXINIT处理到一半断掉,多数是加密算法或版本不兼容。
检查运维机本地的SSH服务是否处于运行状态
如果你只想确认本机是不是SSH服务器,执行刚才讲过的sc query sshd和netstat -ano | findstr :22两条命令就够了,两条都通过的情况下,本地的SSH服务对局域网是开放的,远程不能连接,那就是云安全组或公司防火墙域名白名单的策略问题。
这里多说一句,云服务器厂商的安全组规则和Windows防火墙是两套独立系统,命令行里放行本地防火墙后,还需要去云控制台确认安全组入方向规则是否放行了TCP 22端口,不然服务明明在跑,外部就是连不进来。
查看SSH服务运行的日志与排错
排查SSH服务运行异常时,命令行只是入口,日志才是决定性证据。
事件日志里找错误代码
Windows的OpenSSH服务事件会写入“应用程序和服务日志”下的OpenSSH节点,用命令行快速提取:
wevtutil qe "OpenSSH/Operational" /c:10 /rd:true /f:text
这条命令列出最近10条SSH运行日志,每条记录里有时间、错误码、具体描述,常见的exit status 255对应客户端连接被服务端拒绝,这时候去查看sshd_config的AllowUsers或DenyUsers规则。
如果只想看特定时间段或特定错误码,wevtutil也支持/q参数配合XPath查询,不过对多数场景来说,/c指定最近条数已经足够。
SSH服务的进程与依赖关系检查
有时候服务状态正常,但进程已经僵死,需要查看实际进程:
tasklist | findstr sshd
这可以看到sshd.exe进程的PID和内存占用,如果服务状态是RUNNING但找不到这个进程,那说明服务管理器和实际进程出现了不一致,一般用taskkill /PID 进程ID /F强制结束再重启服务即可。
另一种情况是sshd依赖的sockets服务被禁用,查看依赖关系:
sc enumdep sshd
返回的结果显示SSH Agent Service和Socket Activation Service的启动状态,这两个依赖服务如果被手动修改为禁用状态,sshd即使强行启动也会秒退。
Windows SSH服务运行常见问题速答
ssh命令提示“不是内部或外部命令”怎么办?
说明系统没安装OpenSSH客户端组件,执行Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0安装,完成后重新打开命令行,如果是精简版系统,也可以直接用完整路径C:WindowsSystem32OpenSSHssh.exe调用。
服务显示Running但端口不通,怎么排查?
先用netstat -ano | findstr :22确认监听状态,若监听了,再用Test-NetConnection 本机IP -Port 22测试防火墙,最后检查云安全组入方向规则是否放行,按这个顺序走,大部分问题会定位在防火墙或安全组上。
Windows自带的SSH服务性能如何?
对一般开发调试和日常运维,Windows原生OpenSSH运行稳定,开销较低,但并发连接数较多的文件传输场景,Linux环境下配置更灵活的sshd往往更游刃有余,Windows上调整TCP连接数和并发限制的设置相对有限,这是架构决定的。
命令行本身不复杂,sc query sshd这条命令决定了你能不能快速掌握当前SSH服务运行状态,在此基础上,把启动、端口验证、日志排查三件事串起来,Windows下管理SSH服务就能得心应手,剩下的无非是遇到问题按流程逐层排除。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/696736.html





