Uno de los problemas que puede haberle dado el ejemplo anterior es que
tenía que establecer la conexión manualmente antes de poder ejecutar
pppd. Al contrario que dip,
pppd no tiene su propio lenguaje de scripts para
llamar al sistema remoto y entrar en él, sino que confía en otro programa
externo para que haga esto. El comando que tiene que ser ejecutado puede
dársele pppd con la opción connect
en la línea de órdenes. El pppd redirigirá la entrada
y salida estándar de órdenes a la línea serie.
El paquete pppd incluye un programa muy simple llamado
chat que es capaz de automatizar secuencias de registro simples.
Hablaremos sobre este programa con detalle.
Si su secuencia de registro es compleja, necesitará algo más potente que
chat. Una alternativa útil que debería considerar es
expect, escrito por Don Libes. Tiene un lenguaje
basado en Tcl, y fue diseñado exactamente para este tipo de aplicación.
Aquellos de vosotros cuyas secuencias de registro requieran, por ejemplo,
autentificación por reto/respuesta con generación de claves
encontraréis expect lo suficientemente potente para
ocuparse de la tarea. Puesto que hay tantas posibles variaciones de este
tema, no describiremos como desarrollar un guión de expect apropiado en
este libro. Es suficiente decir, que usted llama a su guión expect
especificando su nombre con la opción
connect de pppd.
También es importante señalar que cuando el guión está ejecutándose, la entrada
y la salida estándar estarán desviadas al módem, y no a
la terminal que invocó al pppd. Si usted necesita
interactuar como usuario, usted deberá hacerlo mediante un terminal
virtual compartido, o mediante otros medios.
La orden chat le permite especificar un script del estilo
de los de UUCP. Básicamente, un script de chat consiste en una secuencia
alterna de cadenas que esperamos recibir del sistema remoto y las respuestas
que hemos de enviar. Las llamaremos respectivamente, cadenas
esperadas y cadenas enviadas.
Este es un extracto de un típico script de chat:
ogin: b1ff ssword: s3|<r1t |
Este script le indica a chat que espere a que el sistema remoto
le envíe el mensaje de petición de usuario y entonces le devuelve el nombre
del usuario b1ff. Sólo esperamos por
ogin: para que no importe si el mensaje
de registro empiece por l mayúscula o minúscula, o si llega con basura. La siguiente
cadena es una cadena esperada que hace que chat espere al
mensaje de petición de contraseña y le envíe nuestra contraseña como respuesta.
Esto es básicamente lo que hacen los scripts de chat. Un script completo para
llamar a un servidor PPP debería, además, incluir las órdenes apropiados para
el módem. Suponga que su módem entiende los comandos Hayes, y que el número de
teléfono del servidor es el 318714. En ese caso, la línea completa de
chat para que pudiésemos establecer una conexión con
c3po sería:
$ chat -v '' ATZ OK ATDT318714 CONNECT '' ogin: ppp word: GaGariN |
Por definición, la primera cadena que damos a chat tiene que ser una cadena
esperada, pero como el módem no dirá nada hasta que hablemos con él,
hacemos que chat la ignore especificando una cadena vacía.
Continuamos enviando ATZ, la orden de
inicialización para los módems compatibles Hayes, y esperamos a que nos responda
con (OK). La siguiente cadena envía a
chat la orden de marcado junto con el número de teléfono,
y espera a que aparezca el mensaje CONNECT
como respuesta. Esto está seguido de otra cadena vacía otra vez, porque ahora no
queremos enviar nada, sino esperar a que aparezca el mensaje de petición de registro.
El resto del script de chat funciona exactamente como antes. Esta descripción
probablemente parezca algo confusa, pero veremos en un momento que hay una forma
de hacer los scrips chat mucho más fáciles de entender.
La opción –v hace que chat capture
todas las actividades hacia la facilidad local2
del demonio syslog.
[1]
El escribir el script de chat directamente en la línea de órdenes implica
un cierto riesgo, pues los usuarios pueden ver la línea de órdenes de un
proceso con la orden ps. Puede evitar esto colocando
el script del chat en un fichero, por ejemplo llamado dial-c3po.
Entonces, podrá hacer al chat leer el script del fichero en vez de
la línea de comando utilizando la opción –f, seguida por el
nombre del fichero.Esto supondrá el beneficio añadido de
hacer nuestra secuencia de chat expect más fácil de entender.
Al modificar nuestro ejempo, nuestro fichero dial-c3po tendrá ahora
un aspecto como éste:
'' ATZ
OK ATDT318714
CONNECT ''
ogin: ppp
word: GaGariN |
Cuando usamos un script de chat de esta manera, la cadena que esperamos
recibir está en la izquierda y la respuesta que devolveremos está en
la derecha. Presentándolas así son mucho más fáciles de leer y entender.
Por lo tanto la invocación completa al pppd tendrá ahora
un aspecto como éste:
# pppd connect "chat -f dial-c3po" /dev/ttyS3 38400 -detach \
crtscts módem defaultroute |
Además de la opción connect que
se refiere al script de llamada, hemos añadido dos opciones más a la línea
de órdenes: –detach, que le indica al pppd
que no se separe de la consola y se convierta en un proceso en segundo plano. La palabra
modem activa algunas acciones específicas
para módem sobre el dispositivo serie, como colgar la línea antes y después de
la llamada. Si no utiliza esta opción, pppd no se preocupará
de la línea DCD del puerto, y por lo tanto no podrá detectar si el extremo remoto
cuelga de forma imprevista.
Los ejemplos anteriores eran bastante simples; chat
permite el uso de scripts mucho más complejos. Una característica muy útil
es la capacidad de especificar cadenas frente a las cuales parar chat
con un error. Unas cadenas típicas para parar pueden ser mensajes como
BUSY o
NO CARRIER, que son los que su
módem produce cuando el número al que llama comunica o cuando la línea no tiene tono.
Para hacer que chat las reconozca inmediatamente en vez de
esperar, puede introducirlas al principio del script utilizando la opción
ABORT:
$ chat -v ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ... |
Igualmente, puede variar el valor del tiempo de espera para algunas
partes de los scripts de chat insertando opciones
TIMEOUT.
Algunas veces, también querrá disponer de algún tipo de ejecución condicional
de algunas partes del script de chat. Por ejemplo, cuando reciba el mensaje de
petición de registro (login) desde el extremo remoto, puede que quiera enviar un BREAK, o
un retorno de carro. Puede conseguir esto añadiendo un sub-script a la parte
de la cadena esperada. Consiste en una secuencia de cadenas de envío y esperadas,
de la misma forma que el script en su totalidad, pero separadas por guiones.
El sub-script es ejecutado desde el momento en que la cadena esperada a la que
están ligados no es recibida a tiempo. Para este ejemplo, modificaríamos el
script de chat de la siguiente manera:
ogin:-BREAK-ogin: ppp ssword: GaGariN |
Ahora, cuando chat no recibe el mensaje de login del
sistema remoto, se ejecuta el sub-script enviando un BREAK y esperando de
nuevo por el mensaje de login. Si ahora ya aparece, el script continúa como
usualmente y si no, termina con un error.