Skip to main content

Várjon Linux / Unix parancs utasításait és példáit

Hak5 - Automate Everything, Using Expect, Hak5 1023.1 (Június 2026)

Hak5 - Automate Everything, Using Expect, Hak5 1023.1 (Június 2026)
Anonim

Az Expect egy olyan program, amely más szkriptnek megfelelő interaktív programokkal beszél. A forgatókönyv után az Expect tudja, mi várható a programtól, és mi a helyes válasz. Az értelmezett nyelv elágazó és magas szintű vezérlő struktúrákat biztosít a párbeszéd irányításához. Ezenkívül a felhasználó közvetlenül átveheti a vezérlést, és közvetlenül is léphet kapcsolatba egymással, majd visszaadhatja a parancsfájlt.

Az Expectk az Expect és a Tk keveréke. Úgy viselkedik, mint az Expect és a Tk kívánsága. A várakozás közvetlenül felhasználható a C vagy a C ++ -re is a Tcl nélkül.

Az "Expect" név az uucp, kermit és egyéb modemvezérlési programok által népszerűsített send / expect szekvenciák ötletéből származik. Ugyanakkor az uucp-tól eltérően az Expect általános, így felhasználó-szintű parancsként futtatható bármilyen program és feladat szem előtt tartásával. A várakozás egyszerre több programkal is beszélhet.

Mit várhat el?

Például itt vannak olyan dolgok, amelyeket az elvárt parancs tehet:

  • Hagyja a számítógépet, hogy tárcsázzon, így be tud jelentkezni anélkül, hogy fizetne a hívásért.
  • Indítsa el a játékot, és ha az optimális konfiguráció nem jelenik meg, akkor újra és újra indítsa újra), amíg meg nem történik, majd adja át az irányítást.
  • Az fsck futtatásával válaszoljon az "igen" vagy a "nem" válaszra, vagy válaszoljon rá, előre meghatározott kritériumok alapján.
  • Csatlakozzon egy másik hálózathoz, és automatikusan behívja az e-mailt úgy, hogy úgy tűnjön, mintha eredetileg a helyi rendszerbe lenne elküldve.
  • Tartalmazza a környezeti változókat, az aktuális könyvtárat vagy bármilyen információt az rlogin, a telnet, a tip, a su vagy a chgrp

Számos oka van annak, hogy a shell nem tudja elvégezni ezeket a feladatokat. Minden lehetséges az Expect-tal.

Az Expect általában olyan programok futtatására használható, amelyek a program és a felhasználó közötti interakciót igénylik. Minden, ami szükséges, hogy az interakció programozhatóan jellemezhető. Az elvárás a felhasználó számára is visszaadhatja a vezérlést anélkül, hogy megállítaná a programot. Hasonlóképpen a felhasználó bármikor visszaadhatja a vezérlést a szkripthez.

Használat

Várja, hogy cmdfile-t olvas a végrehajtandó parancsok listájához. A várakozás implicit módon hívható fel a #! jelölést a parancsfájl futtathatóként való megjelölésével és az első sorral a szkriptben:

#! / usr / local / bin / expect -f

Természetesen az útvonalnak pontosan meg kell határoznia, hogy hol várható az élet. / usr / local / bin csak egy példa.

A -c flag előtagolja a végrehajtandó parancsot, mielőtt a parancsfájlba kerülne. A parancsot idézni kell, hogy megakadályozza a héj megtörését. Ez az opció többször is használható. Több parancs végrehajtható egy -c-vel, ha pontosvesszővel elválasztja őket. A parancsok a sorrendben kerülnek végrehajtásra. Az Expectk használata esetén ez a beállítás -command.

A -d zászló lehetővé teszi a diagnosztikai kimeneteket, amelyek elsősorban olyan parancsok belső aktivitását jelentik, mint például a várakozás és az interakció. Ez a jelző ugyanazt a hatást érti, mint az "exp_internal 1" egy Expect szkript elején, valamint az Expect verziója.

A -D flag lehetővé teszi az interaktív hibakeresőt. Egy egész számot kell követnie. A hibakereső átveszi a vezérlést a következő Tcl eljárás előtt, ha az érték nem nulla, vagy ha a ^ C megnyomása, vagy egy töréspont megérinti, vagy más megfelelő hibakereső parancs jelenik meg a szkriptben. Az Expectk használatakor ezt a beállítást a -Debug.

A -f zászló előtagolja azt a fájlt, amelyről parancsokat olvashat. Maga a zászló nem kötelező, mivel csak a #! jelölést, hogy más argumentumokat is megadhasson a parancssorban. Az Expectk használatakor ez a beállítás -file.

Alapértelmezés szerint a parancsfájl a memóriába kerül, és teljes egészében végrehajtásra kerül. Időnként kívánatos egy sorban fájlok olvasása. Annak érdekében, hogy a tetszőleges fájlokat ilyen módon kezelje, használja a -b zászlót. Az Expectk használata esetén ez a beállítás -buffer.

Ha a "-" karakterláncot filenévként adja meg, akkor a szabványos bemenetet olvassa el. Használja a "./-" fájlt a "-" nevű fájlból.

A -i zászló elvárja, hogy interaktívan kérje a parancsokat, ahelyett, hogy egy fájlt olvasna. A kérés a kilépési parancson vagy az EOF-en keresztül ér véget. A -i flag akkor feltételezhető, ha sem parancsfájl, sem -c nem használatos. Az Expectk használatakor ez az opció interaktív.

- használható az opciók végeinek elhatárolására. Ez akkor hasznos, ha opcionális argumentumot kíván átadni a szkriptnek, anélkül, hogy az Expect értelmezi. Ez hasznos lehet a #! vonalat, hogy megakadályozza az Expect által alkalmazott lobogó szerinti értelmezést. Például az alábbiak hagyják el az eredeti argumentumokat, beleértve a script nevét a változóban argv .

#! / usr / local / bin / expect -

Ne feledje, hogy a szokásos getopt (3) és execve (2) konvenciókat figyelembe kell venni az argumentumok hozzáadásakor a #! vonal.

