菜鸟科技网

Linux chat命令如何实现自动交互对话?

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

Linux chat命令如何实现自动交互对话?-图1
(图片来源网络,侵删)

核心概念:chat 是什么?

想象一下,你想通过串口或调制解调器连接到另一个系统,连接建立后,通常会有一个登录过程:

  1. 远程系统会发送一个提示符,如 Login:
  2. 你的计算机需要在这个提示符出现后,输入你的用户名,如 myuser
  3. 远程系统收到用户名后,又会发送密码提示符,如 Password:
  4. 你的计算机需要输入密码,如 mypassword
  5. 连接成功。

这个过程就像一次“对话”。chat 命令的作用就是自动执行这个预定义的对话脚本,它按照脚本中的指令,等待特定的字符串(来自远程系统),然后发送预设的响应(你的输入)。

主要用途

chat 命令主要用于以下场景:

  1. 拨号上网:这是 chat 最经典的应用,在早期,通过调制解调器连接互联网时,需要先拨号 ISP 的号码,然后与 ISP 的服务器进行一系列认证(用户名/密码、IP 地址分配等)。chat 脚本可以自动化这个过程。
  2. 串口设备通信:连接到路由器、交换机、嵌入式设备或工业设备的控制台,这些设备通常通过串口连接,启动时会显示启动信息或登录提示。chat 可以自动登录这些设备,执行命令,然后退出。
  3. 自动化脚本:任何需要与一个“会说话”的串行设备进行简单交互的场景,都可以使用 chat 来实现自动化。

基本语法

chat [options] 'expect_string' 'send_string' ['expect_string' 'send_string'] ...
  • expect_stringchat 等待从输入流(如串口)中接收到的字符串,如果接收到了,它就会执行后面的 send_string
  • send_stringchat 发送到输出流(如串口)的字符串。
  • 这个 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 脚本支持一些特殊的转义字符来表示控制字符:

Linux chat命令如何实现自动交互对话?-图2
(图片来源网络,侵删)
字符 含义 示例
\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'

执行方式:

Linux chat命令如何实现自动交互对话?-图3
(图片来源网络,侵删)
# 通过串口设备 /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:使用 minicomscreen 进行调试

在编写 chat 脚本时,最好能亲眼看到对话过程,你可以使用 minicomscreen 等终端程序来手动操作,验证你的 expect_stringsend_string 是否正确。

使用 screen 连接到串口:

screen /dev/ttyUSB0 115200

然后手动输入命令和观察输出,根据这个过程来编写你的 chat 脚本。

现代替代品

随着技术的发展,chat 的很多应用场景已经有了更现代、更强大的替代方案:

  1. pppd (Point-to-Point Protocol Daemon):在 Linux 中,pppd 通常与 chat 配合使用。pppd 负责建立和管理 PPP 连接(如拨号连接),而 chat 负责底层的拨号和认证对话,现代的 pppd 有自己的内置脚本功能,可以替代一部分 chat 的工作。
  2. expect 语言expect 是一个更强大的工具,它是一种完整的脚本语言,专门为自动化与交互式程序的对话而设计,它支持更复杂的逻辑(如循环、条件判断),而不仅仅是简单的 expect-send 对,对于非常复杂的自动化任务,expect 是更好的选择。
  3. 网络管理工具:对于网络设备,现在普遍使用 SSHSNMP 进行管理和自动化,它们比通过串口登录更安全、更高效。
特性 描述
命令名称 chat
全称 Automatic Chat Script
类型 命令行工具
核心功能 自动化执行两个串行设备之间的文本对话
主要用途 拨号上网、串口设备自动登录、自动化脚本
优点 轻量、简单、内置于大多数 Linux 发行版
缺点 功能相对简单,不适合复杂的交互逻辑
学习要点 理解 expect-send 对、掌握特殊转义字符、学会使用 -t-V 选项
现代替代品 pppd 内置脚本、expect 语言、SSH/SNMP

chat 是一个虽然古老但依然非常有用的工具,尤其是在嵌入式开发和遗留系统维护领域,如果你需要与一个通过串口进行文本交互的设备进行自动化通信,chat 通常是你的首选或必经之路。

分享:
扫描分享到社交APP
上一篇
下一篇