一旦你可以用上述的方法用手动方式签入,更好的做法是建立一些指令稿来自动为你进行这些工作
一份 chat 指令稿可以自动化签入以及起动 PPP 的程序,因此所有你得做的(以 root 或是 ppp 群组组员的身分)只是发出单一个指令来起动你的连线
如果你的 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 指令稿
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
因为这份新的指令稿分成两部份,我们分别编辑它们
ppp-on
指令稿你将得编辑这个指令稿以反映你在 ISP 的使用者名称,你在 ISP 的密码,你 ISP 的电话号码
每一行像是 TELEPHONE=
实际上设定了这个变数包含在等号右边的信息 (当然不包括注解部份)
因此编辑每一行使它对你的 ISP 与连线是正确的
而且,如果你(需要)在 /etc/ppp/options
文档里设定了 IP 号码,删除这行
$LOCAL_IP:$REMOTE_IP \
还有,确定变数 DIALER_SCRIPT
指向你将要使用的拨号指令稿的全部路径名称
因此,如果你移动或改变这个指令稿的名称,确定你正确地改变 ppp-on
指令稿里的这一行
ppp-on-dialer
指令稿这是第二个指令稿实际建立起我们的 PPP 连结
注意: 一份 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-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 多签入几次以便了解什么可以用来做为确定的“期待”字串
如果你的 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 '' \
debug
与 file 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 \