A $ exp_library / expect.rc fájl akkor kerül automatikusan beszerzésre, ha jelen van, hacsak nem használjuk a -N-zászlót. (Az Expectk használatakor ez az opció NORC-ként van megadva.) Azonnal ez után a ~ / .expect.rc fájl automatikusan kerül beszerzésre, kivéve, ha a -n jelzőt használjuk. Ha a DOTDIR környezeti változót definiálták, akkor ez egy könyvtárként kezelendő, és a .expect.rc olvasó innen olvasható. Az Expectk használata esetén ez a lehetőség -norc.Ez a beszerzés csak a -c jelzők végrehajtása után következik be.

-v oka Várja, hogy kinyomtassa verziószámát és kilép. A megfelelő lobogó az Expectkben, amely hosszú zászlóneveket használ, a -version.

Az opcionális argseket egy listába építjük és az argv és. Az argc az argv hosszáig inicializálódik.

Az Argv0 a szkript neve vagy bináris, ha nem használ szkriptet. Például a következő kinyomtatja a parancsfájl nevét és az első három argumentumot:

send_user "$ argv0 lrange $ argv 0 2 n"

parancsok

Várja a Tool Command Language használatát. A Tcl biztosítja a vezérlőáramlást (ha, töréshez), az expresszálás értékeléséhez és számos más olyan funkcióhoz, mint a rekurzió és az eljárás meghatározása. Az itt használt, de nem definiált parancsok (set, if, exec) a Tcl parancsok. Expect további parancsokat támogat. Hacsak másképp nincs megadva, a parancsok visszaadják az üres karakterláncot.

A parancsok betűrendben vannak felsorolva, így azok gyorsan megtalálhatók. Azonban az új felhasználók könnyebben el tudnak kezdeni azzal, hogy elolvassák az ívás, a küldés, a várakozás és az interakció leírásait ebben a sorrendben.

bezár -slave -onexec 0 | 1 -i spawn_id

bezárja a kapcsolatot az aktuális folyamattal. A legtöbb interaktív program észleli az EOF-et a stdin-on és a kilépéskor; és így Bezárás általában elegendő a folyamat megöléséhez is. A -i flag kijelenti, hogy a folyamat a megnevezett spawn_id-nek megfelelően zárul.

Mind a várakozás, mind a kölcsönhatás észleli, amikor a jelenlegi folyamat kilép, és hallgatólagosan lezárja, de ha elpusztítja a folyamatot, mondjuk "exec kill $ pid", akkor kifejezetten hívni kell.

Az -onexec zászló határozza meg, hogy a spawn azonosító minden újonnan létrehozott folyamatnál zárt állapotban van-e, vagy ha a folyamat átfedésben van. Ha egy spawn id nyitva van, akkor használja a 0 értéket. Egy nem zéró egész számérték az összes új folyamatban zárt állapotban rejti a spawnot.

A -slave zászló lezárja a szálat, amely a spawn idhez kapcsolódik. A kapcsolat bezárásakor a slave automatikusan zárva van, ha még nyitva van.

Függetlenül attól, hogy a kapcsolat implicit vagy explicit módon zárva van-e, várjon, hogy tisztítsa meg a megfelelő rendszermag-processz slot-ot. A bezárás parancs nem hívja meg a várakozást, mivel nincs garancia arra, hogy a folyamatkapcsolat bezárása miatt kilép.

debug -now 0 | 1

vezérli a Tcl hibakeresőt, amely lehetővé teszi a kimutatások végrehajtását és a töréspontok beállítását.

Az argumentumok nélkül az 1-et visszaadja, ha a hibakereső nem fut, különben 0 lesz visszaadva.

1 argumentummal a debugger elindul. 0 argumentummal a debugger leáll. Ha egy 1 argumentumot megelőz a -now flag, a debugger azonnal elindul. Ellenkező esetben a hibakereső a következő Tcl utasítással kezdődik.

A hibakereső parancs nem változtatja meg a csapdákat. Ehhez hasonlítsa össze az elvárást a -D flag paranccsal.

A szétkapcsolási parancs leválasztja a villás folyamatot a terminálról. A háttérben fut. A folyamat saját folyamatcsoportot kapott. A szabványos I / O átirányítás a / dev / nullra.

A következő töredék a leválasztást használja, hogy továbbra is futtassa a szkriptet a háttérben.

ha {fork! = 0} kilép a kapcsolatból. . .

A következő parancsfájl olvassa be a jelszavát, majd minden órában fut egy olyan programot, amely minden alkalommal fut, ha jelszót kér. A parancsfájl megadja a jelszót, így csak egyszer kell beírnia.

send_user "jelszó? " expect_user -re "(. *) n" for {} 1 {} {ha {fork! = 0} {alvás 3600; folytatás} disconnect spawn priv_prog expect Jelszó: küldés "$ expect_out 1, karakterlánc) r ". . . Kilépés}

A héj-aszinkron folyamat funkció (&) fölötti kihasználás előnye, hogy az Expect a kapcsolódás előtt mentheti a terminálparamétereket, majd később alkalmazhatja őket új ptys-re. A & és az Expect-nek nincs esélye a terminál paramétereinek olvasására, mivel a terminál már le van választva attól az időponttól kezdve, amikor az Expect az irányítást kapja.

kilépés -opts állapot

okok A kilépéshez vagy más módon való felkészüléshez várakozik.

A -onexit zászló okozza, hogy a következő argumentumot kilépési kezelőként használják. Érvek nélkül az aktuális kilépési kezelő visszakerül.

A -nem kijárat zászlót okoz elvár hogy felkészüljenek a kilépésre, de ne hagyja abba, hogy ténylegesen visszatérjen az operációs rendszer irányításához. A felhasználó által definiált kilépési kezelő fut, valamint az Expect saját belső kezelői. Nem kell elvárni a parancsok elvárását. Ez akkor hasznos, ha az Expect más Tcl kiterjesztésekkel fut. Az aktuális tolmács (és a főablak, ha a Tk környezetben) marad, így más Tcl kiterjesztések is tisztíthatók. Ha az Expect kijárat ismételten hívják (bár ez előfordulhat), a kezelők nem ismétlődnek.

