Skip to main content

Förvänta Linux / Unix Command Instruktioner och exempel

SSH Using Expect Automation Scripting In Linux By Passing Password From Script (April 2025)

SSH Using Expect Automation Scripting In Linux By Passing Password From Script (April 2025)
Anonim

Förvänta är ett program som pratar med andra interaktiva program enligt ett manus. Efter att skriptet har väntat, vet vad som kan förväntas av ett program och vad det korrekta svaret ska vara. Ett tolkat språk ger förgreningar och kontrollnivåer på hög nivå för att styra dialogrutan. Dessutom kan användaren ta kontroll och interagera direkt när det är önskvärt, efteråt återvänder kontrollen till manuset.

Expectk är en blandning av Expect och Tk. Det beter sig precis som Expect och Tks önskan. Förväntas kan också användas direkt i C eller C ++ utan Tcl.

Namnet "Expect" kommer från tanken att skicka / förvänta sekvenser som populariseras av uucp, kermit och andra modemkontrollprogram. Men till skillnad från uucp är Expect generaliserad så att den kan köras som ett användarnivåkommando med något program och uppgift i åtanke. Förvänta kan prata med flera program samtidigt.

Vad förväntas kan göra

Till exempel, här är några saker som man förväntar sig att kommandot kan göra:

  • För att datorn ska ringa tillbaka dig, så att du kan logga in utan att betala för samtalet.
  • Starta ett spel och om den optimala konfigurationen inte visas startar du om den igen och igen) tills den gör det och överlämnar sedan kontrollen till dig.
  • Kör fsck, och svara på sina frågor, svara "ja" eller "nej" eller ge kontrollen tillbaka till dig baserat på förutbestämda kriterier.
  • Anslut till ett annat nätverk och hämta ditt mail automatiskt så att det visas som om det ursprungligen skickades till ditt lokala system.
  • Bära miljövariabler, aktuell katalog eller någon form av information över rlogin, telnet, tips, su eller chgrp

Det finns många olika anledningar till att skalet inte kan utföra dessa uppgifter. Alla är möjliga med förväntan.

Generellt är Expect användbart för att köra ett program som kräver interaktion mellan programmet och användaren. Allt som är nödvändigt är att interaktionen kan karakteriseras programmatiskt. Förväntan kan också ge tillbaka kontrollen till användaren utan att stoppa programmet som styrs. På samma sätt kan användaren när som helst ge tillbaka kontrollen till manuset.

Användande

Förvänta läser cmdfile för en lista med kommandon som ska utföras. Förväntas kan imponeras på system som stöder #! notering genom att markera manuset som körbart och göra första raden i manuset:

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

Självfallet måste vägen noggrant beskriva var man förväntar sig liv. / usr / local / bin är bara ett exempel.

-C-flaggan prefaces ett kommando som ska exekveras före någon i skriptet. Kommandot bör citeras för att förhindra att det bryts upp av skalet. Det här alternativet kan användas flera gånger. Flera kommandon kan utföras med en enkel -c genom att separera dem med semikolon. Kommandon exekveras i den ordning de visas. När du använder Expectk, anges det här alternativet som -kommando.

-D-flaggan möjliggör viss diagnostisk utgång, som främst rapporterar intern aktivitet av kommandon som förvänta och interagera. Den här flaggan har samma effekt som "exp_internal 1" i början av ett Expect-skript, plus versionen av Expect skrivs ut.

-D-flaggan möjliggör en interaktiv debugger. Ett heltal bör följas. Felsökaren tar kontroll innan nästa Tcl-procedur om värdet är icke-noll eller om en ^ C trycks eller en brytpunkt träffas eller ett annat lämpligt debugger-kommando visas i skriptet. När du använder Expectk, anges det här alternativet som -Felsöka.

-F-flaggan prefaces en fil för att läsa kommandon. Själva flaggan är valfri eftersom den endast är användbar när du använder #! notation, så att andra argument kan tillhandahållas på kommandoraden. När du använder Expectk, anges det här alternativet som -fil.

Som standard läses kommandofilen i minnet och exekveras i sin helhet. Det är ibland önskvärt att läsa filer en rad i taget. För att tvinga godtyckliga filer att hanteras på detta sätt, använd -b-flaggan. När du använder Expectk, anges detta alternativ som -buffert.

Om strängen "-" levereras som ett filnamn, läses standardinmatningen istället. Använd "./-" för att läsa från en fil som faktiskt heter "-".

-I-flaggan orsakar förväntas interaktivt be om kommandon istället för att läsa dem från en fil. Prompten avslutas via exitkommandot eller på EOF. -I-flaggan antas om varken en kommandofil eller -c används. När du använder Expectk, anges det här alternativet som -interaktivt.

- kan användas för att avgränsa alternativets slut. Detta är användbart om du vill skicka ett alternativ-liknande argument till ditt skript utan att det tolkas av Expect. Detta kan med fördel placeras i #! linje för att förhindra eventuell flagglig tolkning. Till exempel kommer följande att lämna de ursprungliga argumenten inklusive skriptnamnet i variabeln argv .

#! / usr / local / bin / expect -

Observera att de vanliga getopt (3) och execve (2) konventionerna måste observeras när argument läggs till #! linje.

Filen $ exp_library / expect.rc kommer automatiskt ifrån, om inte-flaggan används. (När du använder Expectk, anges det här alternativet som -NORC.) Omedelbart efter det hämtas filen ~ / .expect.rc automatiskt, om inte-en flagg används. Om miljövariabeln DOTDIR definieras, behandlas den som en katalog och .expect.rc läses därifrån. När du använder Expectk, anges det här alternativet som -norc.Denna inköp sker först efter att ha exekverat -c flaggor.

-v orsakar förväntan att skriva ut versionsnumret och avsluta. Den motsvarande flaggan i Expectk, som använder långflagsnamn, är -version.

Valfria args är konstruerade i en lista och lagras i variabeln heter argv och. argc initieras till längden av argv.

Argv0 definieras som namnet på skriptet eller binärt om inget script används. Till exempel skriver ut följande skriptets namn och de tre första argumenten:

