CHAT(8) System Manager's Manual CHAT(8)

chat - zautomatyzowany skrypt dialogu z modemem

chat [ opcje ] skrypt

Program chat definiuje wymianę rozmów między komputerem a modemem. Jego głównym celem jest zestawianie połączeń pomiędzy demonem Point-To-Point (pppd), a procesem pppd drugiego końca.

-f plik
Odczytuje skrypt rozmowy z pliku plik. Używanie tej opcji wyklucza parametry skryptowe rozmowy. Użytkownik musi mieć prawa do odczytu tego pliku. Dozwolonych jest wiele wierszy w pliku. Do oddzielania napisów powinny być używana spacja lub tabulacja.
-t czas-oczekiwania
Set the timeout for the expected string to be received. If the string is not received within the time limit then the reply string is not sent. An alternate reply may be sent or the script will fail if there is no alternate reply string. A failed script will cause the chat program to terminate with a non-zero error code.
-r plik-raportu
Ustaw plik dla wyjścia napisów raportujących. Jeżeli używa się słowa kluczowego REPORT, napisy wynikowe są zapisywane do tego pliku. Jeśli opcja ta nie jest używana, można i tak używać słów REPORT, które użyją pliku stderr.
-e
Zaczyna z włączoną opcją echo. Można ją również włączyć lub wyłączyć w danym miejscu skryptu chat za pomocą słowa kluczowego ECHO. Przy włączeniu opcji echo, całe wyjście z modemu jest przekierowane na standardowe wyjście błędów.
-E
Włącza podmianę zmiennych środowiskowych w skryptach chat za pomocą standardowej składni $xxx
-v
Żąda uruchomienia skryptu chat w trybie szczegółowym. Program chat będzie wtedy logował wszystkie teksty uzyskane od modemu, a także te, które sam wysyła. Domyślnie logi wysyłane są do SYSLOG, metodę logowania można zmienić opcjami -S lub -s.
-V
Żąda uruchomienia skryptu chat w trybie szczegółowym, ale na standardowe wyjście błędów. Program będzie wówczas logował wszelki tekst otrzymany z modemu i łańcuchy wyjściowe wysyłane do modemu do urządzenia stderr. Urządzenie to jest zwykle lokalną konsolą stacji uruchamiającej program chat lub pppd.
-s
Używa standardowego wyjścia błędów. Wszystkie komunikaty loga z -v wraz z komunikatami o błędach będą wysyłane na stderr.
-S
Nie używa SYSLOG. Domyślnie, komunikaty o błędach są wysyłane do SYSLOG-a. Opcja -S powoduje, że komunikaty z opcji -v i wiadomości o błędach nie będą tam wysyłane.
-T numer telefonu
Przekazuje dowolny łańcuch, zwykle numer telefonu, który zostanie wstawiony w miejsce metaznaku \T w wysyłanym łańcuchu.
-U numer telefonu 2
Przekazuje drugi łańcuch, zwykle numer telefonu, który zostanie wstawiony w miejsce metaznaku \U w wysyłanym łańcuchu. Jest to przydatne przy wybieraniu adaptera terminala ISDN wymagającego dwóch numerów.
script
Jeśli skrypt nie jest podany opcją -f w pliku, to skrypt script jest włączany jako parametry programu chat.

Skrypt rozmowy definiuje komunikację.

Skrypt składa się z jednej lub większej ilości par napisów "oczekuj-wysyłaj", oddzielonych spacjami z ewentualnymi dodatkowymi parami "podoczekuj-podwysyłaj", oddzielonymi kreską, jak w przykładzie:

ogin:-BREAK-ogin: ppp ssword: hello2u2

Znaczy to, że chat powinien oczekiwać napisu "ogin:". Jeśli to zawiedzie (minie czas oczekiwania), to wysyła na drugi koniec sekwencję przerwania (break) i oczekuje napisu "ogin:". Jeśli jednak pierwszy "ogin:" zostanie odebrany, sekwencja przerwania nie jest wysyłana.

Gdy już uzyskaliśmy znak zachęty logowania, chat spróbuje wysłać napis ppp i oczekiwać na "ssword:". Gdy go odczyta, to wyśle hasło hello2u2.

