Next Previous Contents

15. 使你的连结自动化 - 创造连结脚本文件

一旦你可以用上述的方法用手动方式登录,更好的做法是建立一些脚本文件来自动为你进行这些工作.

一份 chat 脚本文件可以自动化登录以及起动 PPP 的程序,因此所有你得做的(以 root 或是 ppp 群组组员的身分)只是发出单一个指令来起动你的连线.

15.1 以使用者域名/密码认证的脚本文件

如果你的 ISP 并不要求使用 PAP/CHAP 的话,这些就是为你准备的!

如果 ppp 套件安装正确,你应该会有两个范例文件. 在 PPP 2.1.2 中是在 /usr/sbin 而在 PPP 2.2 里是在 /etc/ppp/scripts.这些是

在 PPP-2.1.2

ppp-on
ppp-off

而在 PPP-2.2

ppp-off
ppp-on
ppp-on-dialer

现在,如果你正在使用 PPP 2.1.2,我强烈建议你删除这些范例文件. 它们有潜在的问题 - 不要告诉我它们工作得很好 - 我也用了很长一段时间(而且还在本 HOWTO 的第一版中推荐它们)!

为了 ppp 2.1.2 使用者的权益,这里有比较好的样板文件,这些是从 ppp 2.2 发行套件里拿来的. 我建议你拷贝并使用这些脚本文件而不要再用旧的 PPP-2.1.2 脚本文件.

15.2 ppp-on 脚本文件

这是实际启动连线的一对脚本文件中的第一个.


#!/bin/sh
#
# Script to initiate a PPP connection. This is the first part of the
# pair of scripts. This is not a secure pair of scripts as the codes
# are visible with the 'ps' command.  However, it is simple.
#
# These are the parameters. Change as needed.
TELEPHONE=555-1212      # The telephone number for the connection
ACCOUNT=george          # The account name for logon (as in 'George Burns')
PASSWORD=gracie         # The password for this account (and 'Gracie Allen')
LOCAL_IP=0.0.0.0        # Local IP address if known. Dynamic = 0.0.0.0
REMOTE_IP=0.0.0.0       # Remote IP address if desired. Normally 0.0.0.0
NETMASK=255.255.255.0   # The proper netmask if needed
#
# Export them so that they will be available to 'ppp-on-dialer'
export TELEPHONE ACCOUNT PASSWORD
#
# This is the location of the script which dials the phone and logs
# in.  Please use the absolute file name as the $PATH variable is not
# used on the connect option.  (To do so on a 'root' account would be
# a security hole so don't ask.)
#
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
#
# Initiate the connection
#
#
exec /usr/sbin/pppd debug /dev/ttySx 38400 \
        $LOCAL_IP:$REMOTE_IP \
        connect $DIALER_SCRIPT

而这是 ppp-on-dialer 脚本文件:-


#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
/usr/sbin/chat -v                                       \
        TIMEOUT         3                               \
        ABORT           '\nBUSY\r'                      \
        ABORT           '\nNO ANSWER\r'                 \
        ABORT           '\nRINGING\r\n\r\nRINGING\r'    \
        ''              \rAT                            \
        'OK-+++\c-OK'   ATH0                            \
        TIMEOUT         30                              \
        OK              ATDT$TELEPHONE                  \
        CONNECT         ''                              \
        ogin:--ogin:    $ACCOUNT                        \
        assword:        $PASSWORD

在 PPP-2.2 中,ppp-off 脚本文件看起来像:-


#!/bin/sh
######################################################################
#
# Determine the device to be terminated.
#
if [ "$1" = "" ]; then
        DEVICE=ppp0
else
        DEVICE=$1
fi

######################################################################
#
# If the ppp0 pid file is present then the program is running. Stop it.
if [ -r /var/run/$DEVICE.pid ]; then
        kill -INT `cat /var/run/$DEVICE.pid`
#
# If the kill did not work then there is no process running for this
# pid. It may also mean that the lock file will be left. You may wish
# to delete the lock file at the same time.
        if [ ! "$?" = "0" ]; then
                rm -f /var/run/$DEVICE.pid
                echo "ERROR: Removed stale pid file"
                exit 1
        fi
#
# Success. Let pppd clean up its own junk.
        echo "PPP link to $DEVICE terminated."
        exit 0
fi
#
# The ppp process is not running for ppp0
echo "ERROR: PPP link is not active on $DEVICE"
exit 1

15.3 编辑这里所提供的起始脚本文件

因为本新的脚本文件分成两部份,我们分别编辑它们.

ppp-on 脚本文件

你将得编辑这个脚本文件以反映你在 ISP 的使用者域名,你在 ISP 的密码,你 ISP 的电话号码.

每一行像是 TELEPHONE= 实际上设定了这个变量包含在等号右边的信息 (当然不包括注解部份). 因此编辑每一行使它对你的 ISP 与连线是正确的.

而且,如果你(需要)在 /etc/ppp/options 文件里设定了 IP 号码,删除这行


$LOCAL_IP:$REMOTE_IP \

还有,确定变量 DIALER_SCRIPT 指向你将要使用的拨号脚本文件的全部路径域名. 因此,如果你移动或改变这个脚本文件的域名,确定你正确地改变 ppp-on 脚本文件里的这一行.

ppp-on-dialer 脚本文件

