telnet 基本用法
telnet
命令作为一个轻量级、通用的 TCP 客户端和网络调试工具,在以下场景仍然非常有用:
- 快速测试端口开放性: 检查目标机器的某个 TCP 端口是否可达、是否有服务在监听。
- 调试应用层协议: 手动与 HTTP、SMTP、POP3、IMAP、FTP(控制通道)、Redis、Memcached 等基于文本的协议的服务进行交互,观察原始请求和响应。这对于理解协议行为、诊断服务问题非常有效。
- 验证服务初始响应: 连接后,许多服务会立即发送一个欢迎标语或状态信息(如 SMTP 的
220
消息),telnet
可以立即看到这些信息。
使用 Telnet 的基本语法
telnet [hostname or IP address] [port]
hostname or IP address
: 目标服务器的主机名或 IP 地址。port
: 目标服务监听的 TCP 端口号。
退出 Telnet 会话:
-
如果连接成功,通常能看到
Escape character is '^]'.
信息。 -
此时,按
Ctrl + ]
(先按住 Ctrl 键,再按右方括号键]
) 会进入命令模式,显示telnet>
命令提示符。 -
在
telnet>
提示符下输入quit
或q
,然后按回车,即可完全退出 Telnet。
实用 Telnet 示例
示例 1:测试 TCP 端口是否开放(基本连接)
目标: 检查主机 192.168.1.100
上的 8080
端口是否有服务在监听。
telnet 192.168.1.100 8080
可能结果:
-
连接成功 (端口开放,服务监听):
Trying 192.168.1.100... Connected to 192.168.1.100. Escape character is '^]'.
-
连接被拒绝 (端口无服务监听):
Trying 192.168.1.100... telnet: Unable to connect to remote host: Connection refused
-
连接超时 (防火墙阻断/网络不通/主机宕机):
Trying 192.168.1.100... telnet: Unable to connect to remote host: Connection timed out
示例 2:调试 HTTP 服务(手动发送 HTTP 请求)
目标: 手动向运行在 www.example.com
端口 80
的 Web 服务器发送一个简单的 HTTP GET 请求,获取根路径 (/
) 的内容。
telnet www.example.com 80
连接成功后(看到 Connected...
和 Escape character...
),在光标处手动输入以下内容(必须精确,包括空格和两次回车):
GET / HTTP/1.1
Host: www.example.com
(注意:在输入完 Host: www.example.com
后,需要按 两次 回车键来表示 HTTP 请求头结束)
结果:服务器会返回完整的 HTTP 响应,包括状态行、响应头和响应体(HTML 源代码)。
HTTP/1.1 200 OK
Date: Mon, 03 Jun 2025 12:34:56 GMT
Server: Apache/2.4.41 (Unix)
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Connection: close<!DOCTYPE html>
<html>
<head><title>Example Domain</title>... (网页HTML内容) ...
</html>
Connection closed by foreign host. <-- 服务器关闭连接
用途: 检查 Web 服务器是否响应、观察原始 HTTP 头和内容、诊断负载均衡或代理问题、测试简单的 API 端点(如果知道 URL 和需要的 Headers)。
示例 3:调试 SMTP 邮件服务器(发送测试邮件)
目标: 手动连接邮件服务器 mail.example.com
的 SMTP 端口 25
,模拟发送一封测试邮件。
telnet mail.example.com 25
连接成功后,服务器通常会发送一个 220
开头的欢迎消息。然后你可以按照 SMTP 协议的命令顺序进行交互(输入一行命令,按一次回车,观察服务器响应):
220 mail.example.com ESMTP Postfix
HELO myclient.example.com <-- 向服务器标识你的客户端(域名任意)
250 mail.example.com Hello myclient.example.com [your.ip.add.ress]
MAIL FROM: <sender@example.com> <-- 发件人地址(可以虚构)
250 2.1.0 Ok
RCPT TO: <recipient@example.com> <-- 收件人地址(必须是服务器接受的地址,或测试邮箱)
250 2.1.5 Ok
DATA <-- 告诉服务器要开始传输邮件内容了
354 End data with <CR><LF>.<CR><LF> <-- 提示以单独一行的 `.` 结束邮件内容输入
Subject: Test email via Telnet <-- 邮件主题<-- 空行分隔头部和正文
This is the body of my test email sent using telnet.
. <-- 单独一行输入一个点 `.` 表示邮件内容结束
250 2.0.0 Ok: queued as ABC123XYZ
QUIT <-- 退出会话
221 2.0.0 Bye
Connection closed by foreign host.
用途: 测试邮件服务器是否可连接、诊断邮件发送失败原因(观察每一步的响应码和消息)、理解 SMTP 协议流程。注意: 很多现代邮件服务器有反垃圾邮件措施,可能拒绝来自非授权 IP 或格式不规范的请求。
示例 4:连接 Redis 数据库
目标: 连接运行在 redis-server
主机 6379
端口的 Redis 服务,执行简单的命令。
telnet redis-server 6379
连接成功后(Redis 可能没有欢迎信息,直接显示光标),输入 Redis 协议命令(注意格式):
PING <-- 发送 PING 命令,Redis 应该回复 PONG
+PONG <-- Redis 的响应
SET mykey "Hello from Telnet" <-- 设置一个键值对
+OK <-- Redis 回复 OK 表示成功
GET mykey <-- 获取键 mykey 的值
$18 <-- 表示接下来是一个长度为 18 的字符串
Hello from Telnet <-- 值内容
QUIT <-- 告诉 Redis 关闭连接(Redis 协议命令)
+OK <-- Redis 确认
Connection closed by foreign host. <-- 连接关闭
用途: 快速检查 Redis 是否在线、测试 Redis 命令、诊断连接问题。
如何理解 Escape character is '^]'.
这是一个完全正常的成功连接提示!
详细解释
- 连接已成功建立:
- TCP 三次握手已完成
- 目标服务器(192.168.1.100)的 8080 端口正在监听
- 网络路径畅通无阻(防火墙已放行)
Escape character is '^]'
的含义:- 这是 Telnet 客户端的标准提示信息(不是错误!)
- 表示您现在处于 Telnet 的交互模式
^]
是退出交互模式的快捷键(按Ctrl + ]
)
- 当前状态:
- 光标在闪烁,等待您输入内容
- 服务端已准备好接收应用层协议数据(如 HTTP 请求)
- 服务端可能在等待您发送第一个指令(取决于服务类型)
接下来该做什么?
情况 1:如果您连接的是 HTTP 服务
# 手动发送 HTTP 请求(注意大小写和空行)
GET / HTTP/1.1
Host: 192.168.1.100:8080# 输入完成后按两次回车
情况 2:如果您连接的是其他服务
- 等待服务端的欢迎信息(如 SMTP 服务会发送
220 ...
) - 输入该服务支持的协议命令(Redis/SMTP/Memcached 等)
情况 3:只想验证端口连通性
-
按
Ctrl + ]
(进入 telnet 命令模式) -
输入
quit
退出telnet> quit Connection closed.
示例输出流程
$ telnet 192.168.1.100 8080
Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'. # ← 您当前看到的状态# 此时输入 HTTP 请求
GET / HTTP/1.1
Host: 192.168.1.100# 服务器响应
HTTP/1.1 200 OK
Content-Type: text/html
...# 按 Ctrl+] 退出
^]
telnet> quit
Connection closed.
为什么不是所有连接都显示这个提示?
- 有些服务会立即发送欢迎信息(如 SMTP 的 220 响应),覆盖此提示.
- 有些服务会主动关闭连接(如果收到非法连接).
- 只有当服务端保持连接打开并等待客户端发送数据时,才会显示这个提示.
总结
Escape character is '^]'
是 Telnet 连接成功的明确标志!它表示:
- 端口开放 ✅
- 服务可用 ✅
- 连接已建立 ✅
- 您可以开始发送应用层协议数据了
下一步操作完全取决于您连接的服务类型。对于 HTTP 服务,建议发送测试请求;对于其他服务,等待协议提示或发送协议命令。