Linux |
CentOS 4.8 |
|
chat(8) |
chat − Script de conversation automatisée avec un modem |
chat [ options ] script |
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. |
-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. |
-t <timeout> |
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. |
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 "\r". 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. |
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) |
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. |
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. |
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. |
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 |
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... |
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. |
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. |
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’ |
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). |
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. |
ABORT ’BUSY’ |
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é. |
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. La séquence EOT peut être incluse dans une chaîne d’envoi en utilisant la séquence ^D. |
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. La séquence d’interruption peut être incluse dans une chaîne d’envoi en utilisant la séquence \K. |
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 "hello\c" 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 |
Envoie un caractère nul. La même séquence peut être représentée par \0. (Non valide dans une chaîne attendue.) |
||
\p |
Marque une pause d’1/10 de seconde. (Non valide dans une chaîne attendue.) |
||
\q |
Empêche l’écriture de la chaîne dans le fichier SYSLOG. La chaîne ?????? est écrite à sa place. (Non valide dans une chaîne attendue.) |
||
\r |
Envoie ou attend un retour chariot. |
||
\s |
Représente un espace dans la chaîne. Cela peut être utilisé pour éviter de mettre la chaîne entre guillemets. Les séquences ’HI TIM’ et HI\sTIM sont équivalentes. |
||
\t |
Envoie ou attend un caractère de tabulation. |
||
\T |
Envoie la chaîne passée en paramètre par l’option -T. (Non valide dans une chaîne attendue.) |
||
\U |
Envoie la chaîne passée en paramètre par l’option -U. (Non valide dans une chaîne attendue.) |
||
\\ |
Envoie ou attend un caractère "backslash". |
||
\ddd |
Envoie le caractère ASCII donc le code en octal est ddd. (Certains caractères ne sont pas valides dans une chaîne attendue.) |
||
^C |
Substitue à la séquence le caractère de contrôle représenté par C. Par exemple, le caractère DC1 (17) est représenté par ^Q. (Certains caractères ne sont pas valides dans une chaîne attendue.) |
Les variables d’environnement sont disponibles dans les scripts chat si l’option -E a été spécifiée sur la ligne de commande. Le métacaractère $ est utilisé pour introduire le nom de la variable d’environnement à substituer. Si la substitution échoue parce que la variable n’est pas définie, rien ne remplacera la variable. |
Le programme chat se terminera en renvoyant l’un de ces codes : |
0 |
Terminaison normale du programme. Cela indique que le script s’est exécuté sans erreur jusqu’à la fin. |
||
1 |
L’un au moins des paramètres est invalide, ou bien une chaîne attendue est trop longue pour les tampons internes. Cela indique que le programme ne s’est pas exécuté correctement. |
||
2 |
Un erreur est survenue durant l’exécution du programme. Cela peut être dû à une erreur de lecture ou d’écriture, ou à la réception par CHAT d’un signal comme SIGINT. |
||
3 |
Une expiration de délai (timeout) a eu lieu pendant l’attente d’une chaîne sans chaîne "-sousenvoyée". Cela peut vouloir dire que votre script n’est pas adapté aux conditions, ou qu’un événement inattendu a eu lieu, et que la chaîne attendue n’a pas été reçue. |
||
4 |
La première chaîne marquée par une condition ABORT a été détectée. |
||
5 |
La deuxième chaîne marquée par une condition ABORT a été détectée. |
||
6 |
La troisième chaîne marquée par une condition ABORT a été détectée. |
||
7 |
La quatrième chaîne marquée par une condition ABORT a été détectée. |
||
... |
Toutes les autres valeurs de retour indiquent aussi une condition ABORT. |
Grâce à la valeur de retour, il est possible de déterminer quel événement a terminé le script. Il est possible de décider si la chaîne "BUSY" a été reçue par le modem, ou si c’est "NO DIAL TONE". Dans le premier cas, il est possible de refaire une tentative plus tard, alors que cela a peu de chance de marcher (sans intervention manuelle) dans le second. |
Des informations supplémentaires sur les scripts chat peuvent être trouvées dans la documentation UUCP. Le script chat a été développé à partir d’idées proposées dans les scripts utilisés par le programme uucico. uucico(1), uucp(1) |
Le programme chat est dans le domaine public. Il n’est PAS sous la Licence Publique GNU (GPL). S’il se casse, vous pouvez garder les morceaux. |
Guillaume Allègre <Guillaume.Allegre@imag.fr>, août 2000 |
chat(8) |