Windows 启用 Telnet 功能与退出命令
打开 启动或关闭 window 功能
WIN+X+F

telnet 退出
ctrl+] quit
启用的完整步骤
WIN + X 打开的是快捷菜单(Windows 8 之后的隐藏菜单,也可以右键开始按钮打开),再按 F 是「程序和功能」。在 Windows 10/11 上这一项已经改成跳转到 设置 → 应用 → 可选功能,需要再点一次「更多 Windows 功能」才能到那个经典的功能列表对话框。
更直接的做法是跳过菜单,WIN + R 输:
optionalfeatures
这条命令直接打开「启用或关闭 Windows 功能」对话框,不管什么版本都能用。在列表里找到 Telnet Client(中文系统是「Telnet 客户端」)勾上,点确定,等它装完。
装完通常不用重启,开一个新的命令行窗口就能用了(已经开着的窗口环境变量没刷新,可能找不到命令)。
命令行方式更快,尤其是要批量装机时。用 DISM(需要管理员权限的 CMD 或 PowerShell):
dism /online /Enable-Feature /FeatureName:TelnetClient
PowerShell 的等价命令:
Enable-WindowsOptionalFeature -Online -FeatureName TelnetClient
查它装没装:
Get-WindowsOptionalFeature -Online -FeatureName TelnetClient | Select-Object State
关掉:
Disable-WindowsOptionalFeature -Online -FeatureName TelnetClient
退出命令的解释
Ctrl + ] 不是「退出」,它是转义字符(escape character),作用是从「和远端交互」的模式切回「telnet 客户端自己的命令模式」。按下之后会看到提示符变成:
Microsoft Telnet>
这时候输入的内容由本地的 telnet 客户端解析,不发给远端。可用的命令有:
quit 断开并退出
close 关闭当前连接但不退出客户端
display 显示当前的操作参数
open <主机> [端口] 连接到指定主机
set / unset 设置参数(比如 set localecho 开启本地回显)
status 显示连接状态
? 或 help 列出所有命令
所以正文的 ctrl+] quit 是两步:先按 Ctrl + ] 进命令模式,再输 quit 回车退出。
有几个实际会遇到的情况:
按了 Ctrl + ] 没反应。某些终端(尤其是 Windows Terminal 里的某些配置、或者远程桌面会话中)会先截获这个组合键。可以试 Ctrl + Shift + ],或者换用传统的 cmd.exe 窗口。
连上之后什么都看不到。这是 telnet 最常见的困惑。原因是很多服务不会主动发欢迎信息,需要你先发送内容它才响应;而且 telnet 客户端默认关闭本地回显(local echo),你敲的字符不显示在屏幕上。想看到自己输入的内容,先在命令模式里开回显:
Ctrl + ]
set localecho
连接被拒绝、想中断连接尝试。Ctrl + C 通常能中断。如果卡住不动(TCP 连接在等超时),直接关窗口。
telnet 最实用的用途:测端口
说实话,用 telnet 真的去登录远程服务器的场景现在基本没了——telnet 协议全程明文,用户名密码在网络上裸奔,早就该被 SSH 取代。它今天的主要价值是测某个 TCP 端口通不通。
telnet 192.168.1.100 3306
结果的判读:
- 屏幕清空、光标闪烁,或者出现一堆乱码 → 端口是通的,TCP 握手成功。乱码是因为对方按自己的协议发了握手数据(MySQL、Redis 都会),telnet 按文本显示所以是乱码。看到乱码是好事。
正在连接... 无法打开到主机的连接。 在端口 xxxx: 连接失败→ 不通。原因可能是服务没起、防火墙挡了、或者 IP 不对。- 一直卡着不返回 → 通常是防火墙 DROP 了包(不是 REJECT),只能等 TCP 超时。这本身也是个信息:说明中间有防火墙在静默丢包。
排查思路上,telnet 能帮你把问题定位到网络层还是应用层:telnet 能连上说明网络路径和端口监听都没问题,问题在应用层(认证、协议、业务逻辑);连不上就是网络或者服务没起,别去查应用配置。
PowerShell 的替代命令更好用
Windows 上现在其实不用装 telnet 就能测端口,PowerShell 自带的命令更清晰:
Test-NetConnection -ComputerName 192.168.1.100 -Port 3306
简写是 tnc:
tnc 192.168.1.100 -Port 3306
它的输出是结构化的,直接告诉你结论:
ComputerName : 192.168.1.100
RemoteAddress : 192.168.1.100
RemotePort : 3306
InterfaceAlias : 以太网
SourceAddress : 192.168.1.50
TcpTestSucceeded : True
TcpTestSucceeded 就是答案,不用去猜乱码和空屏是什么意思。而且它还顺带做了 ping 和路由查询,信息更全。
只要一个布尔值的话:
(tnc 192.168.1.100 -Port 3306).TcpTestSucceeded
批量测多个端口:
80, 443, 3306, 6379 | ForEach-Object {
$r = tnc 192.168.1.100 -Port $_ -WarningAction SilentlyContinue
"$_ : $($r.TcpTestSucceeded)"
}
-WarningAction SilentlyContinue 是为了抑制连接失败时的黄色警告文字,让输出干净。
在 macOS / Linux 上对应的工具是 nc:
nc -zv 192.168.1.100 3306
-z 只扫描不发数据,-v 输出结果。这个是我在 Mac 上排查端口最常用的命令。
用 telnet 手动发 HTTP 请求
telnet 还有一个学习价值:它让你能手工敲 HTTP 协议,直观理解请求报文的结构。
telnet example.com 80
连上后输入(注意最后要多敲一个空行,表示请求头结束):
GET / HTTP/1.1
Host: example.com
Connection: close
回车两次,服务器会返回完整的响应,包括状态行、响应头、空行、响应体。
这个练习能把「HTTP 是纯文本协议」这件事变成亲身体验,比看文档印象深。前面那篇讲 GET 和 POST 区别的文章里说的报文结构,在这里能直接验证——手动敲一个 POST 请求,你会立刻明白为什么必须写 Content-Length(不写的话服务器不知道 body 到哪结束,会一直等)。
注意 HTTPS 端口(443)不能用 telnet,因为它需要先做 TLS 握手。等价的操作用 openssl:
openssl s_client -connect example.com:443 -crlf
握手完成后同样可以手敲 HTTP 请求。-crlf 是让回车发送标准的 \r\n(HTTP 要求的行结束符),不加的话某些服务器不认。
一条安全提醒
telnet 客户端装上没什么风险,它只是个工具。有风险的是 telnet 服务端(Telnet Server,在同一个功能列表里,但 Windows 较新版本已经移除了这一项)。
如果你在某台机器上看到 23 端口在监听,那基本可以确定是个安全问题——明文协议加上通常配置薄弱的认证,是入侵者最喜欢的入口之一。物联网设备的大规模僵尸网络(比如 Mirai)主要就是通过扫描开放的 telnet 端口 + 默认密码传播的。
查本机有没有 23 端口在听:
Get-NetTCPConnection -LocalPort 23 -ErrorAction SilentlyContinue
有输出就去关掉对应的服务。管理远程机器一律用 SSH,Windows 上现在也自带 OpenSSH(在「可选功能」里能装 OpenSSH 服务器),没有理由再用 telnet 做远程登录。

还没有留言,来发表第一条吧~