Na zakończenie łańcucha odpowiedzi zwykle wysyłany jest znak powrotu karetki. Nie jest on oczekiwany w napisie "oczekiwania", chyba że jest specyficznie wskazany, przez użycie sekwencji \r.

Sekwencja oczekiwania powinna zawierać tylko to, co potrzebne do zidentyfikowania łańcucha. Ponieważ normalnie jest przechowywana na dysku, nie powinna zawierać informacji zmiennych. Generalnie nie jest akceptowane podglądanie łańcuchów czasu, identyfikacji sieci, lub innych zmiennych jako sekwencji oczekiwanej.

Aby pomóc poprawić znaki, które mogą być zmienione w sekwencji początkowej, oczekuj raczej napisu "ogin:" niż "login:". Jest możliwe, że początkowy znak będzie odebrany z błędem, a wtedy można nigdy nie znaleźć oczekiwanego napisu, chociaż został on wysłany przez system. Z tego powodu, skrypty oczekują "ogin:" zamiast "login:" i "ssword:" zamiast "password".

Bardzo prosty skrypt może wyglądać następująco:

ogin: ppp ssword: hello2u2

Innymi słowy, oczekuj ....ogin:, wyślij ppp, oczekuj ...ssword:, wyślij hello2u2.

W rzeczywistości proste skrypty są raczej rzadkie. Powinno się przynajmniej załączyć sekwencje "pod-oczekiwania". Proszę na przykład rozważyć następujący skrypt:

ogin:--ogin: ppp ssword: hello2u2

Byłby to lepszy skrypt niż poprzedni. Oczekiwałby na ten sam znak zachęty login:, lecz gdyby go nie odebrał, wysłałby sekwencję powrotu i oczekiwał dalej. Gdyby więc szum linii zniekształcił pierwszy znak zachęty, to późniejsze przesłanie pustej linii zazwyczaj wygeneruje nowe.

Komentarze można osadzić w skrypcie programu chat. Komentarz to wiersz zaczynający się znakiem # (kratką) w kolumnie 1. Są ignorowane przez program chat. Jeśli znak "#" ma znaleźć się jako pierwszy znak oczekiwanej sekwencji, oczekiwany łańcuch należy ująć w cudzysłów. Aby czekać na zachętę rozpoczynającą się # (kratką) można użyć składni podobnej do poniższej:
# Teraz czekaj na zachętę i wyślij łańcuch wylogowania
'# ' logout

Jeśli łańcuch przeznaczony do wysłania zaczyna się małpą (@), to reszta łańcucha jest traktowana jako nazwa pliku do odczytania, z którego wzięty jest łańcuch do wysłania. Jeśli ostatnim znakiem odczytanych danych jest znak nowego wiersza, to jest on usuwany. Plik może być nazwanym potokiem (lub fifo), a nie tylko zwykłym plikiem. W ten sposób chat może komunikować się z innym programem np. z programem pytającym użytkownika o hasło i otrzymującym wpisane hasło.

Wiele modemów raportuje status połączenia jako łańcuch. Łańcuchy te to np. CONNECTED, NO CARRIER, lub BUSY. Często jest właściwym wyłączenie skryptu, jeśli modem nie połączy się z drugim końcem. Przy jednej próbie może odebrać BUSY, podczas gdy następnym razem zdarzyć się może NO CARRIER.

Te łańcuchy "przerywania" mogą być podane w skrypcie przy użyciu sekwencji ABORT. Jest to zapisane w poniższym przykładzie:

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

Sekwencja ta nie będzie niczego oczekiwać; później wyśle ATZ. Oczekiwaną odpowiedzią jest OK. Po odebraniu OK, wysyłany jest łańcuch ATDT5551212, wykręcający numer telefonu. Oczekiwanym napisem jest CONNECT. Jeśli odebrany zostanie łańcuch CONNECT, to reszta skryptu jest wykonywana. Jednak jeśli modem spotka się z zajętą linią, to wyśle napis BUSY. Łańcuch ten będzie odpowiadał sekwencji przerwania. Skrypt wtedy zakończy działanie, ponieważ uzyskał rozkaz przerwania. Podobnie będzie, gdy skrypt uzyska łańcuch NO CARRIER.

