8.4. Realización de la Llamada con chat

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.

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 chat también captura todo el script de entrada por omisión - incluyendo las contraseñas.