Expect

From ICO wiki
Jump to navigationJump to search

Koostamisel...

Sissejuhatus

Expect on Don Libes'i poolt kirjutatud Tcl (Tool Command Language) laiendus, mida kasutatakse erinevate käsurea tegevuste automatiseerimiseks. Põhiliselt kasutatakse expect'i käsurealt kasutatavate inetaktiivsete rakenduste (ssh, telnet, ftp, sudo jne) automatiseerimiseks. Expect on asendamatu abimees neile, kes tahavad automatiseerida näiteks paroolide muutmist, võrguseadmete haldamist vms tegevust, mis nõuab kasutaja-terminali vahelist suhtlust. Piltlikult võib öelda, et kasutades etteantud skripti expect "räägib" teiste interaktiivsete programmidaga. Järgides skripti expect teab mida programmilt oodata ja mida programmile erinevates olukordades "öelda".

Üldine

Expecti põhiliseks alustalaks on kolm käsku: expect, send ja spawn. Samuti on tihti suureks abiks käsk interact. Expect ootab teatud andmeid protsessilt. Send käsk saadab andmed protsessile. Spawn alustab protsessi. Interact annab juhtimise üle kasutajale.

Järgneva artikli paremaks mõistmiseks peaks olema eelnevalt tutvunud Linuxi käsureaga.

Send

Send käsk loeb etteantud stringi kui argumenti ja saadab selle protsessile. Näiteks:

send "tere maailm"

Eelneva puhul saadetakse string tere maailm. Kui expect juba suhtleb mõne programmiga siis saadetakse string sellele programmile. Hetkel saadetakse see aga standard väljundisse. Kasutades expect interpretaatorit, näeks tulemus välja selline:

send "tere maailm"
tere maailmexpect1.2>

Send käsk ei muuda string formaati ja seega peale selle esitamist liidetakse otsa expecti prompt. Selleks, et prompt prinditaks uuele reale on vaja lisada stringi lõppu reavahetuse sümbol \n.

send "tere maailm\n"
tere maailm

Kui eelnev käsk lisada faili (nt. nimega test), saab skripti käivitada UNIXi käsurealt.

expect test
tere maailm

Mõningase faili muutmisega saab aga skripti käivitada ka ilma expecti lisamata. Selleks lisa faili algusesse expecti asukoht:

#!/usr/bin/expect

ja muuda fail käivitatavaks:

chmod +x test

Nüüd saad skripti käivitada ka käsuga:

./test

Expect

Expect on vastupidine send'le. Expect ootab vastust programmilt või kasutajalt. Expect võib oodata kindlat stringi või ka osa teadaolevast stringist. Näiteks loome faili vestlus alloleva sisuga ja anname talle käivitamise õigused.

#!/usr/bin/expect
expect "tere\n"
send "tere ise ka!\n"

Käivitme skripti

./vestlus

Juhtub see, et programm ootama stringi tere ja reavahetust (\n). Kirjutades käsureale tere ja vajutades enterit väljastatakse vastuseks tere ise ka!.

expect_out(0,string)/expect_out(buffer)

Expect jääb oodatavat stringi ootama seniks kuni see sisetatakse. Kui kasutada eelnevat skripti ja kirjutada tere+enter asemel näiteks hello+enter siis expect ei väljasta midagi ja jääb endiselt ootama tere+enterit. Kui sisestada lõpuks ka oodatav string (tere+enter) siis expect vastab. Enne vastamist aga salvestab expect sobinud märgid muutujasse expect_out(0,string). Sobinud märgid + kõik sellele eelnenud märgid salvestatakse muutujasse expect_out(buffer). Eelnevat tehakse iga kord kui expect tuvastab sobinud märgid.

Muudame eelneva skripti vestlus sisu järgnevaks:

#!/usr/bin/expect
expect "tere"
send "sina sisestasid <$expect_out(buffer)>"
send "oodatud string oli <$expect_out(0,string)>"

Nurksulud ei ole iseenesest vajalikud aga teevad väljundi lugemise lihtsamaks - parem on aru saada kus algavad ja lõpevad muutujad. Kui skript käivitada ja sisetada näiteks:

hei, tere

väljastatakse tulemuseks:

sina sisestasid <hei, tere>
oodatud string oli <tere>

Koostab

Meelis Kurnikov AK21