Sekwencja ta pozwala cofnąć wcześniej ustawiony łańcuch ABORT. Łańcuchy ABORT są przechowywane w tablicy o z góry zdefiniowanym rozmiarze (w trakcie kompilacji), CLR_ABORT odzyskają przestrzeń usuniętych wpisów, dzięki czemu nowe łańcuchy będą mogły jej użyć.

Dyrektywa SAY pozwala skryptowi na wysłanie łańcucha do użytkownika i na terminal przez standardowe wyjście błędów. Jeśli chat został uruchomiony przez pppd działającego jako demona (odłączonego od kontrolującego go terminala), to standardowe wyjście błędów jest zwykle przekierowywane do pliku /etc/ppp/connect-errors.

Łańcuchy SAY muszą być ujęte w pojedynczy lub podwójny cudzysłów. Jeśli w łańcuchu ma pojawić się wyświetlany powrót karetki i wysuw wiersza, to trzeba dodać je jawnie do łańcucha.

Łańcuchy SAY można wykorzystać do przekazania wiadomości o postępie w sekcjach skryptu z włączoną opcją "ECHO OFF", lecz gdzie wciąż istotne jest powiadomienie użytkownika o tym co się dzieje. Oto przykład:

ABORT BUSY
ECHO OFF
SAY "Wybieranie numeru dostawcy...\n"
” ATDT5551212
TIMEOUT 120
SAY "Czekanie do 2 minut na połączenie... "
CONNECT ”
SAY "Połączono, teraz nastąpi zalogowanie...\n"
ogin: account
ssword: pass
$ \c
SAY "OK. Zalogowano...\n" etc ...

Ta sekwencja wypisze użytkownikowi same łańcuchy SAY, a wszystkie detale skryptu pozostaną ukryte. W powyższym przykładzie użytkownik zobaczy:

Wybieranie numeru dostawcy...
Czekanie do 2 minut na połączenie... Połączono, teraz nastąpi zalogowanie...
OK. Zalogowano...

Napis raportowy jest bardzo podobny do napisu przerywania. Różnica polega na tym, że łańcuchy i wszystkie znaki do następującego znaku sterującego, takiego jak CR, są wypisywane w pliku raportu.

Łańcuchy raportu mogą być używane do izolowania ze napisu połączenia ciągu określającego szybkość transmisji i zwracania wartości użytkownikowi. Analiza logiki napisu raportowego występuje w połączeniu z innym przetwarzaniem napisu, takim jak podglądanie napisu oczekiwanego. Użycie tego samego napisu jako przerywający i raportowy, prawdopodobnie nie jest zbyt użyteczne, jednak jest możliwe.

Łańcuchy raportowe nie wpływają na kod zakończenia programu.

Napisy raportowe mogą być podawane w skrypcie przy użyciu sekwencji REPORT. Jest to zapisywane w skrypcie jak w następującym przykładzie.

REPORT CONNECT ABORT BUSY ” ATDT5551212 CONNECT ” ogin: account

Sekwencja ta nie będzie oczekiwać niczego; a potem wyśle napis ATDT5551212, wykręcający numer telefonu. Oczekiwanym napisem jest CONNECT. Jeśli łańcuch ten jest odebrany, wykonywana jest reszta skryptu. Dodatkowo, program wydrukuje do oczekującego pliku napis CONNECT plus dodatkowo znaki, które za nim podążały, takie jak szybkość połączenia.

Sekwencja ta pozwala cofnąć wcześniej ustawiony łańcuch REPORT. Łańcuchy REPORT są przechowywane w tablicy o z góry zdefiniowanym rozmiarze (w trakcie kompilacji), CLR_REPORT odzyskają przestrzeń usuniętych wpisów, dzięki czemu nowe łańcuchy będą mogły jej użyć.