send_user "$ argv0 lrange $ argv 0 2 n"

kommandon

Förvänta använder verktyget Kommandospråk. Tcl tillhandahåller kontrollflöde (om, för, brytning), expressionsevaluering och flera andra funktioner, såsom rekursion och procedurdefinition. Kommandon som används här men inte definierade (set, om, exec) är Tcl-kommandon. Förvänta stöder ytterligare kommandon. Om inte annat anges, returnerar kommandon den tomma strängen.

Kommandon är listade alfabetiskt så att de snabbt kan placeras. Nya användare kan dock lättare börja med att läsa beskrivningarna av gy, skicka, förvänta och interagera i den ordningen.

stäng -slave -onexec 0 | 1 -i spawn_id

stänger anslutningen till den aktuella processen. De flesta interaktiva program kommer att upptäcka EOF på deras stdin och avsluta; Således stänga brukar räcka för att döda processen också. -I-flaggan förklarar processen att stänga motsvarande den angivna spawn_id.

Både förväntar och interagerar kommer att upptäcka när den nuvarande processen utgår och implicit slutar, men om du dödar processen genom att säga "exec kill $ pid" måste du uttryckligen ringa nära.

-Onexec-flaggan bestämmer om spridnings-id är stängd i några nya spridda processer eller om processen är överlagrad. För att lämna ett språng id öppet, använd värdet 0. Ett icke-noll heltal värde tvingar språket stängt i nya processer.

Slave-flaggan stänger slaven som är associerad med koden. När anslutningen är stängd stängs slaven automatiskt även om den fortfarande är öppen.

Oavsett om anslutningen är stängd implicit eller explicit, bör du ringa vänta för att rensa upp motsvarande kärnprocessfack. Det nära kommandot samtalar inte vänta eftersom det inte finns någon garanti för att stängning av en processanslutning kommer att leda till att den avslutas.

felsöka -now 0 | 1

styr en Tcl-debugger så att du kan gå igenom uttalanden och ställa in brytpunkter.

Med inga argument returneras en 1 om debugger inte körs, annars returneras 0.

Med ett 1 argument startas debuggeren. Med ett 0-argument stoppas debuggen. Om ett 1-argument föregås av -now-flaggan, startas debuggeren omedelbart. Annars startar debuggeren med nästa Tcl-uppsats.

Felsökningskommandot ändrar inga fällor. Jämför detta till att börja Expect med -D-flaggan.

Frånkopplingskommandot kopplar bort en gaffelprocess från terminalen. Det fortsätter att springa i bakgrunden. Processen ges sin egen processgrupp. Standard I / O omdirigeras till / dev / null.

Följande fragment brukar koppla från för att fortsätta att köra skriptet i bakgrunden.

om {gaffel! = 0} avsluta koppla ifrån. . .

Följande skript läser ett lösenord och kör sedan ett program varje timme som kräver ett lösenord varje gång det körs. Skriptet tillhandahåller lösenordet så att du bara måste skriva det en gång.

send_user "password? " expect_user -re "(. *) n" för {} 1 {} {if {fork! = 0} {sleep 3600; fortsätt} koppla bort spawn priv_prog förvänta Lösenord: skicka "$ expect_out 1, sträng) r ". . . utgång }

En fördel med att använda koppling över asynkron processfunktion (&) är att Expect kan spara terminalparametrarna innan de kopplas bort och sedan applicera dem senare på nya ptys. Med &, Expect har ingen chans att läsa terminalens parametrar eftersom terminalen redan är frånkopplad vid den tidpunkt som förväntas tar emot kontroll.

avsluta -opts status

orsakar förväntan att gå ut eller på annat sätt förbereda sig för att göra det.

De -onexit flaggan gör att nästa argument används som en utgångshanterare. Utan ett argument returneras den aktuella exithanteraren.

De -ingen utgång flaggan orsaker Förvänta att förbereda sig för att avsluta men sluta korta från att faktiskt returnera kontrollen till operativsystemet. Den användardefinierade avslutningsbehandlaren körs såväl som Expects egna internhanterare. Inga ytterligare Förväntat kommandon ska utföras. Det här är användbart om du kör Expect med andra Tcl-tillägg. Nuvarande tolk (och huvudfönstret om i Tk-miljön) förblir så att andra Tcl-tillägg kan städa upp. Om Expect s utgång kallas igen (men det kan hända), hanteras hanterarna inte.

Vid avslutande stängs alla anslutningar till spridda processer. Stängning kommer att detekteras som en EOF genom spridda processer. utgång tar inga andra åtgärder utöver vad det normala _exit (2) förfarandet gör. Således kan spridna processer som inte kontrollerar EOF fortsätta att springa. (En mängd olika förhållanden är viktiga för att bestämma vilka signaler en spridd process kommer att skickas till, men de är systemberoende, vanligtvis dokumenterade under utträde (3).) Sprukade processer som fortsätter att springas kommer att ärva av init.

status (eller 0 om det inte anges) returneras som utgångsstatus för Förvänta . utgång Utföres implicit om slutet av manuset nås.

exp_continue -continue_timer

Kommandot exp_continue tillåter förvänta själv att fortsätta att utföra snarare än att återvända som det normalt skulle. Som standard exp_continue återställer timeout-timer. De -continue_timer flaggan förhindrar att timer startas om. (Se förvänta för mer information.)

exp_internal -f file värde

orsakar ytterligare kommandon att skicka diagnostisk information internt till Förvänta att stderr om värde är icke-noll. Denna utmatning är inaktiverad om värde är 0. Diagnosinformationen innehåller varje mottagen tecken och varje försök att matcha den aktuella utgången mot mönstren.

Om det valfria fil levereras, all normal och debugging-utskrift skrivs till den filen (oavsett värdet av värde ). Alla tidigare diagnostiska utdatafiler är stängda.

De -info flaggan orsakar exp_internal att returnera en beskrivning av de senaste icke-info-argumenten som ges.

exp_open args -i spawn_id

