18.4. 什么是 Chat 脚本...

Chat 脚本是由期望字符串和发送字符串对组成的序列。特别注意,我们总是期望接收到一些东西,然后才发送东西。

如果我们要在先接收任何内容的情况下发送某些内容,我们必须使用一个空的期望字符串(用“ ”表示),对于在不发送任何内容的情况下期望某些内容也是如此!此外,如果一个字符串由多个单词组成(例如 NO CARRIER),您必须引用该字符串,以便 chat 将其视为一个实体。

我们模板中的 chat 行是:-

exec /usr/sbin/chat -v

调用 chat,-v 告诉 chat 将其所有 I/O 复制到系统日志中(通常是 /var/log/messages)。一旦您确信 chat 脚本可以可靠地工作,请编辑此行以删除 -v,以节省系统日志中不必要的混乱。

TIMEOUT         3
这会将接收预期输入的超时时间设置为三秒。如果您使用的是非常慢的调制解调器,您可能需要将其增加到 5 秒或 10 秒!

ABORT           '\nBUSY\r'

如果收到字符串 BUSY,则中止操作。

ABORT           '\nNO ANSWER\r'

如果收到字符串 NO ANSWER,则中止操作。

ABORT           '\nRINGING\r\n\r\nRINGING\r'

如果收到(重复的)字符串 RINGING,则中止操作。这是因为有人正在给您的电话线打电话!

\rAT

期望调制解调器不返回任何内容,并发送字符串 AT。

OK-+++\c-OK   ATH0

这一个有点复杂,因为它使用了一些 chat 的错误恢复功能。

它的意思是...期望 OK,如果未收到(因为调制解调器未处于命令模式),则发送 +++(将调制解调器返回到命令模式的标准 Hayes 兼容调制解调器字符串)并期望 OK。然后发送 ATH0(调制解调器挂断字符串)。这允许您的脚本处理调制解调器卡在线上的情况!

TIMEOUT         30

将脚本剩余部分的超时时间设置为 30 秒。如果您在 chat 脚本因超时而中止时遇到问题,请将其增加到 45 秒或更长时间。

OK              ATDT$TELEPHONE

期望 OK(调制解调器对 ATH0 命令的响应)并拨打我们要呼叫的号码。

CONNECT         ''

期望 CONNECT(当远程调制解调器应答时,我们的调制解调器会发送此消息)并且不发送任何回复。

ogin:--ogin:    $ACCOUNT

同样,我们在这里内置了一些错误恢复功能。期望登录提示符 (...ogin:),但是如果我们超时后没有收到它,则发送一个回车符,然后再次查找登录提示符。当收到提示符时,发送用户名(存储在 shell 变量 $ACCOUNT 中)。

assword:        $PASSWORD

期望密码提示符并发送我们的密码(同样,存储在 shell 变量中)。

此 chat 脚本具有合理的错误恢复能力。Chat 具有比此处演示的功能更多的功能。有关更多信息,请查阅 chat 手册页(man 8 chat).

18.4.1. 在服务器端启动 PPP

虽然 ppp-on-dialer 脚本非常适合在您登录后自动在服务器端启动 pppd 的服务器,但某些服务器要求您显式在服务器上启动 PPP。

如果您需要发出命令以在服务器上启动 PPP,则确实需要编辑 ppp-on-dialer 脚本。

在脚本的末尾(密码行之后)添加一个额外的期望 发送对 - 这将查找您的登录提示符(注意在 Bourne shell 中具有特殊含义的字符 - 例如 $ 和 [ 或 ](左右方括号)。

一旦 chat 找到 shell 提示符,chat 必须发出您的 ISP 的 PPP 服务器所需的 ppp 启动命令。

在我的情况下,我的 PPP 服务器使用标准的 Linux Bash 提示符
[hartr@kepler hartr]$

并要求我输入

ppp

以在服务器上启动 PPP。

在这里允许进行一些错误恢复是一个好主意,所以在我的情况下,我使用
	hartr--hartr	ppp

这意味着,如果我们未在超时时间内收到提示符,则发送一个回车符并再次查找提示符。

一旦收到提示符,则发送字符串ppp.

注意:不要忘记在前一行的末尾添加一个 \,以便 chat 仍然认为整个 chat 脚本都在一行上!

不幸的是,某些服务器会产生非常可变的提示符集!您可能需要使用 minicom 多次登录以了解发生了什么并选择稳定的“期望”字符串。