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
- Ustawia czas oczekiwania dla odbioru oczekiwanego
łańcucha. Jeśli łańcuch nie zostanie
odebrany w limicie czasowym, to łańcuch odpowiedzi nie jest
wysyłany. Może być natomiast wysłana
alternatywna odpowiedź, lub skrypt może zostać
przerwany w wypadku braku takiej alternatywy. Program chat
zakończy wtedy działanie, zwracając niezerowy kod
błędu. Można również podać
łańcuch czas-oczekiwania, aby go
określić.
-
-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 ...
Początkowa wartość czasu oczekiwania to 45 sekund.
Może to być zmienione przy użyciu parametru
-t.
Można również podać "TIMEOUT 0".
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 <
[email protected]> i Michał
Kułach <
[email protected]>
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 listy dyskusyjnej
[email protected]