Opcje echo kontrolują czy wyjście z modemu jest przekierowywane na standardowe wyjście błędów. Opcje tę można ustawić za pomocą -e, lecz można ją kontrolować również słowem kluczowych ECHO. Para "oczekuj-wysyłaj" ECHO ON włącza ją, a ECHO OFF - wyłącza. Słowo kluczowe pozwala wybranie części konwersacji która ma być widoczna. Przykładowo w poniższym skrypcie:
ABORT 'BUSY'
ABORT 'NO CARRIER'
” ATZ
OK\r\n ATD1234567
\r\n \c
ECHO ON
CONNECT \c
ogin: account

niewidoczne są komunikaty wynikające z konfiguracji modemu i wybierania numeru, lecz poczynając od wiadomości CONNECT (lub BUSY) wszystko jest widoczne.

Opcja HANGUP kontroluje, czy rozłączenie modemu ma być traktowane jako błąd, czy też nie. Przydatne w skryptach do systemów telefonicznych, które rozłączają się i później oddzwaniają. Opcja HANGUP może być włączona (ON) lub wyłączona (OFF).
Gdy HANGUP jest ustawione na OFF i modem rozłącza się (np. po pierwszej fazie logowania do systemu oddzwaniającego) chat kontynuuje wykonywanie skryptu (np. oczekując na połączenie przychodzące i drugą fazę logowania). Zaraz po zawiązaniu połączenia przychodzącego powinno się użyć dyrektywy HANGUP ON w celu ponownego przywrócenia zwykłego zachowania. Oto (prosty) przykładowy skrypt:
ABORT 'BUSY'
” ATZ
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
etc ...

The initial timeout value is 45 seconds. This may be changed using the -t parameter.

Aby zmienić wartość czasu oczekiwania dla następnego z oczekiwanych napisów, można użyć następującego przykładu:

ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:--ogin: TIMEOUT 5 assword: hello2u2

Zmieni to czas oczekiwania na 10 sekund podczas oczekiwania zachęty login:. Następnie czas oczekiwania jest zmieniany na 5 sekund, podczas oczekiwania na czas oczekiwania password.

Zmieniony czas oczekiwania pozostaje efektywny aż do następnej zmiany.

Specjalny napis odpowiedzi, EOT, wskazuje, że program chat powinien wysłać znak EOT na drugi koniec. Normalnie jest to sekwencja End-of-file (koniec pliku). Nie przesyłany jest po niej znak return. EOT można umieścić w wysyłanym łańcuchu za pomocą sekwencji ^D.

Specjalny łańcuch odpowiedzi, BREAK, spowoduje wysłanie warunku przerwania. Sygnał ten jest specjalnym sygnałem. Normalną akcją u odbierającego go jest zmiana szybkości transmisji. Może być używany do przeskakiwania przez dostępne szybkości transmisji, aż będzie można odebrać prawidłowy znak zachęty logowania. Przerwanie można umieścić w wysyłanym łańcuchu za pomocą sekwencji \K.

