CHAT(8) Maintenance Commands and Procedures CHAT(8)

NAME


chat - automated conversational exchange tool

SYNOPSIS


chat [options] script


DESCRIPTION


The chat program implements a conversational text-based exchange
between the computer and any serial device, including (but not
limited to) a modem, an ISDN TA, and the remote peer itself,
establishing a connection between the Point-To-Point Protocol daemon
(pppd) and the remote pppd process.

OPTIONS


The chat command supports the following options:

-f <chat file>
Read the chat script from the chat file. This
option is mutually exclusive with the chat
script parameters. You must have read access
to use the file. Multiple lines are permitted
in the file. Use the space or horizontal tab
characters to separate the strings.


-t <timeout>
Set the timeout for the expected string to be
received. If the string is not received within
the time limit, the reply string is not sent.
If specified, a 'subexpect' (alternate reply)
string can be sent. Otherwise, if no alternate
reply strings remain, the chat script fails. A
failed script will cause the chat program to
terminate with a non-zero error code.


-r <report file>
Set the file for output of the report strings.
If you use the keyword REPORT, the resulting
strings are written to this file. If the -r
option is not used and you use the REPORT
keyword, the stderr file is used for the
report strings.


-e
Start with the echo option turned on. You turn
echo on or off at specific points in the chat
script using the ECHO keyword. When echoing is
enabled, all output from the modem is echoed
to stderr.


-E
Enables environment variable substitution
within chat scripts using the standard $xxx
syntax.


-v
Request that the chat script execute in a
verbose mode. The chat program logs the
execution state of the chat script as well as
all text received from the modem and output
strings sent to the modem. The default is to
log through syslog(3C) with facility local2;
the logging method is alterable using the -S
and -s options.


-V
Request that the chat script be executed in a
stderr verbose mode. The chat program logs
all text received from the modem and output
strings sent to the modem to stderr. stderr is
usually the local console at the station
running the chat or pppd program.


-s
Use stderr. Log messages from -v and error
messages are sent to stderr.


-S
Do not use syslog. By default, error messages
are set to syslog. This option prevents log
messages from -v and error messages from being
sent to syslog.


-T <phone number>
Pass in an arbitrary string (usually a
telephone number) that will be substituted for
the \T substitution metacharacter in a send
string.


-U <phone number 2>
Pass in a second string (usually a telephone
number) that will be substituted for the \U
substitution metacharacter in a send string.
This is useful when dialing an ISDN terminal
adapter that requires two numbers.


script
If the script is not specified in a file with
the -f option, the script is included as
parameters to the chat program.


EXTENDED DESCRIPTION


Chat Script


The chat script defines communications. A script consists of one or
more "expect-send" pairs of strings separated by spaces, with an
optional "subexpect-subsend" string pair, separated by a dash (as in
the following example:)


ogin:-BREAK-ogin: ppp ssword: hello2u2


The example indicates that the chat program should expect the string
"ogin:". If it fails to receive a login prompt within the time
interval allotted, it sends a break sequence to the remote and then
expects the string "ogin:". If the first "ogin:" is received, the
break sequence is not generated.


Upon receiving the login prompt, the chat program sends the string
"ppp" and then expects the prompt "ssword:". When the password prompt
is received, it sends the password hello2u2.


A carriage return is normally sent following the reply string. It is
not expected in the "expect" string unless it is specifically
requested by using the \r character sequence.


The expect sequence should contain only what is needed to identify
the received data. Because it's stored on a disk file, it should not
contain variable information. Generally it is not acceptable to look
for time strings, network identification strings, or other variable
pieces of data as an expect string.


To correct for characters that are corrupted during the initial
sequence, look for the string "ogin:" rather than "login:". The
leading "l" character may be received in error, creating problems in
finding the string. For this reason, scripts look for "ogin:" rather
than "login:" and "ssword:" rather than "password:".


An example of a simple script follows:

ogin: ppp ssword: hello2u2


The example can be interpreted as: expect ogin:, send ppp, expect
...ssword:, send hello2u2.


When login to a remote peer is necessary, simple scripts are rare. At
minimum, you should include sub-expect sequences in case the original
string is not received. For example, consider the following script:

ogin:--ogin: ppp ssword: hello2u2


This script is more effective than the simple one used earlier. The
string looks for the same login prompt; however, if one is not
received, a single return sequence is sent and then the script looks
for login: again. If line noise obscures the first login prompt, send
the empty line to generate a login prompt again.

Comments


Comments can be embedded in the chat script. Comment lines are
ignored by the chat program. A comment starts with the hash ("#")
character in column one. If a # character is expected as the first
character of the expect sequence, quote the expect string. If you
want to wait for a prompt that starts with a # character, write
something like this:

# Now wait for the prompt and send logout string
'# ' logout


Sending Data From A File


If the string to send begins with an at sign ("@"), the remainder of
the string is interpreted as the name of the file that contains the
string. If the last character of the data read is a newline, it is
removed. The file can be a named pipe (or fifo) instead of a regular
file. This enables chat to communicate with another program, for
example, a program to prompt the user and receive a password typed
in.

Abort


Many modems report the status of a call as a string. These status
strings are often "CONNECTED" or "NO CARRIER" or "BUSY." If the modem
fails to connect to the remote, you can terminate the script. Abort
strings may be specified in the script using the ABORT sequence. For
example:

ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ATDT5551212 CONNECT


This sequence expects nothing and sends the string ATZ. The expected
response is the string OK. When OK is received, the string
ATDT5551212 dials the telephone. The expected string is CONNECT. If
CONNECT is received, the remainder of the script is executed. When
the modem finds a busy telephone, it sends the string BUSY, causing
the string to match the abort character sequence. The script fails
because it found a match to the abort string. If the NO CARRIER
string is received, it aborts for the same reason.

Clr_Abort
The CLR_ABORT sequence clears previously set ABORT strings. ABORT
strings are kept in an array of a pre-determined size; CLR_ABORT
reclaims the space for cleared entries, enabling new strings to use
that space.

Say


The SAY string enables the script to send strings to a user at a
terminal via standard error. If chat is being run by pppd and pppd is
running as a daemon (detached from its controlling terminal),
standard error is normally redirected to the /etc/ppp/connect-errors
file.


SAY strings must be enclosed in single or double quotes. If carriage
return and line feed are required for the output, you must explicitly
add them to your string.


The SAY string can provide progress messages to users even with "ECHO
OFF." For example, add a line similar to the following to the script:

ABORT BUSY
ECHO OFF
SAY "Dialing your ISP...\n"
'' ATDT5551212
TIMEOUT 120
SAY "Waiting up to 2 minutes for connection ..."
CONNECT ''
SAY "Connected, now logging in ...\n"
ogin: account
ssword: pass
$ \c
SAY "Logged in OK ... \n"


This sequence hides script detail while presenting the SAY string to
the user. In this case, you will see:

Dialing your ISP...
Waiting up to 2 minutes for connection...Connected, now logging in...
Logged in OK ...


Report


REPORT is similar to the ABORT string. With REPORT, however, strings
and all characters to the next control character (such as a carriage
return), are written to the report file.


REPORT strings can be used to isolate a modem's transmission rate
from its CONNECT string and return the value to the chat user.
Analysis of the REPORT string logic occurs in conjunction with other
string processing, such as looking for the expect string. It's
possible to use the same string for a REPORT and ABORT sequence, but
probably not useful.


Report strings may be specified in the script using the REPORT
sequence. For example:

REPORT CONNECT
ABORT BUSY
ATDT5551212 CONNECT
ogin: account


The above sequence expects nothing, then sends the string ATDT5551212
to dial the telephone. The expected string is CONNECT. If CONNECT is
received, the remainder of the script is executed. In addition, the
program writes the string CONNECT to the report file (specified by
-r) in addition to any characters that follow.

Clr_Report
CLR_REPORT clears previously set REPORT strings. REPORT strings are
kept in an array of a pre-determined size; CLR_REPORT reclaims the
space for cleared entries so that new strings can use that space.

Echo


ECHO determines if modem output is echoed to stderr. This option may
be set with the -e option, but can also be controlled by the ECHO
keyword. The "expect-send" pair ECHO ON enables echoing, and ECHO
OFF disables it. With ECHO, you can select which parts of the
conversation should be visible. In the following script:

ABORT 'BUSY'
ABORT 'NO CARRIER'
"" AT&F
OK\r\n ATD1234567
\r\n \c
ECHO ON
CONNECT \c
ogin: account


All output resulting from modem configuration and dialing is not
visible, but output is echoed beginning with the CONNECT (or BUSY)
message.

Hangup


The HANGUP option determines if a modem hangup is considered as an
error. HANGUP is useful for dialing systems that hang up and call
your system back. HANGUP can be ON or OFF. When HANGUP is set to OFF
and the modem hangs up (for example, following the first stage of
logging in to a callback system), chat continues running the script
(for example, waiting for the incoming call and second stage login
prompt). When the incoming call is connected, use the HANGUP ON
string to reinstall normal hang up signal behavior. An example of a
simple script follows:

ABORT 'BUSY'
"" AT&F
OK\r\n ATD1234567
\r\n \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


Timeout