returnerar en Tcl-filidentifierare som motsvarar det ursprungliga spridnings-id. Filidentifieraren kan sedan användas som om den öppnades av Tcls öppna kommando. (Spam-id ska inte längre användas vänta ska inte utföras.

De -Lämna öppen flaggan lämnar spridnings id öppet för åtkomst genom Expect-kommandon. en vänta måste exekveras på spawn id.

exp_pid -i spawn_id

returnerar processidentifikationen som motsvarar den för närvarande gjorda processen. Om -jag flagg används, återgiven pid motsvarar den för det angivna koden id.

exp_send

är ett alias för skicka .

exp_send_error

är ett alias för send_error .

exp_send_log

är ett alias för send_log .

exp_send_tty

är ett alias för send_tty .

exp_send_user

är ett alias för send_user .

exp_version -exit version

är användbart för att säkerställa att manuset är kompatibelt med den nuvarande versionen av Expect.

Inga argument, den nuvarande versionen av Förvänta returneras. Den här versionen kan då kodas i ditt skript. Om du faktiskt vet att du inte använder funktioner i de senaste versionerna, kan du ange en tidigare version.

Versioner består av tre siffror åtskilda av prickar. Först är huvudtalet. Skript skrivna för versioner av Förvänta med ett annat stort antal kommer nästan säkert inte att fungera. exp_version returnerar ett fel om huvudnumren inte matchar.

För det andra är det mindre talet. Skript som är skrivna för en version med ett större mindre nummer än den nuvarande versionen kan bero på någon ny funktion och kanske inte körs. exp_version returnerar ett fel om de stora siffrorna matchar, men skriptet mindre tal är större än det som körs Förvänta .

Tredje är ett nummer som inte spelar någon roll i versionsjämförelsen. Det ökar dock när Förvänta Programdistributionen ändras på något sätt, till exempel genom ytterligare dokumentation eller optimering. Den återställs till 0 på varje ny mindre version.

Med -utgång flagga, Förvänta skriver ut ett fel och avslutar om versionen är föråldrad.

förvänta -opts pat1 body1 … -ops patn bodyn

väntar tills ett av mönstren matchar utmatningen av en spridd process, en viss tidsperiod har gått, eller en slut-av-fil ses. Om den slutliga kroppen är tom kan den utelämnas.

Mönster från de senaste expect_before Kommando används implicit före alla andra mönster. Mönster från de senaste expect_after Kommando används implicit efter några andra mönster.

Om argumenten till hela förvänta uttalandet kräver mer än en rad, kan alla argument "spännas" i ett för att undvika att avsluta varje linje med en backslash. I det här fallet kommer de vanliga Tcl-substitutionerna att inträffa trots hängslen.

Om ett mönster är sökordet eof , motsvarande kropp exekveras vid slutet av filen. Om ett mönster är sökordet Paus , motsvarande kropp utförs vid timeout. Om det inte används ett tidsbegränsat sökord, utförs en implicit null-åtgärd vid timeout. Standard timeout-perioden är 10 sekunder men kan ställas in, till exempel till 30, med kommandot "set timeout 30". En oändlig timeout kan betecknas med värdet -1. Om ett mönster är sökordet standard , motsvarande kropp exekveras vid antingen timeout eller end-of-file.

Om ett mönster matchar, exekveras motsvarande kropp. förvänta returnerar resultatet av kroppen (eller den tomma strängen om inget mönster matchade). I händelse av att flera mönster matchar används den som visas först för att välja en kropp.

Varje gång ny produktion anländer, jämförs den med varje mönster i den ordning de anges. Således kan du testa om det saknas en match genom att göra det sista mönstret någonting garanterat att visas, till exempel en prompten. I situationer där det inte finns någon prompt måste du använda Paus (precis som om du skulle interagera manuellt).

Mönster specificeras på tre sätt. Som standard anges mönster som med Tcls sträng matchning kommando. (Sådana mönster liknar också C-shell regelbundna uttryck som vanligtvis kallas "glob" mönster). De -gl flagga kan användas för att skydda mönster som annars skulle matcha förvänta flaggor från att göra det. Varje mönster som börjar med en "-" ska skyddas så här. (Alla strängar som börjar med "-" är reserverade för framtida alternativ.)

Till exempel ser följande fragment ut efter en framgångsrik inloggning. (Anteckna det avbryta antas vara ett förfarande definierat någon annanstans i manuset.)

förvänta dig {upptagen {sätter upp upptagen n; exp_continue} misslyckades avbryta "ogiltigt lösenord" avbryta timeout avbryta ansluten}

Citat är nödvändigt på det fjärde mönstret eftersom det innehåller ett utrymme som annars skulle skilja mönstret från åtgärden.Mönster med samma åtgärd (som 3: a och 4: e) kräver att åtgärderna listas igen. Detta kan undvikas genom att använda regexp-stilmönster (se nedan). Mer information om utformning av glob-stilmönster finns i Tcl-manualen.

Regexp-stilmönster följer den syntax som definieras av Tcls regexp (kort för "reguljärt uttryck") kommando. regexp-mönster introduceras med flaggan -re . Föregående exempel kan skrivas om med en regexp som:

förvänta dig {upptagen {sätter upp upptagen n; exp_continue} -re "misslyckades | ogiltigt lösenord" avbryta timeout avbryta ansluten}

Båda typerna av mönster är "unanchored". Det betyder att mönster inte behöver matcha hela strängen, men kan börja och avsluta matchen var som helst i strängen (så länge allting matchar). Använd ^ för att matcha början på en sträng och $ för att matcha slutet. Observera att om du inte väntar på slutet av en sträng, kan dina svar enkelt sluta i mitten av strängen, eftersom de echoes från den spridda processen. Medan du fortfarande producerar korrekta resultat kan utmatningen se onaturlig ut. Således uppmuntras användning av $ om du kan exakt beskriva tecknen i slutet av en sträng.

Observera att i många redaktörer matchar ^ och $ respektive början respektive slutet av raderna. Men eftersom förväntan inte är linjeinriktad matchar dessa tecken början och slutet på data (i motsats till linjer) för närvarande i den förväntade matchningsbufferten. (Se även anmärkningen nedan om "systemmatsmältningsbesvär".)

De -ex flaggan får mönstret att matchas som en "exakt" sträng. Ingen tolkning av *, ^, etc görs (även om de vanliga Tcl-konventionerna fortfarande måste observeras). Exakta mönster är alltid unanchored.

De -nocase flaggan orsakar stora bokstäver i utmatningen för att jämföra som om de var små bokstäver. Mönstret påverkas inte.

Under läsning kan mer än 2000 byte tvinga tidigare byte att vara "glömda". Detta kan ändras med funktionen match_max . (Observera att alltför stora värden kan sakta ner mönsterkamraten.) Om patlist är full_buffer , motsvarande kropp exekveras om match_max byte har mottagits och inga andra mönster har matchats. Huruvida eller inte full_buffer sökord används, de bortglömda tecknen skrivs till expect_out (buffert).

Om patlist är nyckelordet null , och nuller är tillåtna (via remove_nulls kommando), exekveras den motsvarande kroppen om en enda ASCII 0 matchas. Det är inte möjligt att matcha 0 byte via glob eller regexp-mönster.

När du matchar ett mönster (eller eof eller full_buffer) sparas alla matchande och tidigare oöverträffade utdata i variabeln expect_out (buffert) . Upp till 9 regexp substring matchningar sparas i variablerna expect_out (1, sträng) genom expect_out (9, sträng) . Om -indices flagga används före ett mönster, start- och slutindex (i en form som är lämplig för lrange ) av de 10 strängarna lagras i variablerna expect_out (X, start) och expect_out (X, slut) där X är en siffra, motsvarar substringspositionen i bufferten. 0 hänvisar till strängar som matchade hela mönstret och genereras för globmönster såväl som regexp-mönster. Om exempelvis en process har producerat produktionen av "abcdefgh n", är resultatet av:

förvänta dig "cd"

är som om följande påståenden hade utförts:

ställa expect_out (0, sträng) cd-set expect_out (buffert) abcd

och "efgh n" finns kvar i utmatningsbufferten. Om en process producerade utgången "abbbcabkkkka n", resultatet av:

förvänta -indikatorer -re "b (b *). * (k +)"

är som om följande påståenden hade utförts:

set expect_out (0, start) 1 set expect_out (0, slut) 10 set expect_out (0, sträng) bbbcabkkkk set expect_out (1, start) 2 set expect_out (1, slut) 3 set expect_out (1, sträng) bb set expect_out (2, start) 10 set expect_out (2, end) 10 set expect_out (2, sträng) k set expect_out (buffert) abbbcabkkkk

och "a n" finns kvar i utmatningsbufferten. Mönstret "*" (och -re ". *") Spola utmatningsbufferten utan att läsa mer utmatning från processen.

Normalt kasseras den matchade utsignalen från Expects interna buffertar. Detta kan förhindras genom att prefixa ett mönster med -notransfer flagga. Denna flagga är speciellt användbar vid experimentering (och kan förkortas till "-not" för enkelhets skull medan du experimenterar).

Spam-id som är kopplat till matchningsutgången (eller eof eller full_buffer) lagras i expect_out (spawn_id) .

De -Paus flaggan får det nuvarande förvänta kommandot att använda följande värde som en timeout istället för att använda värdet för timeout-variabeln.

Som standard matchas mönster mot utmatning från den aktuella processen, dock -jag flaggan förklarar utmatningen från den angivna spawn_id-listan matchas mot några följande mönster (upp till nästa -jag ). Listan spawn_id ska antingen vara en separerad lista över spawnids eller en variabel som hänvisar till en sådan lista över spawnids.

Till exempel väntar följande exempel på "ansluten" från den aktuella processen eller "upptagen", "misslyckad" eller "ogiltigt lösenord" från spawn_id som heter $ proc2.

förvänta dig {-i $ proc2 upptagen {sätter upp upptagen n; exp_continue} -re "misslyckades | ogiltigt lösenord" avbryta timeout avbryta ansluten}

Värdet på den globala variabeln any_spawn_id kan användas för att matcha mönster till alla spawnids som heter med alla andra -jag flaggor i strömmen förvänta kommando. Den spawn_id från a -jag flagga utan associerat mönster (d.v.s. följt omedelbart av en annan -jag ) görs tillgänglig för andra mönster i samma förvänta kommando i samband med any_spawn_id.

De -jag flaggan kan också namnge en global variabel, i vilket fall variabeln läses för en lista över språngsidor. Variabeln läser om när den ändras. Detta ger ett sätt att ändra I / O-källan medan kommandot körs. Spridda ids förutsatt att detta sätt kallas "indirekt" spawn ids.

Åtgärder som ha sönder och Fortsätta orsaka kontrollstrukturer (dvs för , proc ) att uppträda på vanligt sätt. Kommandot exp_continue tillåter förvänta själv att fortsätta att utföra snarare än att återvända som det normalt skulle.

Detta är användbart för att undvika uttryckliga loopar eller upprepade förväntningar. Följande exempel är en del av ett fragment för att automatisera rlogin. De exp_continue undviker att skriva en sekund förvänta uttalande (för att leta efter prompten igen) om rlogin ber om ett lösenord.

Förvänta {Lösenord: {stty -echo send_user "lösenord (för $ användare) på $ värd:" expect_user -re "(. *) n" send_user " n" skicka "$ expect_out (1 string) echo exp_continue} inkorrekt {send_user "anslutning till värd misslyckades: $ expect_out (buffert)" exit "- avsluta} re $ prompt}

Till exempel kan följande fragment hjälpa en användarhandledning en interaktion som redan är helt automatiserad. I detta fall läggs terminalen i råläget. Om användaren trycker på "+" ökas en variabel. Om du trycker på "p" skickas flera avkastningar till processen, kanske för att peka den på något sätt, och "jag" låter användaren interagera med processen, och stavar effektivt kontrollen från skriptet. I varje fall är exp_continue tillåter strömmen förvänta för att fortsätta mönster matchning efter att ha genomfört den aktuella åtgärden.

stty raw -echo expect_after {-i $ user_spawn_id "p" {send " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "avsluta" exit}

Som standard exp_continue återställer timeout-timer. Timern startas inte om, om exp_continue kallas med -continue_timer flagga.

expect_after expect_args

fungerar identiskt med expect_before förutom att om mönster från båda förvänta och expect_after kan matcha, förvänta mönster används. Se expect_before kommando för mer information.

expect_background expect_args

tar samma argument somförvänta , men det återkommer omedelbart. Mönster testas när ny ingång kommer. MönstretPaus ochstandard är meningslöst attexpect_background och tyst kasseras. Annars är detexpect_background kommandot använderexpect_before ochexpect_after mönster precis somförvänta gör.

Närexpect_background åtgärder utvärderas, bakgrundsbearbetning för samma språng-id blockeras. Bakgrundsbehandlingen är blockerad när åtgärden är klar. Medan bakgrundsbehandling är blockerad är det möjligt att göra en (förgrunds)förvänta på samma spawn-id.

Det är inte möjligt att utföra enförvänta medan enexpect_background är blockerad.expect_background för ett visst spawn-id raderas genom att deklarera en ny expect_background med samma spawn-id. deklareraexpect_background utan mönster avlägsnas det angivna språng-idet från förmågan att matcha mönster i bakgrunden.

expect_before expect_args

tar samma argument somförvänta , men det återkommer omedelbart. Mönster-actionpar från de senasteexpect_before med samma spawn-id är implicit tillagt någon av följandeförvänta kommandon. Om ett mönster matchar behandlas det som om det hade angivits iförvänta kommandot själv och den associerade kroppen exekveras i sammanhanget medförvänta kommando. Om mönster från bådaexpect_before ochförvänta kan matcha,expect_before mönster används.

Om inget mönster är angivet, kontrolleras inte id-idet för några mönster.

Om inte överrätts av a-jag flagga,expect_before mönster matchar spridnings-id definierade vid den tidpunkt dåexpect_before kommandot utfördes (inte när dess mönster matchas).

Info-flaggan orsakarexpect_before att återge nuvarande specifikationer för vilka mönster det kommer att matcha. Som standard rapporterar den om det aktuella spawn-id. En valfri id-id-specifikation kan anges för information om det här idrottsnamnet. Till exempel

expect_before -info -i $ proc

Högst kan en spridnings id specificeras. Flaggan -indirekt dämpar direkta gnagare som bara kommer från indirekta specifikationer.

I stället för en id-id-specifikation, kommer flaggan "-all" att orsaka "-info" för att rapportera om alla språdsidor.

Utdatan av -infotflaggan kan återanvändas som argumentet att förutse.

expect_tty expect_args

är somförvänta men det läser tecken från / dev / tty (dvs tangenttryckningar från användaren). Som standard utförs läsning i kokat läge. Sålunda måste linjerna sluta med en retur i ordning förförvänta att se dem. Detta kan ändras viastty (sestty kommando nedan).

expect_user expect_args

är somförvänta men det läser tecken från stdin (dvs tangenttryckningar från användaren). Som standard utförs läsning i kokat läge. Sålunda måste linjerna sluta med en retur i ordning förförvänta att se dem.Detta kan ändras viastty (sestty kommando nedan).

gaffel

skapar en ny process. Den nya processen är en exakt kopia av strömmenFörvänta bearbeta. På framgång,gaffel returnerar 0 till den nya processen (barn) och returnerar processprocessen för barnprocessen till moderprocessen. Vid misslyckande (alltid beroende på brist på resurser, t.ex. byteutrymme, minne)gaffel returnerar -1 till moderprocessen och ingen barnprocess skapas.

Forked processer utgång viautgång kommando, precis som den ursprungliga processen. Gaffelprocesser får skriva till loggfilerna. Om du inte inaktiverar felsökning eller loggar i de flesta processerna kan resultatet bli förvirrande.

Vissa pty implementeringar kan vara förvirrade av flera läsare och författare, även tillfälligt. Således är det säkrast attgaffel före gytningsprocesser.

interagera string1 body1 … stringn bodyn

ger kontroll över den aktuella processen till användaren, så att tangenttryckningar skickas till den aktuella processen och stdout och stderr av den aktuella processen returneras.

String-kroppspar kan specificeras som argument, i vilket fall kroppen exekveras när motsvarande sträng matas in. (Som standard skickas strängen inte till den aktuella processen.)tolk kommando antas, om den slutliga kroppen saknas.

Om argumenten till helapåverka varandra uttalandet kräver mer än en rad, kan alla argument "spännas" i ett för att undvika att avsluta varje linje med en backslash. I det här fallet kommer de vanliga Tcl-substitutionerna att inträffa trots hängslen.

Till exempel interagerar följande kommandoreder med följande strängkroppspar definierade: När ^ Z trycks,Förvänta är suspenderad. (De-återställa flaggan återställer terminallägena.) När ^ A trycks, ser användaren "du skrev ett kontroll-A" och processen skickas a ^ A. När $ trycks, ser användaren datumet. När ^ C trycks in,Förvänta utgångar. Om "foo" anges anger användaren "bar". När ~ ~ trycks,Förvänta tolk går interaktivt.

Ange CTRLZ 032 interagera {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "du skrev ett kontroll-A n"; skicka " 001"} $ {send_user "Datumet är klockformat klock sekunder."} 003 avsluta foo {send_user "bar"} ~~}

I strängkroppspar matchas strängar i den ordning de listas som argument. Strängar som delvis matchar skickas inte till den aktuella processen i väntan på att resten kommer. Om tecken skrivs in så att det inte längre kan vara en match, skickas endast delen av strängen till processen som inte kan starta en annan match. Således kan strängar som är delsträngar av partiella matcher matcha senare om de ursprungliga strängarna som försökte vara matchar i slutändan misslyckas.

Som standard är strängmatchning exakt utan vilda kort. (I motsats till detförvänta kommando använder standardmönster som standard.)-ex flagga kan användas för att skydda mönster som annars skulle kunna matchapåverka varandra flaggor från att göra det. Varje mönster som börjar med en "-" ska skyddas så här. (Alla strängar som börjar med "-" är reserverade för framtida alternativ.)

De-re flaggan tvingar strängen att tolkas som ett regexp-stilmönster. I detta fall lagras matchande understrängar i variabeln interact_out på samma sätt som vägenförvänta lagrar sin produktion i variabelnexpect_out . De-indices flaggan stöds på liknande sätt.

Mönstreteof introducerar en åtgärd som körs i slutet av filen. En separateof mönstret kan också följa-produktion flagga i vilket fall det matchas om ett eof detekteras vid skrivutmatning. Standardeneof Åtgärd är "retur", så attpåverka varandra återkommer helt enkelt på något EOF.

MönstretPaus introducerar en timeout (i sekunder) och åtgärd som körs efter att inga tecken har lästs för en viss tid. DePaus mönster gäller för den senast angivna processen. Det finns ingen standard timeout. Den speciella varianten "timeout" (används avförvänta kommando) har ingen inverkan på denna timeout.

Till exempel kan följande uttalande användas för att autologera användare som inte har skrivit något i en timme men som fortfarande får frekventa systemmeddelanden:

interagera -input $ user_spawn_id timeout 3600 return -output $ spawn_id

Om mönstret är sökordetnull , och nuller är tillåtna (viaremove_nulls kommando), exekveras den motsvarande kroppen om en enda ASCII 0 matchas. Det är inte möjligt att matcha 0 byte via glob eller regexp-mönster.

Prefacing ett mönster med flaggan-jag skriver orsakar variabeln interact_out (spawn_id) att ställas in på spawn_id som matchade mönstret (eller eof).

Åtgärder somha sönder ochFortsätta orsaka kontrollstrukturer (dvsför , proc ) att uppträda på vanligt sätt. docklämna tillbaka orsaker växlar till att återvända till sin uppringare, medaninter_return orsakerpåverka varandra att ge en avkastning i sin uppringare. Till exempel, om "proc foo" heterpåverka varandra som sedan utförde åtgärdeninter_return , proc foo skulle återvända. (Detta betyder att ompåverka varandra samtaltolk interaktivt skrivalämna tillbaka kommer att få interagern att fortsätta, medaninter_return kommer att få interaktiviteten att återvända till sin uppringare.)

Underpåverka varandra , råläge används så att alla tecken kan överföras till den aktuella processen.Om den nuvarande processen inte tar emot jobbkontrollsignaler, kommer den att sluta om en stoppsignal skickas (som standard ^ Z). För att starta om det, skicka en fortsättningssignal (t.ex. "kill -ONT"). Om du verkligen vill skicka en SIGSTOP till en sådan process (genom ^ Z), överväga att gawning csh först och sedan köra ditt program. Å andra sidan, om du vill skicka en SIGSTOP tillFörvänta sig själv, första samtalstolk (kanske genom att använda en flyktig) och tryck sedan på ^ Z.

String-kroppspar kan användas som en stenografi för att undvika att behöva komma in i tolken och exekvera kommandon interaktivt. Det tidigare terminalläget används medan kroppen i ett strängkroppspar exekveras.

För snabbhet utförs åtgärder som standard i råläge. De-återställa flaggan återställer terminalen till det läge som det tidigare hadepåverka varandra utfördes (alltid kokt läge). Observera att tecken som är inmatade när läget byts ut kan gå vilse (en olycklig egenskap hos terminaldrivrutinen på vissa system). Den enda anledningen att använda-återställa är om din åtgärd beror på att du kör i kokt läge.

De-eko flaggan skickar tecken som matchar följande mönster tillbaka till processen som genererade dem som varje tecken läses. Detta kan vara användbart när användaren behöver se återkoppling från delvis typade mönster.

Om ett mönster echoes, men så småningom misslyckas, skickas tecknen till den gjorda processen. Om den spridda processen återger dem, kommer användaren att se tecknen två gånger.-eko är förmodligen endast lämplig i situationer där användaren osannolikt inte fullbordar mönstret. Exempelvis är följande utdrag från rftp, recursive-ftp-skriptet, där användaren uppmanas att ange ~ g, ~ p eller ~ l, för att få, sätta eller lista den aktuella katalogen rekursivt. Dessa är så långt borta från de vanliga ftp-kommandon, att användaren osannolikt kommer att skriva ~ följt av något annat, utom felaktigt, i så fall kommer de förmodligen bara att ignorera resultatet ändå.

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

De-nobuffer flagga skickar tecken som matchar följande mönster till utmatningsprocessen som tecken läses.

Detta är användbart när du vill låta ett program echo tillbaka mönstret. Till exempel kan följande användas för att övervaka var en person ringer (ett Hayes-stilmodem). Varje gång "atd" ses, loggar loggen resten av raden.

proc-lognumber {} {interaktiv -nobuffer -re "(. *) r" returnerar $ logg "klockformat klock sekunder: dialed $ interact_out (1 string)"} interagera -nobuffer "atd" lognumber

Underpåverka varandra , tidigare användning avlog_user ignoreras. Särskilt,påverka varandra kommer att tvinga sin produktion att loggas (skickas till standardutgången) eftersom det antas att användaren inte vill interagera blint.

De-o flaggan orsakar att några följande nyckelkroppspar ska appliceras på utgången av den aktuella processen. Detta kan vara användbart, till exempel när det gäller att hantera värdar som skickar oönskade tecken under en telnet-session.

Som standardpåverka varandra förväntar sig att användaren ska skriva stdin och läsa stdout avFörvänta bearbeta sig själv. De-u flagga (för "användare") görpåverka varandra leta efter användaren som den process som heter av dess argument (vilket måste vara ett spriddt id).

Detta gör det möjligt att sammanfoga två orelaterade processer utan att använda en explicit loop. För att hjälpa till med felsökning, vänta diagnostik alltid till stderr (eller stdout för viss loggnings- och felsökningsinformation). Av samma anledning,tolk kommandot läser interaktivt från stdin.

Till exempel skapar följande fragment en inloggningsprocess. Då ringer den till användaren (ej visad), och slutligen ansluter de två tillsammans. Naturligtvis kan varje process ersättas med inloggning. Ett skal, till exempel, skulle tillåta användaren att arbeta utan att tillhandahålla ett konto och lösenord.

spawn login set inloggning $ spawn_id spawn tips modem # ring tillbaka till användare # anslut användare för att logga in interagera -u $ login

För att skicka utdata till flera processer, lista varje språkkodslista som prefaced av a-produktion flagga. Inmatning för en grupp av utspridda ids kan bestämmas av en spion ID-lista som prefaced av a-inmatning flagga. (Både-inmatning och-produktion kan ta listor i samma form som-jag flagga iförvänta kommando, förutom att any_spawn_id inte är meningsfullt ipåverka varandra .) Alla följande flaggor och strängar (eller mönster) gäller för denna ingång tills en annan -input-flagga visas. Om inte-inmatning visas,-produktion innebär "-input $ user_spawn_id -output". (På liknande sätt, med mönster som inte har-inmatning .) Om en-inmatning specificeras, det överrätter $ user_spawn_id. Om en sekund-inmatning specificeras, det överrätter $ spawn_id. Ytterligare-inmatning flaggor kan anges.

De två implicita inmatningarna bearbetar standard för att ha sina utgångar angivna som $ spawn_id och $ user_spawn_id (i omvänd). Om en-inmatning flaggan visas med nr-produktion flagg, karaktärer från den processen kasseras.

De-jag flaggan introducerar en ersättning för den aktuella spawn_id när ingen annan-inmatning eller-produktion flaggor används. A -i-flaggan innebär en -o-flagga.

Det är möjligt att ändra de processer som interageras med genom att använda indirekta språngsidor. (Indirekta språngsidor beskrivs i avsnittet om förvänta kommandot.) Indirekta språngsidor kan anges med -i, -u, -input eller -output-flaggor.

tolk args

orsakar att användaren interaktivt uppmanasFörvänta och Tcl-kommandon. Resultatet av varje kommando skrivs ut.

Åtgärder somha sönder ochFortsätta orsaka kontrollstrukturer (dvsför , proc ) att uppträda på vanligt sätt. docklämna tillbaka orsakar tolk att återvända till sin uppringare, medaninter_return orsakertolk att ge en avkastning i sin uppringare. Till exempel, om "proc foo" hetertolk som sedan utförde åtgärdeninter_return , proc foo skulle återvända. Alla andra kommandor orsakartolk för att fortsätta att be om nya kommandon.

Som standard innehåller prompten två heltal. Det första heltalet beskriver djupet av utvärderingsstapeln (dvs hur många gånger Tcl_Eval har kallats). Det andra heltalet är Tcl-historikidentifieraren. Prompten kan ställas in genom att definiera ett förfarande kallat "prompt1" vars returvärde blir nästa prompt. Om ett uttalande har öppna citat, paren, bromsar eller parentes, utfärdas en sekundär prompt (som standard "+>") på newline. Den sekundära prompten kan ställas in genom att definiera ett förfarande kallat "prompt2".

Undertolk , kokt läge används, även om dess uppringare använde råläge.

Om stdin är stängd,tolk kommer tillbaka om inte-eof flagg används, i vilket fall det efterföljande argumentet åberopas.

log_file args -a file

Om ett filnamn tillhandahålls,loggfil registrerar ett transkript av sessionen (börjar vid den tidpunkten) i filen.loggfil kommer sluta spela in om inget argument ges. Varje tidigare loggfil är stängd.

I stället för ett filnamn kan en Tcl-fil identifieras genom att använda-öppna eller-Lämna öppen flaggor. Detta liknarrom kommando. (Serom för mer information.)

De-en flaggan tvingar utdata för att vara inloggad som undertryckts avlog_user kommando.

Som standard ärloggfil kommando bifogar till gamla filer istället för att stympa dem, för att underlätta att kunna stänga av och på flera gånger i en session. För att avkorta filer använder du-noappend flagga.

De-info flaggan orsakar log_file för att returnera en beskrivning av de senaste icke-info-argumenten som ges.

log_user-info | 0 | 1

Som standard loggas dialogrutan för att skicka / förvänta sig stdout (och en loggfil om den är öppen). Loggningen till stdout är inaktiverad med kommandot "log_user 0" och återaktiveras av "log_user 1". Logga in på loggfilen är oförändrad.

De-info flaggan orsakar log_user för att returnera en beskrivning av de senaste icke-info-argumenten som ges.

match_max -d -i spawn_id storlek

definierar storleken på bufferten (i byte) som används internt avförvänta . Utan storlek argument, den aktuella storleken returneras.

Med-d flaggan är standardstorleken inställd. (Den ursprungliga standard är 2000.) Med-jag flaggan, är storleken inställd för det angivna spawn-id, annars är den inställd för den aktuella processen.

överlägg - # spawn_id - # spawn_id … program args

exekverar "program args "istället för strömmenFörvänta program, som avslutas. Ett blott bindestreck styrker en bindestreck framför kommandonamnet som om det var ett inloggningsskal. Alla spawn_ids är stängda förutom de som heter som argument. Dessa är mappade på de angivna filidentifierarna.

Spawn_ids är mappade till filidentifierare för det nya programmet att ärva. Till exempel kör följande rad schack och låter den styras av den nuvarande processen - säg en schackmästare.

överlägg -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id schack

Detta är mer effektivt än "interagera -u", men det offrar förmågan att göra programmerad interaktion sedanFörvänta processen är inte längre i kontroll.

Observera att det inte finns någon kontrollerande terminal. Om du kopplar från eller återställer standardinmatning, kommer program som gör jobbet kontroll (skal, inloggning, etc.) inte att fungera korrekt.

paritet -d -i spawn_id värde

definierar huruvida paritet bör behållas eller avlägsnas från produktionen av spridda processer. Om värde är noll, pariteten avdras, annars är den inte avskuren. Utan värde argument, det aktuella värdet returneras.

Med-d flaggan är standardparitetsvärdet inställt. (Den ursprungliga standarden är 1, dvs pariteten är inte avskuren.) Med-jag flaggan, är paritetsvärdet satt för det angivna spawn-id, annars är det inställt för den aktuella processen.

remove_nulls -d -i spawn_id värde

definierar huruvida nuller behålls eller tas bort från utmatningen av spridda processer innan mönstret matchas eller lagras i variabeln expect_out eller interact_out . Om värde är 1, nuller tas bort. Om värde är 0, nuller avlägsnas inte. Utan värde argument, det aktuella värdet returneras.

Med-d flagga är standardvärdet inställt. (Den ursprungliga standard är 1, dvs nuller tas bort.) Med-jag flagga, är värdet inställt för det angivna spawn-id, annars är den inställd för den aktuella processen.

Oavsett om nuller tas bort eller inte,Förvänta kommer spela in nollbyte till loggen och stdouten.

skicka -flags -sträng

sänder sträng till den aktuella processen. Till exempel kommandot

skicka "hej världen"

skickar tecknen, höra till den aktuella processen. (Tcl innehåller ett printf-liknande kommando (kallatformatera ) som kan bygga godtyckligt komplexa strängar.)

Tecken skickas omedelbart, även om program med linjebuffrad inmatning inte läser tecknen tills ett returkaraktär skickas. Ett returkaraktär betecknas " r".

De-- flaggan tvingar nästa argument att tolkas som en sträng snarare än en flagga.Varje sträng kan föregås av "-" om det faktiskt ser ut som en flagga. Detta ger en tillförlitlig mekanism för att ange variabla strängar utan att bli uppstoppad av de som av misstag ser ut som flaggor. (Alla strängar som börjar med "-" är reserverade för framtida alternativ.)

De-jag flaggan förklarar att strängen skickas till namnet spawnid. Om spawn_id är user_spawn_id , och terminalen är i råläge, nya linjer i strängen översätts till retur-newline-sekvenser så att de verkar som om terminalen var i kokt läge. De-rå flaggan inaktiverar denna översättning.

De-null flaggan skickar nolltecken (0 byte). Som standard skickas ett noll. Ett heltal kan följa-null för att ange hur många noll som ska skickas.

De-ha sönder flaggan genererar ett pausförhållande. Det här är bara meningsfullt om spawn-id avser en tty-enhet som öppnas via "spawn -open". Om du har skapat en process som tips, bör du använda tipskonventionen för att skapa en paus.

De-s flaggkrafterna utsänds för att skickas "långsamt", så undviker den gemensamma situationen där en dator skriver ut en inmatningsbuffert som utformades för en människa som aldrig skulle skriva ut samma buffert. Denna utgång styrs av värdet av variabeln "send_slow" som tar en tvåelementlista. Det första elementet är ett heltal som beskriver hur många byte ska skickas atomiskt. Det andra elementet är ett reellt tal som beskriver antalet sekunder genom vilka atomväsen måste separeras. Till exempel, "set send_slow {10 .001}" skulle tvinga "skicka -s" för att skicka strängar med 1 millisekund mellan varje 10 tecken skickade.

De-h flaggan tvingar utdata för att skickas (något) som en mänsklig faktiskt skrivning. Mänskliga förseningar förekommer mellan tecknen. (Algoritmen är baserad på en Weibull-distribution, med ändringar som passar just denna applikation.) Denna utgång styrs av värdet av varianten "send_human" som tar en femelementlista. De två första elementen är en genomsnittlig interarrival tid för tecken i sekunder. Den första används som standard. Den andra används vid ordändringar, för att simulera de subtila pauser som ibland uppträder vid sådana övergångar. Den tredje parametern är ett mått på variabilitet där .1 är ganska variabel, 1 är rimligt variabel och 10 är ganska oföränderlig. Ytterligheterna är 0 till oändligheten. De två sista parametrarna är respektive minsta och maximala interarrival tid. Minsta och maximala används senast och "klipp" sista tiden. Det ultimata genomsnittet kan vara ganska annorlunda än det givna genomsnittet om det minsta och maximala klippet är tillräckligt värde.

Som exempel emulerar följande kommando en snabb och konsekvent maskinskrivare:

sätta send_human {.1 .3 1 .05 2} skicka -h "Jag är hungrig. Låt oss göra lunch."

medan följande kan vara mer lämpliga efter en baksmälla:

sätt send_human {.4 .4 .2 .5 100} skicka -h "Goodd party lash night!"

Observera att fel inte simuleras, även om du själv kan konfigurera felkorrigeringssituationer genom att inbädda fel och korrigeringar i ett skicka argument.

Flaggarna för att skicka null tecken, för att skicka raster, för att tvinga långsam utmatning och för mänsklig utskrift utesluter varandra. Endast den som anges senast kommer att användas. Dessutom nej sträng argument kan anges med flaggorna för att skicka null tecken eller raster.

Det är en bra idé att gå före den förstaskicka till en process av enförvänta. förvänta kommer att vänta på att processen ska startas, medanskicka kan inte. I synnerhet om den förstaskicka slutför innan processen börjar springa, riskerar du att ignorera dina data. I situationer där interaktiva program inte erbjuder någon inledande prompt kan du gå föreskicka med en fördröjning som i:

# För att undvika att ge hackare tips om hur man bryter in, # kräver detta system inte ett externt lösenord. # Vänta i 5 sekunder för exec att slutföra spawn telnet very.secure.gov sova 5 skicka lösenord r

exp_send är ett alias för skicka. Om du använder Expectk eller någon annan variant av Expect i Tk-miljön,skicka definieras av Tk för ett helt annat syfte.exp_send tillhandahålls för kompatibilitet mellan miljöer. Liknande aliaser tillhandahålls för andra Expects andra skicka kommandon.

send_error -flags sträng

är somskicka , förutom att utmatningen skickas till stderr istället för den aktuella processen.

send_log - sträng

är somskicka , förutom att strängen bara skickas till loggfilen (seloggfil .) Argumenten ignoreras om ingen loggfil är öppen.

send_tty -flags sträng

är somskicka , förutom att utmatningen skickas till / dev / tty istället för den aktuella processen.

send_user -flags sträng

är somskicka , förutom att utsignalen skickas till stdout snarare än den aktuella processen.

sova sekunder

får skriptet att sova i d