A kilépéskor minden csatlakozás az elindított folyamatokhoz zárva van. A bezárást EOF-ként fogják fel az elindított folyamatok. kijárat a normál _exit (2) eljárást nem veszi figyelembe. Így továbbra is futtathatók azok az eleven folyamatok, amelyek nem ellenőrzik az EOF-et. (Különböző feltételek fontosak például annak meghatározásához, hogy milyen jeleket fogalmaznak meg az eljuttatott folyamat, de ezek rendszerfüggőek, jellemzően a kimenet (3) alatt vannak dokumentálva.) A folyamatban lévő futtatott folyamatokat az init örökölti.

állapot (vagy 0, ha nincs megadva) visszatér a kilépési státusaként elvár . kijárat implicit módon végrehajtódik, ha a parancsfájl vége elérte.

exp_continue -continue_timer

A parancs exp_continue lehetővé tesz elvár hogy folytassa a végrehajtást, nem pedig a visszatérést, ahogyan azt rendesen. Alapértelmezés szerint exp_continue visszaállítja az időtúllépési időzítőt. A -continue_timer A zászló megakadályozza, hogy az időzítő újrainduljon. (Lát elvár további információért.)

exp_internal -f fájl értéket

további parancsokat küld a belső diagnosztikai információk küldésére elvár hogy stderr ha érték nem nulla. Ez a kimenet le van tiltva, ha érték A diagnosztikai információ magában foglalja a beérkezett összes karaktert, és minden kísérletet, amely az aktuális kimenetnek a mintákhoz való illeszkedését eredményezi.

Ha az opcionális fájl a normál és a hibakereső kimenet az adott fájlra van írva (függetlenül a érték ). Bármely korábbi diagnosztikai kimeneti fájl bezáródik.

A -info A flag a exp_internal parancsot adja vissza a legfrissebb, nem info-argumentumok leírásának visszaadásához.

exp_open args -i spawn_id

