contents
Next: 调试 PPP 设置 Up: 点对点协议 Previous: 使用选项文件

使用 chat 拨号

在上面的例子中,您可能觉得不方便的一点是,您必须先手动建立连接,才能启动 pppd。与 dip 不同,pppd 没有自己的脚本语言来拨打远程系统并登录,而是依赖于一些外部程序或 shell 脚本来完成这项工作。要执行的命令可以通过 `connect` 命令行选项传递给 pppd。pppd 会将命令的标准输入和输出重定向到串行线。一个有用的程序是 expect,由 Don Libes 编写。它有一种基于 Tcl 的非常强大的语言,正是为这类应用而设计的。

pppd 软件包附带一个类似的程序,名为 chat,它允许您指定 UUCP 风格的 chat 脚本。基本上,一个 chat 脚本由一系列交替的字符串组成,这些字符串是我们期望从远程系统接收到的,以及我们要发送的答案。我们将分别称之为 expect 字符串和 send 字符串。这是一个典型的 chat 脚本摘录;

           ogin: b1ff ssword: s3kr3t


这告诉 chat 等待远程系统发送登录提示符,并返回登录名 b1ff。我们只等待 ogin:,这样登录提示符以大写或小写 l 开头,或者是否乱码都无关紧要。下面的字符串又是一个 expect 字符串,它使 chat 等待密码提示符,并发送我们的密码作为响应。

这基本上就是 chat 脚本的全部内容。一个完整的拨号连接 PPP 服务器的脚本,当然,也必须包含适当的调制解调器命令。假设您的调制解调器理解 Hayes 命令集,并且服务器的电话号码是 318714。那么,建立与 c3po 连接的完整 chat 调用将是

          $ chat -v '' ATZ OK ATDT318714 CONNECT '' ogin: ppp word: GaGariN
 
按照定义,第一个字符串必须是一个 expect 字符串,但是由于调制解调器在我们启动它之前不会说任何话,我们通过指定一个空字符串来让 chat 跳过第一个 expect。我们继续发送 ATZ,Hayes 兼容调制解调器的重置命令,并等待其响应 (OK)。下一个字符串将拨号命令连同电话号码一起发送给 chat,并期望收到 CONNECT 消息作为响应。接下来又是一个空字符串,因为我们现在不想发送任何东西,而是等待登录提示符。chat 脚本的其余部分与上述描述完全相同。

`-v` 选项使 chat 将所有活动记录到 syslog 守护程序的 local2 facility。gif

在命令行上指定 chat 脚本有一定的风险,因为用户可以使用 `ps` 命令查看进程的命令行。您可以通过将 chat 脚本放在文件中来避免这种情况,例如 dial-c3po。您可以通过给出 `-f` 选项,后跟文件名,使 chat 从文件而不是命令行读取脚本。现在,完整的 pppd 调用看起来像这样

           # pppd connect "chat -f dial-c3po" /dev/cua3 38400 -detach \
             crtscts modem defaultroute
 
除了指定拨号脚本的 `connect` 选项之外,我们还在命令行中添加了两个选项:`-detach`,它告诉 pppd 不要从控制台分离并成为后台进程。`modem` 关键字使其在串行设备上执行一些特定于调制解调器的操作,例如在呼叫前后挂断线路。如果您不使用此关键字,pppd 将不会监视端口的 DCD 线,因此将无法检测到远程端是否意外挂断。

上面显示的示例相当简单;chat 允许使用更复杂的 chat 脚本。一个非常有用的功能是能够指定在哪些字符串上中止 chat 并报错。典型的 abort 字符串是诸如 BUSY 或 NO CARRIER 之类的消息,这些消息通常在被叫号码忙或未接听电话时由您的调制解调器生成。为了使 chat 立即识别这些消息,而不是超时,您可以使用 ABORT 关键字在脚本的开头指定它们

           $ chat -v ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ...

 
以类似的方式,您可以通过插入 TIMEOUT 选项来更改 chat 脚本某些部分的超时值。有关详细信息,请查看 chat(8) 手册页。

有时,您可能还希望对 chat 脚本的某些部分进行某种形式的条件执行。例如,当您没有收到远程端的登录提示符时,您可能想要发送一个 BREAK 或一个回车符。您可以通过将子脚本附加到 expect 字符串来实现这一点。它由一系列 send 字符串和 expect 字符串组成,就像整个脚本本身一样,它们之间用连字符分隔。每当附加到的 expect 字符串未及时收到时,就会执行子脚本。在上面的例子中,我们将按如下方式修改 chat 脚本

           ogin:-BREAK-ogin: ppp ssword: GaGariN
 
现在,当 chat 没有看到远程系统发送登录提示符时,子脚本将被执行,首先发送一个 BREAK,然后再次等待登录提示符。如果现在出现提示符,脚本将照常继续,否则将以错误终止。


contents
Next: 调试 PPP 设置 Up: 点对点协议 Previous: 使用选项文件

Andrew Anderson
1996 年 3 月 7 日星期四 23:22:06 EST