Linux基础入门--网络工具--chat

1.概述

自动对话脚本与调制解调器,chat程序定义了计算机和调制解调器之间的对话交换。它的主要目的是在点对点协议守护进程(pppd)和远程的pppd进程之间建立连接。

2.语法

chat [ options ] script

3.选项

选项 说明
-f < chat file> 从chat文件读取chat脚本。此选项的使用与chat脚本参数是相互排斥的。用户必须具有对文件的读访问权。文件中允许有多行。应该使用空格或水平制表符来分隔字符串。
-t < timeout> 设置要接收的预期字符串的超时。如果在限定的时间内没有收到字符串,那么回复字符串将不会被发送。可能会发送一个备用应答,或者如果没有备用应答字符串,脚本将失败。失败的脚本将导致chat程序以非零错误代码终止。还可以使用超时字符串来指定超时。
-r < report file> 设置报表字符串输出的文件。如果使用关键字REPORT,则生成的字符串将写入该文件。如果没有使用此选项,而您仍然使用报表关键字,则stderr文件用于报表字符串。
-e 从打开echo选项开始。通过使用ECHO关键字,还可以在chat脚本的特定位置打开或关闭回显。启用回显时,调制解调器的所有输出将回显到stderr。
-E 在chat脚本中使用标准的$xxx语法启用环境变量替换。
-v 请求以详细模式执行chat脚本。chat程序将记录chat脚本的执行状态,以及从调制解调器接收到的所有文本和发送到调制解调器的输出字符串。默认是通过SYSLOG登录;可以使用-S和-S标志改变日志记录方法。
-V 请求以stderr详细模式chat聊天脚本。chat程序然后将从调制解调器接收到的所有文本和发送到调制解调器的输出字符串记录到stderr设备。该设备通常是运行聊天或pppd程序的本地控制台。
-s 使用stderr。所有来自’-v’的日志消息和所有错误消息将被发送到stderr。
-S 不要使用系统日志。默认情况下,错误消息被发送到系统日志。使用-S将防止来自’-v’的日志消息和错误消息被发送到系统日志。
-T < phone number> 传入一个任意字符串,通常是一个电话号码,它将被替换为发送字符串中的\T替换元字符。
-U < phone number 2> 传入第二个字符串,通常是一个电话号码,它将被替换为发送字符串中的\U替换元字符。当拨号需要两个数字的ISDN终端适配器时,这是有用的。

4.chat脚本

chat脚本定义了通信。脚本包含一个或多个“expect-send”字符串对,用空格分隔,还有一个可选的“subexpect-subsend”字符串对,用破折号分隔。

ogin:-BREAK-ogin: ppp ssword: hello2u2

这一行表示chat程序应该预期字符串“ogin:”。如果它在分配的时间间隔内没有收到登录提示符,它将被指定发送一个中断序列到远程,然后期望字符串“ogin:”。如果接收到第一个“ogin:”,则不会生成中断序列。一旦它收到登录提示,chat程序将发送字符串ppp,然后期待提示“ssword:”。当它收到密码提示时,它将发送密码hello2u2。回车通常在回复字符串之后发送。除非使用\r特别请求,否则它不会出现在“expect”字符串中字符序列。expect序列应该只包含标识字符串所需的内容。因为它通常存储在磁盘文件中,所以不应该包含变量信息。将时间字符串、网络标识字符串或其他可变数据片段作为预期字符串通常是不可接受的。

5.注释

注释可以嵌入到chat脚本中。注释是第1列中以#(散列)字符开头的行。这样的注释行会被聊天程序忽略。如果期望’#'字符作为expect序列的第一个字符,则应该引用expect字符串。如果你想等待一个以#(哈希)字符开始的提示符,你必须这样写:
#现在等待提示并发送登出字符串
“#”注销

6.从文件发送数据