Łańcuchy oczekiwania i odpowiedzi mogą zawierać sekwencje ucieczki. Wszystkie sekwencje są poprawne w łańcuchu odpowiedzi. Wiele jest prawidłowe w napisie oczekiwania. Te, które nie są poprawne w sekwencji oczekiwania, są zaznaczone.
Oczekuje lub wysyła łańcuch zerowy. W takim przypadku wysyłany jest znak return. Sekwencja ta może być zarówno parą apostrofów, jak i cudzysłowów.
\b
reprezentuje znak backspace.
\c
Powstrzymuje generowanie nowego wiersza na końcu łańcucha odpowiedzi. Jest to jedyna metoda wysyłania napisu bez kończącego go znaku return. Musi być wysyłana na końcu napisu. Na przykład sekwencja hello\c prześle po prostu znaki h, e, l, l, o. (nieprawidłowe w łańcuchu oczekiwania).
\d
Zatrzymuje się na sekundę. Program używa sleep(1), który zatrzyma się maksymalnie na sekundę. (nieprawidłowe w łańcuchu oczekiwania)
\K
Wstawia BREAK (nieprawidłowe w łańcuchu oczekiwania)
\n
Przesyła znak nowego wiersza lub powrotu wysuwu wiersza.
\N
Przesyła znak null. Ta sama sekwencja może być reprezentowana przez \0. (nieprawidłowe w łańcuchu oczekiwania)
\p
Pauzuje na część sekundy. Opóźnienie wynosi 1/10 sekundy. (nieprawidłowe w łańuchu oczekiwania)
\q
Zabrania zapisywania napisu do pliku SYSLOG. Do dziennika w jego miejscu wpisywany jest napis ???????. (nieprawidłowe w łańuchu oczekiwania)
\r
Wysyła lub oczekuje znak powrotu karetki.
\s
Reprezentuje znak spacji w łańuchu. Może to być używane, gdy nie jest pożądanym cytowanie łańcuchów zawierających spacje. Sekwencje 'HI TIM' i HI\sTIM są identyczne.
\t
Wysyła lub oczekuje znaku tabulacji.
\T
Wysyła łańcuch numeru telefonu podany opcją -T. (nieprawidłowe w łańuchu oczekiwania)
\U
Wysyła łańcuch numeru telefonu 2 podany opcją -U. (nieprawidłowe w łańuchu oczekiwania)
\\
Wysyła lub oczekuje znak odwrotnego ukośnika.
\ddd
Przekształca ósemkowe cyfry (ddd) w pojedynczy znak ASCII i wysyła ten znak. (niektóre znaki nie są używane w sekwencji oczekiwania)
^C
Podmienia sekwencję znakiem sterującym (z Ctrl) reprezentowanym przez C. Na przykład znak DC1 (17) jest pokazywany jako ^Q. (niektóre znaki nie są używane w sekwencji oczekiwania)

Zmienne środowiskowe są dostępne w skryptach chat, jeśli w wierszu polecenia podano opcję -E. Metaznak $ jest używany do wprowadzenia nazwy zmiennej środowiskowej do podmiany. Jeśli zamiana zawiedzie, ponieważ taka zmienna nie jest ustawiona, nic nie jest zamieniane zmienną.

Program chat kończy swoje działanie z następującymi kodami wyjścia.
0
Normalne zakończenie programu. Znaczy to, że skrypt został wykonany bez błędów.
1
Jeden, lub więcej parametrów było nieprawidłowych, lub napis oczekiwania był zbyt duży dla buforów wewnętrznych. Wskazuje to, że program nie był prawidłowo uruchomiony.
2
Pojawił się błąd podczas uruchomiania programu. Może to być spowodowane błędem operacji odczytu lub zapisu, lub odebraniem przez program sygnału takiego, jak SIGINT.
3
Nastąpiło minięcie czasu oczekiwania dla napisu oczekiwania, który nie miał napisu "pod-wysłania". Może to oznaczać, że nie zaprogramowano właściwie skryptu na ten warunek, lub że pojawiło się jakieś nieoczekiwane zdarzenie i oczekiwany napis nie mógł zostać znaleziony.
4
Pojawił się pierwszy łańcuch oznaczony jako warunek ABORT.
5
Pojawił się drugi łańcuch oznaczony jako warunek ABORT.
6
Pojawił się trzeci łańcuch oznaczony jako warunek ABORT.
7
Pojawił się czwarty łańcuch oznaczony jako warunek ABORT.
...
Inne kody wyjścia są również łańcuchami oznaczonymi jako ABORT.

Używając kodu wyjścia, możliwym jest określenie, które zdarzenie zakończyło skrypt. Jest możliwym określenie czy modem otrzymał np. napis "BUSY" czy "NO DIAL TONE". Podczas gdy pierwsze zdarzenie wymaga drugiej próby, drugie w ten sposób może mieć mniejsze szanse.

Dodatkowe informacje o skryptach chat można znaleźć w dokumentacji UUCP. Skrypty programu chat powstały z idei zaproponowanych przy skrypt programu uucico.

uucico(1), uucp(1)

Program chat jest znajduje się w domenie publicznej. Nie jest to publiczna licencja GNU. Autorzy nie udzielają żadnej gwarancji.

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres manpages-pl-list@lists.sourceforge.net.

22 maja 1999 Chat Wersja 1.22