The initial timeout value is 45 seconds. Use the -t parameter to
change the initial timeout value.


To change the timeout value for the next expect string, the following
example can be used:

''"AT&F
OK ATDT5551212
CONNECT \c
TIMEOUT 10
ogin:--ogin: username
TIMEOUT 5
assword: hello2u2


The example changes the timeout to ten seconds when it expects the
login: prompt. The timeout is changed to five seconds when it looks
for the password prompt.


Once changed, the timeout value remains in effect until it is changed
again.

EOT
The EOT special reply string instructs the chat program to send an
EOT character to the remote. This is equivalent to using ^D\c as the
reply string. The EOT string normally indicates the end-of-file
character sequence. A return character is not sent following the EOT.
The EOT sequence can embedded into the send string using the sequence
^D.

BREAK
The BREAK special reply string sends a break condition. The break is
a special transmitter signal. Many UNIX systems handle break by
cycling through available bit rates, and sending break is often
needed when the remote system does not support autobaud. BREAK is
equivalent to using \K\c as the reply string. You embed the break
sequence into the send string using the \K sequence.

Escape Sequences


Expect and reply strings can contain escape sequences. Reply strings
accept all escape sequences, while expect strings accept most
sequences. A list of escape sequences is presented below. Sequences
that are not accepted by expect strings are indicated.

''
Expects or sends a null string. If you send a null string,
chat sends the return character. If you expect a null
string, chat proceeds to the reply string without waiting.
This sequence can be a pair of apostrophes or quote mark
characters.


\b
Represents a backspace character.


\c
Suppresses the newline at the end of the reply string. This
is the only method to send a string without a trailing
return character. This sequence must be at the end of the
send string. For example, the sequence hello\c will simply
send the characters h, e, l, l, o. (Not valid in expect.)


\d
Delay for one second. The program uses sleep(1) which
delays to a maximum of one second. (Not valid in expect.)


\K
Insert a BREAK. (Not valid in expect.)


\n
Send a newline or linefeed character.


\N
Send a null character. The same sequence may be represented
by \0. (Not valid in expect.)


\p
Pause for 1/10th of a second. (Not valid in expect.)


\q
Suppress writing the string to syslog. The string ??????
is written to the log in its place. (Not valid in expect.)


\r
Send or expect a carriage return.


\s
Represents a space character in the string. Can be used
when it is not desirable to quote the strings which
contains spaces. The sequence 'HI TIM' and HI\sTIM are the
same.


\t
Send or expect a tab character.


\T
Send the phone number string as specified with the -T
option. (Not valid in expect.)


\U
Send the phone number 2 string as specified with the -U
option. (Not valid in expect.)


\\
Send or expect a backslash character.


\ddd
Collapse the octal digits (ddd) into a single ASCII
character and send that character. (\000 is not valid in an
expect string.)


^C
Substitute the sequence with the control character
represented by C. For example, the character DC1 (17) is
shown as ^Q. (Some characters are not valid in expect.)


ENVIRONMENT VARIABLES


Environment variables are available within chat scripts if the -E
option is specified on the command line. The metacharacter $
introduces the name of the environment variable to substitute. If the
substitution fails because the requested environment variable is not
set, nothing is replaced for the variable.

EXIT STATUS


The chat program terminates with the following completion codes:

0
Normal program termination. Indicates that the script was
executed without error to normal conclusion.


1
One or more of the parameters are invalid or an expect
string was too large for the internal buffers. Indicates
that the program was not properly executed.


2
An error occurred during the execution of the program. This
may be due to a read or write operation failing or chat
receiving a signal such as SIGINT.


3
A timeout event occurred when there was an expect string
without having a "-subsend" string. This indicates that you
may not have programmed the script correctly for the
condition or that an unexpected event occurred and the
expected string could not be found.


4
The first string marked as an ABORT condition occurred.


5
The second string marked as an ABORT condition occurred.


6
The third string marked as an ABORT condition occurred.


7
The fourth string marked as an ABORT condition occurred.


...
The other termination codes are also strings marked as an
ABORT condition.


To determine which event terminated the script, use the termination
code. It is possible to decide if the string "BUSY" was received from
the modem versus "NO DIALTONE." While the first event may be retried,
the second probably will not succeed during a retry.

ATTRIBUTES


See attributes(7) for descriptions of the following attributes:


+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | Evolving |
+--------------------+-----------------+

SEE ALSO


sleep(1), uucp(1C), syslog(3C), attributes(7), pppd(8), uucico(8)


Additional information on chat scripts are available with UUCP
documentation. The chat script format was taken from scripts used by
the uucico program.

August 29, 2021 CHAT(8)

tribblix@gmail.com :: GitHub :: Privacy