chat 命令并不是一个像 ls 或 cd 那样通用的交互式聊天工具,它的全称是 Automatic Chat Script,即“自动聊天脚本”,它是一个用于在两个调制解调器 之间执行自动化对话的命令行程序。

核心概念:chat 是什么?
想象一下,你想通过串口或调制解调器连接到另一个系统,连接建立后,通常会有一个登录过程:
- 远程系统会发送一个提示符,如
Login:。 - 你的计算机需要在这个提示符出现后,输入你的用户名,如
myuser。 - 远程系统收到用户名后,又会发送密码提示符,如
Password:。 - 你的计算机需要输入密码,如
mypassword。 - 连接成功。
这个过程就像一次“对话”。chat 命令的作用就是自动执行这个预定义的对话脚本,它按照脚本中的指令,等待特定的字符串(来自远程系统),然后发送预设的响应(你的输入)。
主要用途
chat 命令主要用于以下场景:
- 拨号上网:这是
chat最经典的应用,在早期,通过调制解调器连接互联网时,需要先拨号 ISP 的号码,然后与 ISP 的服务器进行一系列认证(用户名/密码、IP 地址分配等)。chat脚本可以自动化这个过程。 - 串口设备通信:连接到路由器、交换机、嵌入式设备或工业设备的控制台,这些设备通常通过串口连接,启动时会显示启动信息或登录提示。
chat可以自动登录这些设备,执行命令,然后退出。 - 自动化脚本:任何需要与一个“会说话”的串行设备进行简单交互的场景,都可以使用
chat来实现自动化。
基本语法
chat [options] 'expect_string' 'send_string' ['expect_string' 'send_string'] ...
expect_string:chat等待从输入流(如串口)中接收到的字符串,如果接收到了,它就会执行后面的send_string。send_string:chat发送到输出流(如串口)的字符串。- 这个
expect-send对可以连续出现,形成一整个对话流程。
常用选项
-t timeout:设置超时时间。chat在等待expect_string时,如果在指定时间内没有收到,就会认为失败并退出,这是最重要的选项之一,防止脚本无限期等待。-E escape_char:设置转义字符,使用\K可以发送一个中断信号。-V:详细模式,在执行过程中打印出chat正在做什么(如 "Expecting..." 和 "Sending..."),这对于调试脚本非常有用。-f scriptfile:从一个文件中读取expect-send对,而不是在命令行中直接书写,这是更推荐的方式,特别是对于复杂的脚本。-r report-file:将执行结果(成功或失败)写入到指定的报告文件中。-T phone-number:在拨号脚本中,可以指定要拨打的电话号码。
expect-send 对中的特殊字符
chat 脚本支持一些特殊的转义字符来表示控制字符:

| 字符 | 含义 | 示例 |
|---|---|---|
\d |
延迟1秒 | \d\d\d 延迟3秒 |
\K |
发送BREAK信号 | |
\c |
忽略后面的回车换行 | |
\p |
暂停1秒 | |
\l |
发送换行符 | |
\r |
发送回车符 | |
\s |
发送空格 | |
\N |
发送null字符 | |
\t |
发送制表符 | |
\ |
字面意义上的反斜杠 | \\ 表示一个 \ |
^C |
发送Ctrl+C |
实践示例
示例1:简单的登录脚本
假设一个设备启动后,会显示 login:,然后等待输入用户名,接着显示 Password:,等待输入密码。
(login_script):**
# 等待看到 "login: " 字符串(包括末尾的空格),然后发送用户名 "admin" 'login: ' 'admin\r' # 等待看到 "Password: " 字符串,然后发送密码 "secret" 'Password: ' 'secret\r'
执行方式:
# 使用 -t 5 设置5秒超时,-V 显示详细信息 # chat 会从标准输入读取,并写入到标准输出 # 实际使用时,通常会通过重定向或管道与串口设备通信 chat -t 5 -V -f login_script
示例2:经典的拨号上网脚本
这是 chat 最具代表性的应用,脚本需要先拨号,等待 ISP 的握手信号,然后进行用户名和密码认证。
(ppp-on):**
# 等待调制解调器就绪 'OK\r' # 拨打 ISP 的电话号码 'ATDT555-1234\r' # 等待听到载波信号,表明已连接 'CONNECT\r' # 等待 ISP 的登录提示 'Username: ' # 发送用户名 'myuser\r' # 等待密码提示 'Password: ' # 发送密码 'mypassword\r' # 等待认证成功,比如看到 "PPP" 或 "Login OK" 'PPP\r'
执行方式:

# 通过串口设备 /dev/ttyS0 执行脚本 # stty 设置串口参数,chat 从串口读取并发送 stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb -ixon chat -t 60 -V -f ppp-on < /dev/ttyS0 > /dev/ttyS0
示例3:使用 minicom 或 screen 进行调试
在编写 chat 脚本时,最好能亲眼看到对话过程,你可以使用 minicom 或 screen 等终端程序来手动操作,验证你的 expect_string 和 send_string 是否正确。
使用 screen 连接到串口:
screen /dev/ttyUSB0 115200
然后手动输入命令和观察输出,根据这个过程来编写你的 chat 脚本。
现代替代品
随着技术的发展,chat 的很多应用场景已经有了更现代、更强大的替代方案:
pppd(Point-to-Point Protocol Daemon):在 Linux 中,pppd通常与chat配合使用。pppd负责建立和管理 PPP 连接(如拨号连接),而chat负责底层的拨号和认证对话,现代的pppd有自己的内置脚本功能,可以替代一部分chat的工作。expect语言:expect是一个更强大的工具,它是一种完整的脚本语言,专门为自动化与交互式程序的对话而设计,它支持更复杂的逻辑(如循环、条件判断),而不仅仅是简单的expect-send对,对于非常复杂的自动化任务,expect是更好的选择。- 网络管理工具:对于网络设备,现在普遍使用 SSH 或 SNMP 进行管理和自动化,它们比通过串口登录更安全、更高效。
| 特性 | 描述 |
|---|---|
| 命令名称 | chat |
| 全称 | Automatic Chat Script |
| 类型 | 命令行工具 |
| 核心功能 | 自动化执行两个串行设备之间的文本对话 |
| 主要用途 | 拨号上网、串口设备自动登录、自动化脚本 |
| 优点 | 轻量、简单、内置于大多数 Linux 发行版 |
| 缺点 | 功能相对简单,不适合复杂的交互逻辑 |
| 学习要点 | 理解 expect-send 对、掌握特殊转义字符、学会使用 -t 和 -V 选项 |
| 现代替代品 | pppd 内置脚本、expect 语言、SSH/SNMP |
chat 是一个虽然古老但依然非常有用的工具,尤其是在嵌入式开发和遗留系统维护领域,如果你需要与一个通过串口进行文本交互的设备进行自动化通信,chat 通常是你的首选或必经之路。