这是第二个脚本文件实际建立起我们的 PPP 连结.

注意: 一份 chat 脚本文件一般全都放在同一行里.倒斜线是用来让一行可以跨过数行的实体行(便於人们阅读)而并不是脚本文件本身组成的一部份.

然而,仔细地看看它的细节部份以便让我们了解它实际(假设的)要做什么是非常有用的!

15.4 一份 chat 脚本文件其中的含意...

一份 chat 脚本文件是一系列期待字串 送出字串的配对. 特别是,注意到我们总是在送出某些讯息之前先期待某些讯息出现.

如果我们在没有先接收到任何讯息的情况下要送出某些讯息的话,我们必须使用空的期待字串(藉由 指明)而在没有送出任何讯息的情况下要期待某些讯息作法也类似! 而且,如果字串包含好几个字(例如 NO CARRIER),你必须把字串用引号括住,这样 chat 会把字串当作是单一个项目.

在我们样板里的 chat 指令行是:


exec /usr/sbin/chat -v

起动 chat ,-v 告诉 chat 将其所有的输出/入拷贝到系统记录里(通常是 /var/log/messages). 一旦你觉得 chat 脚本文件的运作稳定而可靠,编辑这一行把 -v 移除以便减少你系统记录的混杂.


TIMEOUT         3

这设定接收所期待的输入逾时时限为三秒.如果你使用真的是很慢的调制解调器那么你可能得要增加这个设定到五秒或是十秒!


ABORT           '\nBUSY\r'

如果接收到 BUSY 字串,中止执行.


ABORT           '\nNO ANSWER\r'

如果接收到 NO ANSWER 字串,中止执行.


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

如果接收到(重复的)RINGRING 字串,中止执行.这是因为某人正打电话给你!


“              \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:),但是如果我们在逾时前没有接收到,送出一个返回字符(return)然后再次找寻登录提示. 当接收到提示时,送出使用者域名(存放在使用者接口的 $ACCOUNT 环境变量里).


assword:        $PASSWORD

期待密码提示并且送出密码(再一次,存放在使用者接口的一个环境变量里).

这个 chat 脚本文件有合理的错误回复功能. Chat 还有许多重要的特色,比这里所展示还要更多. 更详细的信息请参阅 chat 的在线使用手册(man 8 chat).

在服务器端启动 PPP

虽然本 ppp-on-dialer 脚本文件对于在你登录後会自动启动 pppd 的服务器来说非常的好用,然而某些服务器需要你明白地在服务器上启动 PPP.

如果你需要在服务器上下指令以启动 PPP,你必须要编辑 ppp-on-dialer 脚本文件.

在这脚本文件的尾端(在 password 这行后面)加上 期待 送出 字串对 - 这是寻找你的 shell 提示符号 (特别小心对 Bourne shell 有特殊意义的字符 - 像是 $ 与 [ 或 ] 左右方括号等).

一旦 chat 找到了 shell 提示符号,chat 必须下指令以启动你 ISP 的 PPP 服务器.

以我的例子而言,我的 PPP 服务器使用标准的 Linux Bash 提示符号


[hartr@kepler hartr]$

而且需要我打


ppp

以启动服务器上的 PPP.

在此允许一点错误回复是个好主意,所以在我的例子中我用


        hartr--hartr    ppp

这就是说,如果我在逾时前没收到提示符号,送出 return 并且再次等待提示符号.

一旦收到提示符号,就送出 ppp 字串.

注意: 别忘了在前一行结束前加上 \ 以便让 chat 认为这整个脚本文件是在一行里!

不幸的是,某些服务器会产生非常多变的提示符号! 你可能必须使用 minicom 多登录几次以便了解什么可以用来做为确定的“期待”字串.

15.5 使用于 PAP/CHAP 验认连线的 chat 脚本文件

如果你的 ISP 使用 PAP/CHAP 验认,那么你的 chat 脚本文件会简单得多. 你的 chat 脚本文件所要做的全部只是拨号电话,等待接上线,然后就让 pppd 去处理登录事宜!


#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
exec /usr/sbin/chat -v                                  \
        TIMEOUT         3                               \
        ABORT           '\nBUSY\r'                      \
        ABORT           '\nNO ANSWER\r'                 \
        ABORT           '\nRINGING\r\n\r\nRINGING\r'    \
        ''              \rAT                            \
        'OK-+++\c-OK'   ATH0                            \
        TIMEOUT         30                              \
        OK              ATDT$TELEPHONE                  \
        CONNECT         ''                              \

15.6 pppd 的 debugfile option_file 选项

就像我们已经看过的,你可以对 pppd 使用 -d 选项打开调试讯息记录. 'debug' 选项和这个是一样的.

因为我们正在使用新的脚本文件建立新的连线,先放著此选项不管. (警告: 如果你的磁盘空间不大够,记录 pppd 的讯息可能会大量增加你的系统记录档大小并使你遇到麻烦 - 不过在此你必定会连线失败并尝试许久).

一旦你高兴地认为一切工作正常,你可以除去此选项.

如果你不是从 /etc/ppp/options/etc/ppp/options.ttySx 文件中叫出 ppp 选项, 可以在 pppd 上用 file 选项指定文件域名 - 例如


exec /usr/sbin/pppd debug file options.myserver /dev/ttyS0 38400 \


Next Previous Contents