visszaad egy Tcl fájl azonosítót, amely megfelel az eredeti spawn idnek. A fájlazonosítót úgy lehet használni, mintha a Tcl megnyitotta volna nyisd ki parancs. (A spawn azonosítót nem szabad többé használni várjon nem szabad végrehajtani.

A -leaveopen zászló elhagyja a spawn azonosítót, amely az Expect parancsokon keresztül érhető el. A várjon kell végrehajtani a spawn azonosítóban.

exp_pid -i spawn_id

visszaadja az aktuálisan létrehozott folyamatnak megfelelő folyamatazonosítót. Ha a -én zászlót használnak, a visszatartott pid visszatér a megadott spawn azonosítóhoz.

exp_send

egy álnév elküld .

exp_send_error

egy álnév send_error .

exp_send_log

egy álnév send_log .

exp_send_tty

egy álnév send_tty .

exp_send_user

egy álnév send_user .

exp_version -exit verzió

hasznos annak biztosítására, hogy a szkript kompatibilis legyen az Expect aktuális verziójával.

Nincs érv, a jelenlegi verziója elvár visszatért. Ezt a verziót ezután kódolhatja a szkriptben. Ha tényleg tudja, hogy nem használja a legutóbbi verziók jellemzőit, megadhat egy korábbi verziót.

A verziók három számot tartalmaznak pontokkal elválasztva. Az első a legnagyobb szám. A következő változatokhoz írt parancsfájlok: elvár egy másik nagyobb számmal szinte biztosan nem működik. exp_version hibaüzenet jelenik meg, ha a főbb számok nem egyeznek.

A második a kisebb szám. Az olyan verziókhoz írt parancsfájlok, amelyeknél kisebb a szám, mint az aktuális verzió, bizonyos új funkcióktól függhetnek és esetleg nem futnak. exp_version hibaüzenet jelenik meg, ha a főszámok egyeznek, de a szkript kisebb száma nagyobb, mint a futásé elvár .

A harmadik olyan szám, amely nem játszik szerepet a verzió összehasonlításában. Ez azonban növekszik, ha a elvár a szoftver disztribúciója bármilyen módon megváltozik, például további dokumentációval vagy optimalizálással. Minden új kisebb verzióra 0-ra áll vissza.

A … val -kijárat zászló, elvár hibát nyomtat és kilép, ha a verzió elavult.

várjon -opts pat1 body1 … -opts patn bodyn

amíg az egyik mintázat meg nem egyezik a létrehozott folyamat kimenetével, egy megadott időtartam eltelt, vagy megjelenik egy fájl vége. Ha a végleges test üres, akkor el lehet hagyni.

Minták a legfrissebbekből expect_before parancsot implicit módon használják más minták előtt. Minták a legfrissebbekből expect_after parancsot implicit módon használják más minták után.

Ha az érvek a teljes elvár utasítás egynél több vonalat igényel, az összes argumentum "beilleszthető" egybe, hogy elkerülje az egyes sorok visszalépésével történő lezárását. Ebben az esetben a szokásos Tcl helyettesítések a zárójelek ellenére jönnek létre.

Ha egy minta a kulcsszó EOF , a megfelelő test a fájl végén végződik. Ha egy minta a kulcsszó időtúllépés , a megfelelő test időtúllépés esetén végrehajtódik. Ha nincs időkorlátos kulcsszó, akkor implicit null műveletet hajt végre az időtúllépésnél. Az alapértelmezett időtúllépés időtartama 10 másodperc, de beállítható például 30, a "set timeout 30" paranccsal. Végtelen időtúllépés jelölhető a -1 értékkel. Ha egy minta a kulcsszó alapértelmezett , a megfelelő testület végrehajtása bármelyik időtúllépés vagy fájlvégződés után történik.

Ha egy minta egyezik, akkor a megfelelő test végrehajtásra kerül. elvár visszaadja a test eredményét (vagy az üres karakterláncot, ha nem illeszkedik a minta). Abban az esetben, ha többszörös minták egyeznek, az először megjelenő eszközzel kiválasztják a testet.

Minden alkalommal, amikor az új kimenet érkezik, minden egyes minta szerint összehasonlítjuk őket. Így tesztelheti a mérkőzés hiányát azáltal, hogy az utolsó minta valami garantáltan megjelenik, például egy prompt. Olyan helyzetekben, ahol nincs kérés, használnia kell időtúllépés (csakúgy, mint ha valaki kézi úton járna).

A mintákat három módon határozzák meg. Alapértelmezés szerint a minták a Tcl-ként vannak megadva karakterlánc parancs. (Az ilyen minták hasonlóak a C-shell szabályos kifejezésekhez, amelyeket általában "glob" mintáknak neveznek). A -gl zászlót lehet használni a másképpen illő minták védelmére elvár zászlókat. Minden "-" -el kezdődő mintát védeni kell. (A "-" -al kezdődő összes karakterlánc a jövőbeli opciókra van fenntartva.)

Például a következő töredék egy sikeres bejelentkezést keres. (Vegye figyelembe, hogy elvetél feltételezhető, hogy máshol a forgatókönyvben meghatározott eljárás.)

{busy {elfoglalt n; exp_continue} sikertelen megszakítás "érvénytelen jelszó" megszakítása időtúllépés megszakadt kapcsolatban}

Idézetek szükségesek a negyedik mintán, mivel tartalmaz egy olyan helyet, amely különben elválasztja a mintát a cselekvéstől.Az azonos művelettel rendelkező minták (például a 3. és a 4.) megkövetelik az akciók ismételt felsorolását. Ez elkerülhető a regexp-stílusú minták használatával (lásd alább). A globális stílusú minták kialakításáról a Tcl kézikönyvben olvashat bővebben.

A Regexp stílusú minták követik a Tcl által definiált szintaxist regexp (rövid a "szabályos kifejezés") paranccsal. A regexp mintákat bevezetik a zászlóval -újra . Az előző példa átírható egy regexp használatával:

{busy {elfoglalt n; exp_continue} -re "sikertelen | érvénytelen jelszó" abort timeout megszakítása csatlakoztatva}

Mindkét típusú mintát "letartóztatták". Ez azt jelenti, hogy a mintáknak nem kell megfelelniük a teljes karakterláncnak, de bárhova bárhol megkezdhetik és befejezhetik a mérkőzést (mindaddig, amíg minden más megegyezik). Használja a ^ -ot, hogy megegyezzen a string elején, és $ a végéhez illő. Ne felejtsd el, hogy ha nem vársz a string végére, akkor a válaszadatok könnyen eljuthatnak a karakterlánc közepére, mivel visszhangzik a létrehozott folyamatból. Miközben még mindig helyes eredményeket produkál, a kimenet természetellenesnek tűnhet. Így a $ használata biztató, ha pontosan leírhatod a karakterlánc végén lévő karaktereket.

Megjegyezzük, hogy sok szerkesztőben a ^ és a $ egyezik a sor elejével és végével. Mivel azonban a várakozások nem vonalasak, ezek a karakterek megegyeznek az elvárható pufferben jelenleg lévő adatok (szemben a sorokkal) sor elejére és végére. (Lásd még a "rendszerindex emésztésről" szóló megjegyzést.)

A -volt A zászló azt eredményezi, hogy a minta "pontos" karakterláncként illeszkedik. A *, ^, stb. Értelmezést nem végezzük (bár a szokásos Tcl egyezményeket még mindig be kell tartani). Pontos minták mindig lehorgonyoznak.

A -nocase A zászló a kimenet nagybetűs karaktereit hasonlítja össze, mintha kisbetűk lennének. A mintát nem érinti.

A kimenet olvasása során több mint 2000 bájt képes arra, hogy a korábbi bájtokat "elfelejtsék". Ez megváltoztatható a funkcióval match_max . (Ne feledje, hogy a túl nagy értékek lelassíthatják a mintázót.) Ha patlist jelentése full_buffer , akkor a megfelelő test végrehajtásra kerül, ha match_max bájt érkezett, és más minták nem illeszkedtek. Függetlenül attól, hogy az full_buffer kulcsszó használata esetén az elfelejtett karakterek a (z) wait_out (buffer) értékre vannak írva.

Ha patlist a kulcsszó nulla , és az nullák engedélyezettek (a remove_nulls parancs), akkor a megfelelő test végrehajtásra kerül, ha egyetlen ASCII 0-t illesztünk. Nem lehet 0 bájtot egy glob vagy regexp mintán keresztül egyezni.

Egy minta (vagy eof vagy full_buffer) illesztése után bármely illeszkedő és előzőleg páratlan kimenet a változóba kerül expect_out (puffer) . Legfeljebb 9 regexp szubsztring-egyezés kerül mentésre a változókban expect_out (1, karakterlánc) keresztül expect_out (9, string) . Ha a -indices zászlót használunk egy minta, a kezdő és a végződő indexek előtt (megfelelő formában lrange ) a 10 karakterláncot tárolja a változók expect_out (X, start) és expect_out (X, vége) ahol X egy számjegy, megfelel a pufferben lévő aljpozíciónak. A 0 olyan vonalakra utal, amelyek megfeleltek a teljes mintának és generálják a glob mintákat, valamint a regexp mintákat. Ha például egy folyamat abcdefgh n kimenetét eredményezte, akkor az eredmény:

várakozás "cd"

olyan, mintha a következő kijelentéseket végrehajtanák:

set expect_out (0, karakterlánc) cd set expect_out (buffer) abcd

és az "efgh n" a kimeneti pufferben marad. Ha egy folyamat az "abbbcabkkkka n" kimenetet eredményezte, az eredmény:

várakozás -indexek -re "b (b *). * (k +)"

olyan, mintha a következő kijelentéseket végrehajtanák:

set expect_out (0, start) 1 set expect_out (0, vég) 10 set expect_out (0, string) bbbcbkkkk set expect_out (1, start) 2 set expect_out (1, vég) (2, indítás) 10 set expect_out (2, vég) 10 set expect_out (2, string) k set expect_out (puffer) abbbcabkkkk

és "a n" marad a kimeneti pufferben. A "*" minta (és a ". *") A kimeneti puffert öblítené anélkül, hogy több folyamatot olvasna ki a folyamatból.

Normális esetben az illesztett kimenetet az Expect belső pufferjei elhagyták. Ez megakadályozható azáltal, hogy előhív egy mintát a -notransfer zászló. Ez a zászló különösen hasznos a kísérletezés során (és a kísérletezés során a "-not" rövidítéssel kényelmessé tehető).

A megfelelő kimenettel (vagy eof vagy full_buffer) társított spawn id szerepel expect_out (spawn_id) .

A -időtúllépés A zászló azt eredményezi, hogy az aktuális elvárható parancs a következő értéket időtúllépésként használja az időtúllépési változó értéke helyett.

Alapértelmezés szerint a mintákat a jelenlegi folyamat kimenetével egyezik meg, de a -én zászló kijelenti, hogy a megnevezett spawn_id listából származó kimenetnek megfelelnie kell a következő mintáknak (a következőhöz) -én ). A spawn_id listának vagy a spawn_ids vagy a spawn_ids ilyen listájára hivatkozó változónak kell lennie.

