zion - chat
Nom
chat - Script de conversation automatisée avec un modem
Résumé
chat [ options ] script
Description
Le programme chat régit une « conversation » entre l'ordinateur et le modem. Son but premier est d'établir la connexion entre pppd, le démon du Protocole Point à Point, et le processus pppd distant.
Options
-f <fichier chat>
Utilise le script chat du fichier chat. L'utilisation de cette option et celle des paramètres de chat sont mutuellement exclusives. L'utilisateur doit avoir le droit de lecture sur le fichier. Le fichier peut comporter plusieurs lignes ; les blancs et les caractères de tabulation sont utilisables pour séparer les chaînes. |
[b]-t <timeout>[/b]
Fixe le temps limite (en secondes) d'attente d'une chaîne. Si la chaîne n'est pas reçue dans ce temps, la chaîne-réponse n'est pas envoyée. Une chaîne alternative peut être envoyée. S'il n'y en a pas, le script s'arrêtera sur une erreur. Dans ce cas, le programme chat se terminera avec une valeur de retour non nulle. |
-r <fichier rapport>
Détermine le fichier devant contenir les chaînes de rapport (voir ci-dessous). Si vous précisez le mot-clef REPORT dans le script, les chaînes suivant celui-ci seront écrites dans ce fichier. Si cette option n'est pas utilisée, mais que vous mentionnez quand même REPORT dans le script, la sortie standard (stderr) sera utilisée pour le rapport des chaînes transmises. |
-e
Démarre avec l'option echo activée. Cette option peut aussi être activée ou désactivée en des points spécifiques du script chat, en utilisant le mot-clef ECHO. Quand echo est activée, toutes les sorties du modem sont envoyées vers stderr. |
-E
Active la substitution des variables d'environnement à l'intérieur des scripts chat, grâce à la syntaxe standard $xxx. |
-v
Demande que le script chat soit exécuté en mode bavard. Le programme chat enregistrera alors l'état d'exécution du script, en plus des chaînes reçues et envoyées au modem. La méthode par défaut d'enregistrement est d'utiliser le SYSLOG ; elle peut être modifiée par les drapeaux -S et -s. |
-V
Demande que le script chat soit exécuté en mode bavard sur stderr. Le programme chat affichera alors sur la sortie standard toutes les chaînes reçues et envoyées au modem. La sortie standard est généralement la console locale de l'ordinateur exécutant le programme chat ou pppd. |
-s
Utilise la sortie standard (stderr). Tous les messages d'enregistrement générés par '-v' et tous les messages d'erreur seront envoyés vers stderr. |
-S
N'utilise pas le SYSLOG. Par défaut, les messages d'erreur sont envoyés vers SYSLOG. L'utilisation de -S empêchera les messages générés par '-v' et les messages d'erreur d'être envoyés vers le SYSLOG. |
-T <No tél.>
Passe une chaîne arbitraire, habituellement un numéro de téléphone, qui sera substitué au métacaractère de substitution T dans une chaîne d'envoi. |
-U <2e No tél.>
Passe une deuxième chaîne, habituellement un numéro de téléphone, qui sera substitué au métacaractère de substitution U dans une chaîne d'envoi. C'est utile pour appeler un modem ISDN, qui a besoin de deux numéros. |
script
Si le script n'est pas lu dans un fichier avec l'option -f, il doit être inclus sous forme de paramètres du programme chat. |
Script chat
Le script chat régit les communications.
Un script consiste en une ou plusieurs paires de chaînes attendue/envoyée ("expect-send"), séparées par des espaces, avec une paire optionnelle "sous-attendue/sous-envoyée" ("subexpect-subsend"), séparées par un tiret, comme dans l'exemple suivant :
ogin:-BREAK-ogin: ppp ssword: hello2u2 |
Cette ligne indique au programme chat d'attendre la chaîne "ogin:". S'il ne reçoit pas d'invite de login dans l'intervalle de temps alloué, il doit envoyer une séquence d'interruption (BREAK) à son correspondant, puis attendre à nouveau la chaîne "ogin:". Si le premier "ogin:" est reçu, la séquence d'interruption n'est pas envoyée.
Dès qu'il aura reçu l'invite de login, le programme chat enverra la chaîne "ppp", puis attendra l'invite "ssword:". À sa réception, il enverra le mot de passe "hello2u2".
Un retour chariot suit normalement chaque chaîne envoyée. En revanche, aucun retour chariot n'est prévu dans une chaîne attendue, à moins qu'il ne soit spécifiquement exigé en utilisant la séquence de caractères "
".
La chaîne attendue ne devrait contenir que le strict nécessaire pour identifier la chaîne. Comme elle est normalement stockée dans un fichier sur le disque, elle ne devrait pas contenir d'information variable, comme des heures, des durées, des identifications de réseau.
Pour être moins sensible aux caractères qui pourraient être corrompus pendant la séquence initiale, attendez la chaîne "ogin:" plutôt que "login:". Il est possible que le "l" de tête soit mal reçu, et dans ce cas vous ne chat ne trouvera jamais la chaîne attendue. Pour la même raison, les scripts attendent "ssword:" plutôt que "password:".
Un script très simple pourrait ressembler à ceci :
ogin: ppp ssword: hello2u2 |
En clair, attend ....ogin:, envoie ppp, attend ...ssword:, envoie hello2u2.
Dans la pratique, les scripts simples sont rares. Au minimum, vous devriez inclure des séquences "sous-attendues" au cas où la chaîne d'origine ne soit pas reçue. Par exemple, examinez le script suivant :
ogin:--ogin: ppp ssword: hello2u2 |
C'est un script un peu meilleur que celui, simpliste, utilisé précédemment. Il attend la même invite "login:", mais si elle n'est pas reçue, il envoie un simple retour chariot, puis se remet en attente de "login:". Si du bruit sur la ligne interfère avec la première invite, l'envoi d'une ligne vide génère habituellement une nouvelle invite.
Commentaires
Des commentaires peuvent être inclus dans un script chat. Un commentaire est une ligne commençant par un caractère # (dièse) en première colonne. Ces lignes sont simplement ignorées par le programme chat. Si un caractère '#' est le premier caractère d'une chaîne attendue, cette chaîne doit être placée entre guillemets :
# Attend maintenant l'invite puis envoie la chaîne "logout" (déconnexion) '# ' logout |
Envoyer des donnÉes depuis un fichier
Si la chaîne à envoyer commence par une arobase (@), le reste de la chaîne est considéré comme le nom d'un fichier à lire pour obtenir la chaîne à envoyer. Si le dernier caractère des données lues est un saut de ligne, il est supprimé. Le fichier peut être un fifo au lieu d'un fichier régulier. Cela fournit à chat un moyen de communiquer avec un autre programme, par exemple un programme qui affiche une invite et reçoit un mot de passe entré par l'utilisateur.
ChaÃŽnes dabandon (abort)
La plupart des modems signalent l'état de la communication sous forme d'une chaîne. Ces chaînes peuvent être CONNECTED (connecté), NO CARRIER (pas de porteuse), ou BUSY (occupé). Il est souvent préférable de terminer le script si le modem échoue à se connecter à son correspondant. La difficulté est qu'un script ne peut pas savoir exactement quelle chaîne il risque de recevoir du modem. Lors d'une tentative, il peut recevoir BUSY, alors qu'à la suivante, il recevra NO CARRIER.
Ces chaînes "d'abandon" ("abort") peuvent être spécifiées dans le script avec le mot-clef ABORT, comme dans l'exemple suivant :
ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ATDT5551212 CONNECT |
Cette séquence n'attend rien, et envoie la chaîne ATZ (initialisation modem). La réponse attendue est la chaîne OK. À sa réception, il envoie la chaîne ATDT5551212 pour composer le numéro. La chaîne attendue est alors CONNECT. Dès qu'elle est reçue, le reste du script est exécuté. Mais si le modem tombe sur une ligne occupée, il enverra la chaîne BUSY, qui correspondra à une des chaînes d'abandon. De même si le programme reçoit NO CARRIER. Les deux chaînes seront reconnues, et termineront toutes deux le script.
RÉinitialisation des chaÎnes dabandon (clr_abort)
Cette séquence permet d'effacer les chaînes ABORT précédemment spécifiées. Les chaînes ABORT sont gardées dans un tableau de taille prédéterminée (à la compilation) ; CLR_ABORT récupère l'espace des entrées effacées, qui peut alors être utilisé par les nouvelles chaînes.
ChaÃŽnes say
La directive SAY permet au script d'envoyer des chaînes à l'utilisateur, à travers la sortie d'erreur standard du terminal. Si chat est lancé par pppd, et que pppd tourne comme démon (détaché de son terminal de contrôle), l'erreur standard sera normalement redirigée vers le fichier /etc/ppp/connect-errors.
Les chaînes SAY doivent être entre apostrophes simples ou doubles. Si un retour chariot ou un saut de ligne est nécessaire en sortie, vous devez l'ajouter explicitement à la chaîne.
Les chaînes SAY peuvent être utilisées pour afficher des messages de progression dans des sections du script en 'ECHO OFF', mais pendant lesquelles vous voulez tout de même tenir l'utilisateur au courant de ce qui se passe. Voici un exemple :
ABORT BUSY ECHO OFF SAY "J'appelle votre FAI... " '' ATDT5551212 TIMEOUT 120 SAY "J'attends la connexion jusqu'à 2 minutes... " CONNECT '' SAY "Connecté, maintenant je me logue...n" ogin: account ssword: pass $ c SAY "OK, logué...n" etc ... |
Cette séquence ne présentera à l'utilisateur que les chaînes SAY, et lui épargnera tous les détails. Par exemple, si le script ci-dessus fonctionne, l'utilisateur verra :
J'appelle votre FAI... J'attends la connexion jusqu'à 2 minutes... Connecté, maintenant je me loggue... OK, loggué... |
ChaÃŽnes de rapport
Une chaîne de rapport (report) est similaire à une chaîne ABORT. La différence est que les chaînes, ainsi que tous les caractères jusqu'au prochain caractère de contrôle (comme le retour chariot), sont écrites dans le fichier de rapport.
Les chaînes de rapport peuvent être utilisées pour extraire le débit de la chaîne de connexion envoyée par le modem, et envoyer la valeur à l'utilisateur de chat. L'analyse des chaînes de rapport se pratique idéalement couplée avec le traitement des autres chaînes, comme l'attente d'une chaîne "expect". L'utilisation d'une même chaîne dans deux séquences REPORT et ABORT n'est probablement pas très utile, mais elle est toutefois possible.
Ces chaînes de rapport peuvent être spécifiées dans le script par le mot-clef REPORT, comme dans l'exemple suivant :
REPORT CONNECT ABORT BUSY '' ATDT5551212 CONNECT '' ogin: account |
Cette séquence n'attend rien, et envoie la chaîne ATDT5551212 pour composer le numéro. La chaîne attendue est CONNECT. Si elle est reçue, le reste du script est exécuté. En outre, le programme écrira dans le fichier de rapport la chaîne "CONNECT", plus tous les caractères qui la suivent, comme le débit en bauds.
RÉinitialisation des chaÎnes de rapport (clr_report)
Cette séquence permet d'effacer les chaînes REPORT précédemment spécifiées. Les chaînes REPORT sont gardées dans un tableau de taille prédéterminée (à la compilation) ; CLR_REPORT récupère l'espace des entrées effacées, qui peut alors être utilisé par les nouvelles chaînes.
Echo
L'option echo contrôle si la sortie du modem doit être dupliquée vers stderr. Cette option peut être activée avec l'option -e sur la ligne de commande, mais peut aussi être contrôlée par le mot-clef ECHO dans le script. La paire "attendue/envoyée" ECHO ON active l'option, et ECHO OFF la désactive. Grâce à ce mot-clef, vous pouvez sélectionner quelles parties de la conversation doivent être visibles. Par exemple, avec le script suivant :
ABORT 'BUSY' ABORT 'NO CARRIER' '' ATZ OK ATD1234567 c ECHO ON CONNECT c ogin: account |
Toutes les sorties résultant de la configuration du modem et de la numérotation restent invisibles, alors que tout est visible à partir du message CONNECT (ou BUSY).
Hangup
L'option HANGUP contrôle si un raccrochage du modem doit être considéré comme une erreur ou pas. Cette option est utile dans les scripts pour les systèmes de rappel, qui raccrochent et rappellent votre système. Les options de HANGUP peuvent être ON ou OFF. Si HANGUP est réglé à OFF et que le modem raccroche (par exemple, à la fin de la première étape de connexion à un système de rappel), chat continuera d'exécuter le script (par exemple, par l'attente d'un appel entrant et d'une invite de login en début de seconde étape). Dès que l'appel entrant est pris, vous pouvez utiliser la directive HANGUP ON pour réinstaurer le comportement normal au signal de raccrochage. Voici un script (simple) d'exemple :
ABORT 'BUSY' '' ATZ OK ATD1234567 c CONNECT c 'Callback login:' call_back_ID HANGUP OFF ABORT "Bad Login" 'Callback Password:' Call_back_password TIMEOUT 120 CONNECT c HANGUP ON ABORT "NO CARRIER" ogin:--BREAK--ogin: real_account etc ... |
DÉlai dexpiration (timeout)
Le délai d'expiration (timeout) initial est de 45 secondes. Il peut être changé par le paramètre -t de la ligne de commande.
Pour changer la valeur du délai pour la prochaine chaîne attendue, inspirez-vous de l'exemple suivant :
ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:--ogin: TIMEOUT 5 assword: hello2u2 |
Cela fixe le délai d'expiration à 10 secondes pendant l'attente de l'invite "login:". Puis ce délai est ramené à 5 secondes pendant l'attente de l'invite de mot de passe.
Une fois modifié, le nouveau délai reste en vigueur jusqu'à ce qu'il soit à nouveau changé.
Envoyer un eot
La chaîne d'envoi spéciale EOT indique que le programme chat doit envoyer un caractère EOT (End Of Transmission, fin de transmission) à son correspondant. Normalement, c'est la séquence de caractères End-of-file (fin de fichier). Aucun caractère de retour n'est envoyé après l'EOT. .PR La séquence EOT peut être incluse dans une chaîne d'envoi en utilisant la séquence ^D.
GÉnÉrer une interruption (break)
La chaîne d'envoi spéciale BREAK envoie une interruption. Il s'agit d'un signal spécial généré par le modem (NdT : courte interruption de la porteuse). Des interruptions peuvent être utilisées pour changer cycliquement de débit de transmission, parmi ceux disponibles sur le correspondant, jusqu'à ce que vous receviez une invite valide. .PR La séquence d'interruption peut être incluse dans une chaîne d'envoi en utilisant la séquence K.
SÉquences dÉchappement
Les chaînes attendues et envoyées peuvent contenir des séquences d'échappement. Elles sont toutes autorisées dans les chaînes de réponse (envoyées), la plupart le sont dans les chaînes attendues. Celles qui ne le sont pas sont signalées.
''
Attend ou envoie une chaîne vide. Si vous envoyez une chaîne vide, chat enverra aussi le caractère retour chariot. Cette séquence peut être entourée d'apostrophes simples ou doubles. |
\b
représente un backspace. |
\c
Supprime le caractère retour chariot à la fin de la chaîne envoyée. C'est la seule méthode pour envoyer une chaîne sans retour chariot final. Il doit être placé à la fin de la chaîne d'envoi. Par exemple, la séquence "helloc" enverra simplement les caractères h, e, l, l, o. (Non valide dans une chaîne attendue.) |
\d
Délai d'une seconde. Le programme utilise sleep(1), qui attendra une seconde. (Non valide dans une chaîne attendue.) |
\K
Insère une interruption (BREAK). (Non valide dans une chaîne attendue.) |
\n
Envoie un saut de ligne. |
\N
Poster un commentaire