如果要发送的字符串以@符号开始,则字符串的其余部分被取为要读取的文件的名称,以获取要发送的字符串。如果所读取数据的最后一个字符是换行符,则将其删除。该文件可以是一个命名管道(或fifo),而不是常规文件。这为chat提供了一种与另一个程序进行通信的方式,例如,一个提示用户并接收输入的密码的程序。

7.ABORT字符串

许多调制解调器将报告状态的呼叫作为一个字符串。这些弦可以是连接的,也可以是没有载波的,也可以是繁忙的。如果调制解调器无法连接到远程服务器,通常需要终止脚本。困难在于,脚本不知道它可能接收到的是哪个调制解调器字符串。在一次尝试中,它可能收到忙碌,而下一次它可能没有收到运营商。这些“abort”字符串可以使用中止序列在脚本中指定。它写在脚本中,如下例所示:

ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ATDT5551212 CONNECT

这个序列没有任何期望;然后发送字符串ATZ。预期的响应是字符串OK。当它收到OK,字符串ATDT5551212拨号电话。期望的字符串是CONNECT。如果接收到字符串CONNECT,则执行脚本的其余部分。然而,如果调制解调器发现一个忙碌的电话,它将发送字符串忙碌。这将导致字符串与中止字符序列匹配。脚本将失败,因为它找到了与中止字符串匹配的字符串。如果它接收到字符串NO CARRIER,它将出于同样的原因中止。可以接收任何字符串。任何一个字符串都将终止chat脚本。

8.CLR_ABORT字符串

此序列允许清除先前设置的中止字符串。中止字符串保存在一个预先确定大小的数组中(在编译时);CLR_ABORT将收回已清除条目的空间,以便新的字符串可以使用该空间。

9.SAY字符串

SAY指令允许脚本通过标准错误向终端的用户发送字符串。如果聊天是由pppd运行的,并且pppd作为守护进程运行(与它的控制终端分离),标准错误通常会被重定向到/etc/ppp/connect-errors文件。SAY字符串必须用单引号或双引号括起来。如果要输出的字符串中需要回车和换行,则必须显式地将它们添加到字符串中。SAY字符串可以用于在脚本中你想要“ECHO OFF”但仍然让用户知道发生了什么情况的部分提供进度消息。一个例子是:

ABORT BUSY
     ECHO OFF
     SAY "Dialling your ISP...\n"
     '' ATDT5551212
     TIMEOUT 120
     SAY "Waiting up to 2 minutes for connection ... "
     CONNECT ''
     SAY "Connected, now logging in ...\n"
     ogin: account
     ssword: pass
     $ \c
     SAY "Logged in OK ...\n" etc ...

这个序列将只向用户显示SAY字符串,脚本的所有细节将保持隐藏。例如,如果上面的脚本工作,用户将看到:

Dialling your ISP...
Waiting up to 2 minutes for connection ... Connected, now logging in ...
Logged in OK ...

10.REPORT字符串

REPORT字符串类似于中止字符串。区别在于字符串和下一个控制字符(如回车)的所有字符都被写入REPORT文件。REPORT字符串可用于隔离调制解调器连接字符串的传输速率,并将值返回给chat用户。REPORT字符串逻辑的分析与其他字符串处理一起进行,比如查找预期字符串。对报表和中止序列使用相同的字符串可能不是很有用,但是,这是可能的。报告字符串不改变程序的完成代码。这些“报表”字符串可以在脚本中使用报表序列指定。它写在脚本中,如下例所示:

REPORT CONNECT ABORT BUSY '' ATDT5551212 CONNECT '' ogin: account

这个序列没有任何期望;然后发送字符串ATDT5551212来拨打电话。期望的字符串是CONNECT。如果接收到字符串CONNECT,则执行脚本的其余部分。此外,程序将向期望文件写入字符串“CONNECT”以及它后面的任何字符,比如连接速率。

11.CLR_REPORT字符串

这个序列允许清除以前设置的REPORT字符串。REPORT字符串保存在一个大小预先确定的数组中(在编译时);CLR_REPORT将为已清除的条目收回空间,以便新的字符串可以使用该空间。