Például a következő példa a $ proc2 nevű spawn_id nevű "kapcsolódott" a jelenlegi folyamattól, vagy "foglalt", "sikertelen" vagy "érvénytelen jelszót" várja.

{-i $ proc2 elfoglalt} {busy} n; exp_continue} -re "sikertelen | érvénytelen jelszó" abort timeout megszakítása csatlakoztatva}

A globális változó értéke any_spawn_id használhatóak arra, hogy megfeleljenek minden olyan spawn_idnek, amelyek az összes többihez vannak társítva -én zászlók az aktuális elvár parancs. A spawn_id egy a -én zászló nincs hozzárendelve mintával (vagyis közvetlenül követ egy másikat) -én ) elérhetővé válik bármely más mintázat számára elvár parancs társítva any_spawn_id.

A -én A zászló globális változót is nevezhet, amely esetben a változó a spawn idek listájára kerül. A változó újra változik, amikor változik. Ez biztosítja az I / O forrást a parancs végrehajtása közben. Az így megadott űrlapokat "közvetett" idők nevezik.

Olyan tevékenységek, mint például szünet és Folytatni ellenőrző struktúrákat okoz (azaz, mert , proc ) a szokásos módon viselkedni. A parancs exp_continue lehetővé tesz elvár hogy folytassa a végrehajtást, nem pedig a visszatérést, ahogyan azt rendesen.

Ez hasznos kifejezett hurkok vagy ismételt elvárások elkerülésére. A következő példa része egy töredéknek a rlogin automatizálására. A exp_continue kerülje, hogy egy másodpercet írjon elvár utasítás (újra megkeresni a promptot), ha a rlogin jelszót kér.

