8.4. Realización de la Llamada con chat

Uno de los problemas que puede haberle dado el ejemplo anterior es que tenia que establecer la conexión manualmente antes de poder ejecutar el pppd. Al contrario que el dip, el 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 al pppd con la opción connect en la línea de comando. El pppd redirigirá la entrada y salida estándar de comandos a la línea de serie.

El paquete pppd incluye un programa muy simple llamado chat que es capaz de ser usado para automatizar secuencias de login simples. Hablaremos sobre este comando con detalle.

Si su secuencia de login es compleja, necesitará algo más potente que chat. Una útil alternativa que deberia 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 login requieran, por ejemplo, autentificación por reto/respuesta envolviendo generación de llaves encontrareis expect lo suficientemente potente para manejar 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 del pppd. También es importante señalar que cuando el guión esta ejecutandose, la entrada y la salida estandar estarán desviadas al modem, y no a la terminal que invoco 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 del 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 del chat:
    ogin: b1ff ssword: s3|<r1t

Este script le indica al 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. Solo esperamos por ogin: para que no importe si el mensaje de login empiece por l mayúscula o minúscula, o si llega con basura. La siguiente cadena es una cadena esperada que hace que el 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 del chat. Un script completo para llamar a un servidor PPP debería, además, incluir los comandos 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 del chat para que pudiésemos establecer una conexión con c3po seria:
    $ chat -v '' ATZ OK ATDT318714 CONNECT '' ogin: ppp word: GaGariN

Por definición, la primera cadena que damos al chat tiene que ser una cadena esperada, pero como el módem no dirá nada hasta que hablemos con el, hacemos que el chat la ignore especificando una cadena vacía. Continuamos enviando ATZ, el comando de inicialización para los módems compatibles Hayes, y esperamos a que nos responda con (OK). La siguiente cadena envía al chat el comando de marcado junto con el número de teléfono, y espera a que aparezca el mensaje CONNECT como respuesta. Esto esta 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 login. El resto del script del chat funciona exactamente como antes. Esta descripcion probablemente parezca algo confusa, pero veremos en un momento que hay una forma de hacer los scrips chat mucho más faciles de entender.

La opción –v hace que el 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 comando implica un cierto riesgo, pues los usuarios pueden ver la línea de comando de un proceso con el comando 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 supondra 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 recivir esta en la izquierda y la respuesta que devolveremos esta en la derecha. Presentandolas asi 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 modem 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 comando: –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 especificas para módem sobre el dispositivo de serie, como colgar la línea antes y después de la llamada. Si no utiliza esta opción, el pppd no se preocupara 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; el chat permite el uso de scripts mucho mas complejos. Una característica muy útil es la capacidad de especificar cadenas frente a las cuales parar el 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 no descuelga. Para hacer que el 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 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 del chat de la siguiente manera:
    ogin:-BREAK-ogin: ppp ssword: GaGariN

Ahora, cuando el 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 continua como usualmente y si no, termina con un error.

Notas

[1]

Si edita el syslog.conf para redirigir estos mensajes a un fichero, asegúrese de que este fichero no pueda ser leído por cualquiera, pues el chat también captura todo el script de entrada por defecto - incluyendo las contraseñas.