12.ECHO

echo选项控制是否将调制解调器的输出回显到stderr。这个选项可以用-e选项设置,但是它也可以由ECHO关键字控制。“expect-send”对ECHO ON启用ECHO, ECHO OFF禁用ECHO。使用这个关键字,您可以选择对话的哪些部分应该是可见的。例如,下面的脚本:

ABORT   'BUSY'
ABORT   'NO CARRIER'
''      ATZ
OK\r\n  ATD1234567
\r\n    \c
ECHO    ON
CONNECT \c
ogin:   account

调制解调器配置和拨号产生的所有输出都是不可见的,但是从CONNECT(或BUSY)消息开始,所有内容都将回显。

13.HANGUP

挂起选项控制是否一个调制解调器挂起应该被视为一个错误或不。这个选项在拨号系统的脚本中非常有用,它将挂起并回调您的系统。挂起选项可以是开或关。当挂起被设置和调制解调器挂起(例如,在第一阶段登录回调系统后),chat将继续运行脚本(例如,等待来电和第二阶段登录提示)。一旦来电连接,您应该使用挂起指令重新安装正常挂起信号行为。下面是一个(简单的)示例脚本:

ABORT   'BUSY'
              ''      ATZ
              OK\r\n  ATD1234567
              \r\n    \c
              CONNECT \c
              'Callback login:' call_back_ID
              HANGUP OFF
              ABORT "Bad Login"
              'Callback Password:' Call_back_password
              TIMEOUT 120
              CONNECT \c
              HANGUP ON
              ABORT "NO CARRIER"
              ogin:--BREAK--ogin: real_account
              etc ...

14.TIMEOUT

初始超时值为45秒。这可以使用-t参数进行更改。您还可以指定“TIMEOUT 0”。要更改下一个expect字符串的超时值,可以使用以下示例:

ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:--ogin: TIMEOUT 5 assword: hello2u2

这将在等待login: prompt时将超时时间更改为10秒。然后,当它查找密码提示时,超时时间更改为5秒。超时一旦更改,将保持有效,直到再次更改为止。

15.发送EOT

特殊的EOT回复字符串表示chat程序应该向远程发送一个EOT字符。这通常是文件结束字符序列。在EOT之后不发送返回字符。EOT序列可以使用序列^D嵌入到发送字符串中。

16.产生中断

中断的特殊回复字符串将导致发送中断条件。中断是发射机上的一种特殊信号。接收器上的正常处理是改变传输速率。它可用于在远程服务器上循环使用可用的传输速率,直到能够收到有效的登录提示符。可以使用\K序列将中断序列嵌入到发送字符串中。

17.转义序列

期望和应答字符串可能包含转义序列。回复字符串中的所有序列都是合法的。

18.环境变量

如果在命令行中指定了-E选项,则可以在chat脚本中使用环境变量。元字符$用于引入要替换的环境变量的名称。如果替换失败,因为没有设置所请求的环境变量,则不会为该变量替换任何内容。

19.终止代码

chat程序将以以下完成代码终止。

代码值 说明
0 程序的正常终止。这表明该脚本执行时没有出现正常的错误。
1 一个或多个参数无效,或预期字符串对于内部缓冲区太大。这表明程序没有正确执行。
2 在程序执行过程中发生了错误。这可能是由于读或写操作由于某种原因失败或聊天接收到信号(如SIGINT)。
3 当有一个expect字符串而没有“-subsend”字符串时,会发生超时事件。这可能意味着您没有针对该条件正确地编写脚本,或者发生了某些意外事件,无法找到预期的字符串。
4 出现标记为中止条件的第一个字符串。
5 出现标记为中止条件的第二个字符串。
6 出现标记为中止条件的第三个字符串。
7 出现标记为中止条件的第四个字符串。
其他终止代码也是标记为终止条件的字符串。

温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_20677327/article/details/107950966