várjon {password: {stty -echo send_user "jelszó ($ felhasználó esetén) $ host esetén:" expect_user -re "(. *) n" send_user " n" küldés "$ expect_out (1, string) r" echo exp_continue} hibás {send_user "érvénytelen jelszó vagy fiók n" kilépés} timeout {send_user "kapcsolat a $ host időzítéséhez n" exit} eof {send_user "kapcsolat a gazdagéphez nem sikerült: $ wait_out (buffer) re $ prompt}

Például az alábbi töredék segíthet a felhasználói útmutatóban a már teljesen automatizált interakciónak. Ebben az esetben a terminál nyers üzemmódba kerül. Ha a felhasználó megnyomja a "+" gombot, egy változó növekszik. Ha megnyomja a "p" billentyűt, akkor több visszajelzést küldünk a folyamatba, talán valamilyen módon megpróbáljuk megindítani, és az "i" segítségével a felhasználó léphet kapcsolatba a folyamattal, hatékonyan ellopva a parancsfájl vezérlését. Minden esetben a exp_continue lehetővé teszi az áramot elvár folytassa a mintaillesztést az aktuális művelet végrehajtása után.

stty raw -echo expect_after {-i $ user_spawn_id "p" {küldés " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "kilépés" exit}

Alapértelmezés szerint, exp_continue visszaállítja az időtúllépési időzítőt. Az időzítő nem indul újra, ha exp_continue hívják a -continue_timer zászló.

expect_after expect_args

működik azonos módon a expect_before kivéve, ha mindkettő mintázata elvár és expect_after lehet egyezik, a elvár mintát használ. Lásd a expect_before parancsot.

expect_background expect_args

ugyanazokat az érveket érinti, mint aelvár , de azonnal visszatér. A mintákat akkor teszteljük, amikor új bemenet érkezik. A mintaidőtúllépés ésalapértelmezett értelmetlenekexpect_background és csendben eldobják. Ellenkező esetben aexpect_background parancs használataexpect_before ésexpect_after mintákelvár csinál.

Amikorexpect_background akciókat értékelnek, ugyanazon spawn id feldolgozását blokkolja. A háttér feldolgozása feloldásra kerül, amikor a művelet befejeződik. Míg a háttér feldolgozása blokkolva van, lehetőség van egy (előtér)elvár azonos azonosító azonosítóval.

Nem lehet végrehajtani aelvár míg aexpect_background blokkolva van.expect_background egy adott spawn-azonosító törlése miatt egy új expect_background azonosító azonosítóval azonosítható. deklarálásaexpect_background minta nélkül eltávolítja az adott spawn idet a háttérben lévő minták illesztésének képességétől.

expect_before expect_args

ugyanazokat az érveket érinti, mint aelvár , de azonnal visszatér. Pattern-action párok a legutóbbiexpect_before ugyanazzal a spawn azonosítóval implicit módon hozzáadva a következőhözelvár parancsokat. Ha egy minta egyezik, úgy kezelik, mintha aelvár magát a parancsot és a társult testületet aelvár parancs. Ha mindkettő mintázataexpect_before éselvár lehet egyezik, aexpect_before mintát használ.

Ha nincs megadva mintázat, a spawn azonosító nincs bejelölve semmilyen mintához.

Hacsak nem a-én zászló,expect_before a minták megegyeznek az azon idõpontban definiált ív azonosítóvalexpect_before parancsot végrehajtották (nem akkor, ha a mintát egyezik).

Az -info zászló okozexpect_before hogy visszaadja a jelenlegi előírásoknak, hogy milyen mintákkal fog megfelelni. Alapértelmezés szerint az aktuális spawn-azonosítót jelenti. Opcionális spawn id specifikáció adható meg azon spawn azonosító információval kapcsolatban. Például

expect_before -info -i $ proc

Legfeljebb egy spawn id specifikáció adható. A zászló-közvetett elrejti azokat a közvetlen spawn ideket, amelyek csak közvetett adatokból származnak.

A spawn id specifikáció helyett a "-all" jelző "-info" jelzést ad az összes spawn idről.

Az info-jelző kimenete újra felhasználható az elvárásnak tekintendő argumentumnak.

expect_tty expect_args

olyan, mintelvár de karaktereket olvas a / dev / tty-ból (azaz a felhasználó billentyűleütései közül). Alapértelmezés szerint az olvasás főzött módban történik. Így a vonalaknak vissza kell állniuk a sorrendbenelvár látni őket. Ezt megváltoztathatjastty (ldstty parancs alább).

expect_user expect_args

olyan, mintelvár de karaktereket olvas a stdin-ból (azaz a felhasználó billentyűleütései). Alapértelmezés szerint az olvasás főzött módban történik. Így a vonalaknak vissza kell állniuk a sorrendbenelvár látni őket.Ezt megváltoztathatjastty (ldstty parancs alább).

Villa

új folyamatot hoz létre. Az új folyamat az aktuális pontos másolatelvár folyamat. A sikerre,Villa 0 értéket ad az új (gyermek) folyamatnak, és a gyermek folyamat folyamatazonosítóját a szülőfolyamathoz adja vissza. Hiba esetén (minden esetben a források hiánya miatt, például swap hely, memória)Villa -1-et visz vissza a szülőfolyamathoz, és nem hoz létre gyermekfolyamatot.

A forrasztott folyamatok akijárat parancsot, csakúgy, mint az eredeti folyamatot. A forrasztott folyamatok a naplófájlokba írhatók. Ha nem engedélyezi a hibakeresést vagy a naplózást a folyamatok többségében, az eredmény zavaró lehet.

Néhány pty implementációt sok olvasó és író megzavarhat, akár pillanatnyilag is. Így a legbiztonságosabbVilla ívási folyamatok előtt.

interakció string1 body1 … stringn bodyn

megadja az aktuális folyamat vezérlését a felhasználó számára, így a billentyűleütéseket az aktuális folyamathoz küldik, és az aktuális folyamat stdout és stderr értéke visszakerül.

A karakterlánc-párok paraméterek argumentumként adhatók meg, amely esetben a test végrehajtásra kerül, amikor a megfelelő karakterlánc be van adva. (Alapértelmezés szerint a szöveg nem kerül elküldésre az aktuális folyamathoz.) Atolmács a parancsot feltételezzük, ha a végleges test hiányzik.

Ha az érvek a teljesegymásra hat utasítás egynél több vonalat igényel, az összes argumentum "beilleszthető" egybe, hogy elkerülje az egyes sorok visszalépésével történő lezárását. Ebben az esetben a szokásos Tcl helyettesítések a zárójelek ellenére jönnek létre.

Például a következő parancs fut együtt a következő sztring-test párokkal: Amikor a ^ Z gombot megnyomjuk,elvár felfüggesztésre kerül. (A-Visszaállítás A ^ A gomb megnyomásakor a felhasználó látja, hogy "beírt egy vezérlést", és a folyamatot ^ A-nak küldik. A $ gomb megnyomásakor a felhasználó látja a dátumot. Amikor a ^ C gombot megnyomjuk,elvár kilép. Ha a "foo" be van írva, a felhasználó látja a "bar" -t. Amikor megnyomja a ~ gombot, aelvár a tolmács interaktív módon működik.

állítsa be a CTRLZ 032 interakciót {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "megadtad a vezérlést -A n"; "{0000}"} $ {send_user "A dátum óra formátum óra másodperc."} 003 kilépés foo {send_user "bar"} ~~}

A sztring-test párokban a karakterláncok sorrendje a sorrendben szerepel, mint argumentumok. A részlegesen illeszkedő karakterláncokat nem a jelenlegi folyamatba küldi, a fennmaradó rész előtt. Ha a karakterek be vannak írva úgy, hogy többé nem lehet egyezés, akkor csak a karakterlánc része kerül elküldésre a folyamathoz, amely nem indíthatja el újra a mérkőzést. Így a részleges mérkőzések részhalmazai később is megegyezhetnek, ha az eredeti szálak, amelyek megpróbálták összeilleszteni, végül nem sikerülnek.

Alapértelmezés szerint a karakterláncegyezés pontos, nem tartalmaz vadkártyákat. (Ezzel szemben aelvár A parancs alapértelmezés szerint glob-stílusú mintákat használ-volt zászló használható olyan minták védelmére, amelyek másképpen illenekegymásra hat zászlókat. Minden "-" -el kezdődő mintát védeni kell. (A "-" -al kezdődő összes karakterlánc a jövőbeli opciókra van fenntartva.)

A-újra zászló arra kényszeríti a karakterláncot, hogy egy regexp-stílusú mintát értelmezzen. Ebben az esetben a megfelelő aljzatok a változóban vannak tárolva interact_out hasonlóan az úthozelvár tárolja a kimenetét a változóbanexpect_out . A-indices zászló hasonlóan támogatott.

A mintaEOF bemutat egy műveletet, amely a fájl végén végződik. Egy különEOF mintázat is követheti a-output zászló, amely esetben akkor illeszkedik, ha a kimenet írásakor megjelenik egy eof. Az alapértelmezettEOF az akció "visszatér", ígyegymásra hat egyszerűen visszatér bármely EOF-en.

A mintaidőtúllépés bevezeti a timeout (másodpercben) és az akció végrehajtását, miután egyetlen adott karaktert sem olvastunk. Aidőtúllépés A minta a legutóbb meghatározott eljárásra vonatkozik. Nincs alapértelmezett időtúllépés. A "timeout" speciális változó (amelyet aelvár parancs) nem befolyásolja ezt az időtúllépést.

Például a következő nyilatkozatot használhatják azon felhasználók autológálásához, akik nem írták be semmit egy órára, de gyakran rendszeres üzeneteket kapnak:

interakció -input $ user_spawn_id timeout 3600 return -output $ spawn_id

Ha a minta a kulcsszónulla , és az nullák engedélyezettek (aremove_nulls parancs), akkor a megfelelő test végrehajtásra kerül, ha egyetlen ASCII 0-t illesztünk. Nem lehet 0 bájtot egy glob vagy regexp mintán keresztül egyezni.

Egy minta előhívása a zászlóval-írok okozza a változót interact_out (spawn_id) be kell állítani a spawn_id-nek, amely megfelelt a mintának (vagy eof).

Olyan tevékenységek, mint példáulszünet ésFolytatni ellenőrző struktúrákat okoz (azaz,mert , proc ) a szokásos módon viselkedni. azonbanVisszatérés kölcsönhatásba lép, amikor visszatér a hívóhozinter_return okozegymásra hat hogy visszatérjen a hívójába. Például, ha a "proc foo" nevűegymásra hat amely azután végrehajtotta a cselekvéstinter_return , proc foo vissza fog térni. (Ez azt jelenti, hogy haegymásra hat hívásoktolmács interaktív gépelésVisszatérés az interakció folytatódik, miközbeninter_return az interakció visszatér a hívójához.)

Alattegymásra hat , a nyers üzemmódot úgy használjuk, hogy minden karakter átadható az aktuális folyamatnak.Ha az aktuális folyamat nem veszi észre a munka vezérlő jeleket, akkor az megáll, ha megállási jelet küld (alapértelmezés szerint ^ Z). Ha újraindítja, küldjön egy folytonos jelet (például "kill -CONT"). Ha valóban egy SIGSTOP-t szeretne küldeni egy ilyen folyamathoz (^ Z), fontolja meg először a csh megteremtését, majd futtassa a programot. Másrészt, ha egy SIGSTOP-ot szeretne küldenielvár magát az első hívó tolmácsot (talán escape karakterrel), majd nyomja meg a ^ Z gombot.

A karakterlánc-párok rövidítéseként használhatók, hogy elkerüljék a tolmács bejutását és a parancsok interaktív végrehajtását. Az előző terminál üzemmódot használjuk, míg a karosszéria-pár testének végrehajtása történik.

A sebesség érdekében a műveletek alapértelmezés szerint nyers üzemmódban futnak. A-Visszaállítás zászló visszaállítja a terminált az előző üzemmódbaegymásra hat végrehajtották (mindig, főzött módban). Ne feledje, hogy az üzemmód átkapcsolásakor beadott karakterek elveszhetnek (a terminálvezérlő szerencsétlen tulajdonsága egyes rendszereknél). Az egyetlen ok használni-Visszaállítás ha a tevékenységed fõzött módban való futtatásától függ.

A-visszhang A zászló olyan karaktereket küld vissza, amelyek megfelelnek a következő mintának az egyes karakterek olvasásakor keletkező folyamathoz. Ez hasznos lehet, ha a felhasználónak részleges beillesztett mintákból kell visszajelzést kapnia.

Ha a mintát visszhangozzák, de végül nem sikerül összeegyeztetni, akkor a karaktereket a létrehozott folyamatba küldi. Ha a létrehozott folyamat visszhangozza őket, a felhasználó kétszer látja a karaktereket.-visszhang valószínűleg csak olyan helyzetekben alkalmazható, ahol a felhasználó nem valószínű, hogy nem tölti ki a mintát. Például a következő kivonat az rftp-ből, a rekurzív ftp parancsfájlból áll, ahol a felhasználónak kéri a ~ g, ~ p vagy ~ l bejegyzést a jelenlegi könyvtár rekurzív megjelenítéséhez, feladásához vagy listájához. Ezek olyan messze vannak a normál ftp parancsoktól, hogy a felhasználó valószínűleg nem írja be a ~ semmit, csak tévesen, és ebben az esetben valószínűleg csak figyelmen kívül hagyják az eredményt.

interakció {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

A-nobuffer A zászló olyan karaktereket küld, amelyek a következő mintát a karakterek olvasásakor a kimeneti folyamatba illesztik.

Ez akkor hasznos, ha vissza szeretné hagyni, hogy a program visszhangozza a mintát. Például az alábbiakat lehet használni annak figyelemmel kísérésére, hogy egy személy tárcsázza (Hayes-stílusú modemet). Minden alkalommal, amikor az "atd" látható, a parancsfájl naplózza a sor többi részét.

proc lognumber {} {interact -nobuffer -re "(. *) r" vissza hozza $ logot "clock formátum óra másodperc: tárcsázott $ interact_out (1, karakterlánc)"} interact -nobuffer "atd" lognumber

Alattegymásra hat , korábbi felhasználásalog_user figyelmen kívül hagyják. Különösen,egymásra hat a kimenetet naplózni fogja (a szabványos kimenetre küldve), mivel feltételezhető, hogy a felhasználó nem akar vakon bekapcsolódni.

A-o zászló okozza az alábbi kulcs-test párokat az aktuális folyamat kimenetére. Ez hasznos lehet például a nemkívánatos karakterek telnet-munkamenetben történő elküldésére szolgáló gazdagépekkel kapcsolatban.

Alapértelmezés szerint,egymásra hat arra számít, hogy a felhasználó stdin írása és aelvár magát a folyamatot. A-u zászló ("felhasználó" esetén)egymásra hat keresse meg a felhasználót az argumentum által megnevezett folyamatnak (melynek egy ívott azonosítónak kell lennie).

Ez két egymástól független folyamat összekapcsolását teszi lehetővé anélkül, hogy explicit hurokra lenne szükség. A hibakereséshez való hozzáférés érdekében a Várja a diagnosztika mindig a stderr (vagy a stdout bizonyos naplózási és hibakeresési információkhoz) Ugyanezen okból atolmács parancs a stdin-tól interaktív módon olvas.

Például az alábbi töredék létrehoz egy bejelentkezési folyamatot. Ezután tárcsázza a felhasználót (nem látható), és végül összekapcsolja a kettőt. Természetesen bármely folyamat helyettesítheti a bejelentkezést. Például egy héj lehetővé teszi a felhasználó számára, hogy fiók és jelszó megadása nélkül dolgozhasson.

spawn login set bejelentkezés $ spawn_id spawn tip modem # tárcsázás vissza a felhasználóhoz # connect user to login interact -u $ login

Ha több folyamathoz szeretné elküldeni a kimenetet, sorolja fel az összes olyan spawn id-listát, amelyet előtte a-output zászló. A kimeneti ív azonosítóinak egy csoportjának bemenete meghatározható az a-bemenet zászló. (Mindkét-bemenet és-output ugyanolyan formában veheti fel a listákat, mint a-én zászló aelvár parancsot, kivéve, hogy any_spawn_id nem értelmezhetőegymásra hat .) Az összes következő zászló és karakterlánc (vagy mintázat) érvényes erre a bemenetre mindaddig, amíg egy másik bemeneti jelző meg nem jelenik. Ha nem-bemenet Megjelenik,-output a "-input $ user_spawn_id -output" kifejezést jelenti. (Hasonlóképpen olyan mintákkal is, amelyeknek nincsenek-bemenet .) Ha egy-bemenet megadott, felülbírálja a $ user_spawn_idet. Ha egy másodperc-bemenet megadva, felülírja a $ spawn_id értéket. További-bemenet megjelölhetők a zászlók.

A két implikált bemeneti folyamat alapértelmezés szerint a kimeneteiket $ spawn_id és $ user_spawn_id (fordított) értékekkel határozza meg. Ha egy-bemenet zászló nem jelenik meg-output zászló, az adott folyamat karakterei elvetésre kerülnek.

A-én A zászló bevezeti az aktuális spawn_id helyettesét, ha nincs más-bemenet vagy-output zászlókat használnak. A -i zászló jelentése -o flag.

Lehetőség van arra, hogy megváltoztassuk a folyamatokat, amelyekkel kapcsolatba lépnek a közvetett spawn idek használatával. (A közvetett spawn idek leírása a váró parancs szakaszában található.) A közvetett spawn idek meghatározhatók a -i, -u, -input vagy -out flagokkal.

tolmács args

a felhasználó interaktív módon kérielvár és Tcl parancsokat. Az egyes parancsok eredményét kinyomtatják.

Olyan tevékenységek, mint példáulszünet ésFolytatni ellenőrző struktúrákat okoz (azaz,mert , proc ) a szokásos módon viselkedni. azonbanVisszatérés a tolmács visszakerül a hívójához, miközbeninter_return okoztolmács hogy visszatérjen a hívójába. Például, ha a "proc foo" nevűtolmács amely azután végrehajtotta a cselekvéstinter_return , proc foo vissza fog térni. Bármelyik parancs okozzatolmács folytatni az új parancsok kérését.

Alapértelmezés szerint a parancs két egész számot tartalmaz. Az első egész szám az értékelési verem mélységét írja le (azaz, hogy hányszor hívták a Tcl_Eval-ot). A második egész szám a Tcl történelem azonosítója. A prompt beállítható egy "prompt1" nevű eljárással, amelynek visszatérési értéke a következő prompt lesz. Ha egy nyilatkozat nyitott idézőjelekkel, parensekkel, zárójelekkel vagy zárójelekkel rendelkezik, másodlagos prompt (alapértelmezés szerint "+>") új sorral kerül kiállításra. A másodlagos promptot a "prompt2" nevű eljárás meghatározásával lehet beállítani.

Alatttolmács , főzött módot használnak, még akkor is, ha a hívó nyers üzemmódot használt.

Ha a stdin zárva van,tolmács vissza fog térni, hacsak nem-eof zászlót használnak, amely esetben az ezt követő érvet hívják.

log_file args -a fájl

Ha fájlnév van megadva,log fájl rögzíti az aktuális munkamenet átiratait (ekkor kezdődik) a fájlban.log fájl leállítja a felvételt, ha nincs érv. Minden korábbi naplófájl le van zárva.

A fájlnév helyett egy Tcl fájl azonosító adható meg a-nyisd ki vagy-leaveopen zászlókat. Ez hasonló aívik parancs. (Látívik további információért.)

A-a zászló erőket a naplózandó kimenetre, amelyet alog_user parancs.

Alapértelmezés szerint alog fájl parancs fűz a régi fájlok helyett a csonkítás, a kényelem, hogy képes legyen kapcsolni a naplózás és többször is egy munkamenetben. A fájlok csonkolásához használja a-noappend zászló.

A-info A flag a log_file-t visszaadja a legfrissebb, nem info-argumentumok leírásának.

log_user -info | 0 | 1

Alapértelmezés szerint a küldés / várakozás párbeszéd naplózásra kerül az stdout-ba (és nyitott naplófájl esetén). A stdout naplózását a "log_user 0" parancs letiltja, és a "log_user 1" újra engedélyezi. A naplófájlba való bejelentkezés nem változik.

A-info A zászló a log_user-t visszaküldi a legfrissebb nem-info-argumentumok leírásának.

match_max -d -i spawn_id méret

meghatározza a puffer (bájtban) által használt belső méretételvár . Nemmel méret érv, az aktuális méret visszakerül.

A … val-d zászló, az alapértelmezett méret van beállítva. (A kezdeti alapértelmezés 2000.) A-én zóna, a méret a megadott spawn id számára van beállítva, egyébként a jelenlegi folyamat számára van beállítva.

overlay - # spawn_id - # spawn_id … program args

végrehajt "program args "helyett a jelenlegielvár program, amely véget ér. A csupasz kötőjel argumentum a parancsnév előtti kötőjelet kényszerít, mintha bejelentkezési héj lenne. Minden spawn_ids zárva van, kivéve az argumentumként megadottakat. Ezek a fájlok azonosítására kerülnek.

A Spawn_ids leképezve az új program örökléséhez szükséges file-azonosítót. Például az alábbi sorban sakk fut, és lehetővé teszi, hogy az aktuális folyamat vezérelje - mondjuk egy sakk master.

átfedés -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id sakk

Ez hatékonyabb, mint a "interaktív -u", azonban feláldozza a programozott interakció képességét aelvár a folyamat már nem ellenőrzött.

Ne feledje, hogy nincs vezérlő terminál.