Ocenite etot tekst:


 Perevod "Tricks of the UNIX Masters" by Russel G. Sage
---------------------------------------------------------------
 From: Vladimir Kazennov 
---------------------------------------------------------------

    * VVEDENIE *

Nepreryvnoe snizhenie cen, rost proizvoditel'nosti v nashe vremya i ozhidaemoe poyavlenie novyh mikro- i super-mikrokomp'yuterov delayut moshch' sistemy UNIX dostupnoj dlya vse bol'shego kruga pol'zovatelej. Sistemy UNIX ili tipa UNIX rabotayut na lyubyh mashinah, ot urovnya PC-XT do AT i vyshe. Dostupnost' bol'shih ob容mov operativnoj pamyati i moshchnyh mikrop- rocessorov privela k vozrastaniyu interesa k mnogozadachnosti, sistemam mul'tiprocessirovaniya - sfere, v kotoroj UNIX imeet solidnuyu reputa- ciyu. Odnako primenenie UNIX s maksimal'noj otdachej - delo nelegkoe. Lyudi godami vyskazyvali neudovletvorenie tem, chto ona ne yavlyaetsya "druzhestvennoj" po otnosheniyu k pol'zovatelyu - i eto razumnaya kritika, hotya na samom dele UNIX soderzhit sredstva dlya postroeniya interfejsov lyubogo trebuemogo urovnya slozhnosti. Naibolee vazhnaya prichina trudoem- kosti effektivnogo ispol'zovaniya UNIX sostoit v tom, chto v sisteme ispol'zuyutsya ochen' plodotvornye idei, ne znakomye mnogim lyudyam, rabo- tavshim s bolee prostymi operacionnymi sistemami. UNIX predostavlyaet takzhe gorazdo bol'she instrumental'nyh sredstv, bolee gibkih i s su- shchestvenno bol'shimi vozmozhnostyami, chem, naprimer, populyarnaya MS-DOS (v chem mozhno ubedit'sya beglym sravneniem sootvetstvuyushchih rukovodstv). Veroyatno, Vy, chitatel', nachinali s izucheniya UNIX v ob容me, dosta- tochnom dlya resheniya konkretnyh zadach v vashej sisteme, bud' to tekstovaya obrabotka i formatirovanie tekstov, programmirovanie ili zapusk sta- tisticheskih paketov. CHerez nekotoroe vremya vy, vidimo, nakopili (ot drugih lyudej ili v rezul'tate sobstvennoj raboty) nebol'shoj nabor pri- emov, vklyuchayushchij, vozmozhno, nekotoryj opyt prostogo programmirovaniya dlya interpretatora komandnogo processora. Hotya eto estestvennyj put' razvitiya, prinimaya vo vnimanie, chto v UNIX bolee 200 komand, vy mozhete ne zametit' ili propustit' mnogie moshchnye i poleznye idei. Bolee vazhno to, chto vy mozhete lishit'sya perspektivnogo vzglyada, kotoryj prihodit s polnym ponimaniem togo, kak rabotayut razlichnye chasti UNIX, i koncepcij, kotorye lezhat v ih osnove. V knige pokazany mnogie poleznye instrumental'nye sredstva i pri- emy, kotorye vy mozhete srazu primenyat' v rabote, chtoby znachitel'no po- vysit' proizvoditel'nost' UNIX. V otlichie ot nekotoryh knig, kotorye prosto predstavlyayut nabor komandnyh fajlov ili drugih sredstv, zdes' opisyvayutsya podrobnosti togo, kak rabotaet kazhdaya programma, i ukazy- vayutsya nekotorye napravleniya adaptacii programm dlya vashih konkretnyh nuzhd. Sochetanie instrumental'nyh sredstv, koncepcij i tehniki resheniya zadach pomozhet vam stat' masterom UNIX.

    CHTO VY DOLZHNY UZHE ZNATX

Dlya togo, chtoby izvlech' pol'zu iz dannoj knigi, vy dolzhny obla- dat' nekotorym bazovym opytom raboty v sisteme UNIX. Vy dolzhny znat' obshchie aspekty fajlovoj sistemy, takie, kak katalogi, vlozhennost' i marshrutnye imena. Vy dolzhny znat', kak ispol'zovat' odin iz redaktorov UNIX, chtoby vvodit' komandnye fajly interpretatora komandnogo pro- cessora i, po krajnej mere, slegka znat' programmirovanie s ispol'zo- vaniem komandnogo processora. My sdelali malo dopushchenij, kasayushchihsya togo, chto vy dolzhny znat' o dannoj komande ili osobennostyah UNIX. Kazh- daya komanda ili ponyatie ob座asnyaetsya, kogda ono vvoditsya, a periodi- cheskie ekskursy v vashi rukovodstva po UNIX mogut proyasnit' vse temnye mesta. Zapomnite odno: imeetsya tak mnogo komand s takim bol'shim koli- chestvom opcij, chto dazhe my, professionaly, dolzhny vremya ot vremeni ob- rashchat'sya k knige. Esli vy tol'ko nachinaete ispol'zovat' UNIX, to kniga "UNIX Primer Plus" ("Rasshirennyj bukvar' po UNIX") Mitchela Uejta (Mitchell Waite), Donal'da Martina (Donald Martin) i Stefena Prata (Stephen Prata) (SAMS, 1983) dast vam ischerpyvayushchee vvedenie v predmet. Esli vy uzhe ne novichok, no vse eshche ne imeete chetkogo predstavleniya o vnutrennej rabo- te komandnogo processora i programmirovanii dlya nego, to vam dast fun- damental'nye osnovy drugaya kniga - "Advanced UNIX - A Programmer's Guide" ("Rukovodstvo programmista po rasshirennomu UNIX") Stefena Prata (SAMS, 1985). Fakticheski eta kniga yavlyaetsya ideal'nym sputnikom i spravochnikom dlya dopolnitel'nyh issledovanij, kotorye sostavlyayut nashu knigu.

    O KAKOJ SISTEME UNIX IDET RECHX

Imeetsya, konechno, mnogo variantov UNIX. Pomimo osnovnyh semejstv realizacij UNIX (AT&T System V, Microsoft XENIX i Berkeley [BSD]), rasprostraneno neskol'ko razlichnyh komandnyh processorov, sredi koto- ryh naibolee shiroko ispol'zuyutsya dva - komandnyj processor Bourne ko- mandnyj processor Si. Vse komandnye fajly v dannoj knige byli provere- ny i v System V, i v XENIX s ispol'zovaniem komandnogo processora Bourne, za isklyucheniem teh sluchaev, kotorye special'no otmecheny. BOLX- SHINSTVO nashih komandnyh fajlov rabotaet takzhe pod upravleniem komand- nyj processor Bourne v BSD, hotya neskol'kih komand System V net v sisteme BSD i naoborot. My pytalis' ukazat' te mesta, v kotoryh eti dve sistemy sushchestvenno otlichayutsya, i dat' nekotorye al'ternativnye podhody dlya pol'zovatelej BSD. Bol'shinstvo nashih komandnyh fajlov bylo takzhe perepisano dlya za- puska pod upravleniem programmnogo processora Si posle ucheta sin- taksicheskih otlichij. Esli vy pol'zuetes' komandnym processorom Bourne i hoteli by poeksperimentirovat' s programmnym processorom Si, to ho- roshim vvedeniem yavlyaetsya ukazannaya ranee kniga "Advanced UNIX - A Programmer's Guide". Esli odin iz nashih komandnyh fajlov ne rabotaet v vashej sisteme, ne vpadajte v paniku. Prover'te, pozhalujsta, sleduyushchee: - Kakaya u vas versiya UNIX? Otmechali li my chto-nibud' otnositel'no etoj versii? - Kakoj komandnyj processor vy ispol'zuete (Bourne, Si ili dru- goj)? - Dolzhny li vy pomenyat' marshrutnoe imya v silu togo, chto v vashej sisteme chto-to nahoditsya v drugoj chasti? - Ne utratili li vy prav dostupa k opredelennomu fajlu? Ne nuzhno li vam primenit' komandu su, chtoby poluchit' drugoj identifika- tor pol'zovatelya ili stat' v koren'? - Ispol'zuet li dannyj komandnyj fajl predvaritel'no pod- gotovlennyj komandnyj fajl, kotoryj vy eshche ne vveli v vashu sistemu? Bol'shinstvo iz etih sovetov dovol'no ochevidny, no nikogda ne me- shaet sdelat' glubokij vdoh i vnimatel'no podumat', prezhde chem nyryat' v otladochnye seansy.

    OBZOR GLAV

Davajte brosim beglyj vzglyad na to, chto opisyvaetsya v dannoj kni- ge, chtoby vy poluchili predstavlenie o predmete knigi i znali, gde naj- ti nuzhnuyu temu. Glava 1 - vvedenie v sredu vypolneniya sistemy UNIX v celom, sposoby obrashcheniya pol'zovatelej k ee razlichnym chastyam. Vy uvidite, ka- kim obrazom vash rost kak mastera UNIX pozvolit vam maksimal'no uspeshno primenyat' vse aspekty i osobennosti sredy. V glave 2 rassmatrivaetsya naibolee vazhnaya osobennost' sredy UNIX - fajlovaya sistema - i vvodyatsya instrumental'nye sredstva dlya izucheniya fajlovyh struktur i soderzhimogo fajlov. Glava 3 predostavlyaet sredstva dlya prakticheskih kazhdodnevnyh za- dach po soprovozhdeniyu fajlov - dlya kopirovaniya i sohraneniya fajlov i dlya udaleniya nenuzhnyh fajlov. V glave 4 opisyvayutsya vidy fajlov, kotorye vazhny dlya programmnoj dokumentacii, i predostavlyayutsya instrumental'nye sredstva, kotorye ob- legchayut vam soprovozhdenie vashej rastushchej kollekcii programmnyh sredstv. V glave 5 obrashcheno vnimanie na vashu sobstvennuyu sredu (home-sre- du) i lichnoe administrirovanie. Syuda otnositsya upravlenie vashim plani- rovaniem i zadachami. Predstavleno neskol'ko poleznyh sredstv, pomogayu- shchih vam. Glava 6 predostavlyaet sposoby polucheniya svedenij o drugih pol'zo- vatelyah i sredstva dlya obespecheniya bezopasnosti vashego rabochego prost- ranstva v sisteme. V glave 7 rassmatrivayutsya nekotorye apparatnye chasti ustrojstv UNIX, osobenno, terminaly i diski s nekotorymi primerami instrumen- tal'nyh programmnyh sredstv. Vklyucheny takzhe instrumenty dlya raboty s fajlovymi sistemami. Glava 8 posvyashchena kommunikaciyam v UNIX - sfere, znachimost' koto- roj bystro vozrastaet. |tot material pomozhet vam rabotat' s nesoglaso- vannymi modemami, a takzhe s problemami bezopasnosti i upravleniya, ko- torye voznikayut pri rabote s komandami cu i uucp. Predlagaemye sredstva pomogut vam v rabote kak s kommunikaciyami ot UNIX k drugoj operacionnoj sisteme, tak i ot UNIX k UNIX. Privedeny takzhe prakti- cheskie primery apparatnyh konfiguracij. Glava 9 vvodit chitatelya v sistemnoe administrirovanie i bezo- pasnost'. Vy mozhete najti zdes' informaciyu, kotoruyu vy mogli by polu- chat' samostoyatel'no tol'ko posredstvom mnogoletnego chteniya i eksperi- mentirovaniya. Poskol'ku UNIX stanovitsya bolee rasprostranennym v "re- al'nom mire", bezopasnost' stanovitsya ochen' vazhnym voprosom. My predstavlyaem koncepcii, daem informaciyu o tom, za chem neobhodimo sle- dit', i instrumental'nye sredstva, pomogayushchie sledit'. Glava 10 zavershaet knigu podborkoj special'nyh priemov UNIX, vklyuchayushchih odnu-dve komandnye stroki, kotorye dejstvuyut neozhidanno ef- fektivno. Nabor prilozhenij predostavlyaet informaciyu, poleznuyu pri program- mirovanii s pomoshch'yu komandnogo processora i pri otladke. Poskol'ku nekotorye iz instrumental'nyh sredstv ispol'zuyut ko- mandnye fajly, vvedennye ranee v dannoj knige, vy dolzhny rabotat' nad knigoj v sootvetstvii s posledovatel'nost'yu glav, kogda vnedryaete ko- mandnye fajly v vashu sistemu. Odnako vam ne pomeshaet snachala pere- listat' vsyu knigu.

    * GLAVA 1. Sreda sistemy UNIX *

Vvedenie Mnogoobrazie sred sistemy UNIX Vash registracionnyj katalog: kak sdelat' ego komfortnym Teorii otnositel'nosti a la UNIX ZHizn' sistemy UNIX: nekotorye metafory

    SREDA SISTEMY UNIX

    VVEDENIE

V dannoj glave rassmatrivaetsya sreda, kotoraya sushchestvuet v siste- me UNIX i vokrug nee. Osveshchenie vseh aspektov sredy UNIX bylo by slish- kom gromozdkoj zadachej i vyhodit za predely dannoj knigi. Dazhe otdel'- nym utilitam, takim kak fsdb i sdb, nuzhny svoi sobstvennye knigi, chto- by otdat' im dolzhnoe. My pytaemsya dat' chitatelyu nachal'nye svedeniya, filosofiyu i oshchushchenie sistemy UNIX, chto lezhit v osnove issledovanij i instrumentov, predstavlennyh v etoj knige. CHitaya etu glavu, vy, vozmozhno, zahotite prochitat' (ili perechi- tat') komandy profile(4), environ(5), term(5), termcap(5) i termio(7) v rukovodstvah po UNIX, chtoby oznakomit'sya s mehanizmami, kotorye pre- dostavlyaet UNIX dlya ustanovki rabochej sredy. Vnutri sistemy UNIX sushchestvuet mnozhestvo razlichnyh podsred. Vse vmeste oni obrazuyut obshchuyu kartinu, v vide kotoroj my predstavlyaem sebe UNIX. |ta kniga posvyashchena naibolee vazhnym aspektam sredy UNIX s cel'yu zakladyvaniya fundamenta, neobhodimogo dlya ponimaniya vsej sistemy. |to dast vam kontekst, v kotorom mozhno posmotret' na sobstvennuyu rabotu v sisteme, nezavisimo ot togo, yavlyaetes' vy pol'zovatelem, programmistom ili administratorom sistemy. V dannoj glave rassmatrivayutsya razlichnye sredy v komp'yuterah s teoreticheskoj tochki zreniya, opisyvaetsya "domashnyaya" sreda i metody ee ustanovki, sposoby ispol'zovaniya uslovnyh oboznachenij i global'naya sreda.

    "MNOGOOBRAZIE SRED"

Kazhdaya komp'yuternaya sistema podderzhivaet mnogo razlichnyh sred. |ti sredy ispol'zuyutsya kak stroitel'nye bloki dlya sozdaniya funkcio- nal'nyh rabochih sistem. Razlichnye urovni neobhodimy kak dlya sokrashcheniya ob容ma raboty po upravleniyu mashinoj, tak i dlya postroeniya takogo in- terfejsa, chtoby my mogli ispol'zovat' komp'yuter na otnositel'no vyso- kom, udobnom dlya cheloveka urovne. My rassmatrivaem etu model', tak kak ona pomogaet vystroit' v ryad urovni, na kotoryh my mozhem rabotat'. Imeya bol'she znanij o tom, gde my nahodimsya v sisteme, i o tom, kak ona funkcioniruet vokrug nas, my mo- zhem legche stroit' rastushchie abstraktnye modeli na vershine teh modelej, kotorye uzhe imeyutsya. Komp'yutery - eto fakticheski rabochie modeli abstrakcij, tak chto chem bol'she my ponimaem modeli, tem luchshe my mozhem ispol'zovat' ih dlya uproshcheniya i uskoreniya nashej raboty. Mnogoobrazie modelej na ris.1-1 . demonstriruet razlichnye urovni, funkcioniruyushchie vnutri komp'yutera. Nizhnij sloj - eto startovaya tochka, ot kotoroj mnogoobrazie rastet vverh. Kazhdyj uroven' stroitsya na pre- dydushchem i ispol'zuetsya dlya podderzhki urovnya, raspolozhennogo nad nim. Dlya kazhdogo bolee vysokogo urovnya sreda bolee ob容mna i bolee "virtu- al'na" v tom smysle, chto imeet mesto men'she uslovnyh ogranichenij. Verhnie urovni ispol'zuyut dlya svoej raboty nizhnie i, takim obrazom, skryvayut podrobnosti, neobhodimye dlya raboty etih nizhnih urovnej. My mozhem sozdat' modeli vysokogo urovnya, kotorye rabotayut na mashine bolee nizkogo urovnya, ne znaya nichego o nizhnih urovnyah. Davajte brosim beglyj vzglyad na urovni modeli i pogovorim o tom, kakimi iz nih operiruet dannaya kniga. Ris. 1-1 Mnogoobrazie komp'yuternyh sred ------------------------------------------------------------ \ L7 / Komandnye fajly (scripts) \________________________________/ \ L6 / Prikladnye programmy, \____________________________/ interpretator komand, yazykovye generatory \ L5 / Kompilyator \________________________/ \ L4 / Operacionnaya sistema \____________________/ \ L3 / YAdro \________________/ \ L2 / Uslovnaya mashina, assembler \____________/ \ L1 / Mikroprogrammy \________/ \ L0 / Logicheskie shemy, apparatnye sredstva \____/ ------------------------------------------------------------

    UROVENX 0 - APPARATNYE SREDSTVA

Na samom nizhnem urovne nahodyatsya apparatnye sredstva i logicheskie cepi. |tot uroven' opredelyaet sposob hraneniya i obrabotki dannyh vo vseh apparatnyh sredstvah. Poskol'ku tehnologiya izgotovleniya kremnie- vyh mikroshem prodolzhaet razvivat'sya, etot uroven' stanovitsya fizi- cheski men'she i proshche, togda kak skorosti zapominaniya i obrabotki pro- dolzhayut rasti. Na etom urovne komponentami yavlyayutsya central'nyj pro- cessor (CP), pamyat', mikroshemy podderzhki i sistemnaya shina. Otmetim, chto hotya progress na etom urovne prodolzhaetsya, eto vyzy- vaet ochen' malye izmeneniya na verhnem sloe piramidy. Filosofiya sistemy UNIX sostoit v tom, chtoby izolirovat' nizkourovnevyj apparatnyj sloj i obespechit' edinoobraznye interfejsy k nemu, kotorye ne nuzhdayutsya v iz- meneniyah "naverhu". Verhnij sloj dazhe ne dolzhen znat' o nizhnem sloe. |to ne znachit, chto sobytiya v mire apparatury ne vazhny v real'nom mire, ved' protivorechiya real'nogo mira vliyayut na skorost' i emkost' resursov, ne govorya uzhe ob ih stoimosti.

    UROVENX 1 - MIKROKOMANDY

|tot uroven' vo mnogom pohozh na yazyk programmirovaniya. On yavlya- etsya instrumentom, kotoryj ispol'zuet arhitektor sistemy dlya sozdaniya "rodnogo" mashinnogo yazyka. Mashinnyj yazyk soobshchaet apparature, kakuyu konkretnuyu komandu sleduet vypolnit'. V nachale evolyucii CP bol'shinstvo naborov komand byli apparatno kodirovannymi. |to znachit, chto kogda CP poluchal komandu, dekodirovanie i vypolnenie proizvodilos' neposredstvenno cepyami v kremnievoj mik- rosheme. Blagodarya progressu v tehnologii CP, nekotorye mikroshemy mo- gut byt' programmiruemymi na urovne ispolneniya komand, chto pozvolyaet konstruktoram sozdavat' i realizovyvat' novye nabory komand s mini- mal'nymi usiliyami.

    UROVENX 2 - USLOVNAYA MASHINA

Dannyj uroven' obespechivaet translyaciyu iz mnemonik yazyka assemb- lera v kody operacij i dannye mashinnogo yazyka. YAzyk assemblera - eto nekotoraya anglo-podobnaya notaciya, kotoraya oblegchaet cheloveku ponimanie i upravlenie rabotoj komp'yuterov. Uslovnaya mashina podderzhivaetsya assemblerom. Assembler mozhet prev- rashchat' idei bolee vysokogo urovnya v cepochki chisel, kotorye mogut byt' zatem vypolneny. Naryadu s assemblerom, primenyayutsya modeli, pomogayushchie ispol'zovat' apparaturu komp'yutera. Zdes' my mozhem opredelit' takie veshchi, kak steki, vektora preryvanij i periferijnyj vvod-vyvod.

    UROVENX 3 - YADRO

YAdro yavlyaetsya sleduyushchim logicheskim prodvizheniem vverh i koncepci- ej, kotoruyu mozhno teper' realizovat' programmno na uslovnoj mashine. YAdro predostavlyaet sredu, podderzhivayushchuyu eshche bol'shie abstrakcii, chem te, chto rassmatrivalis' do sih por. Dvumya naibolee vazhnymi abstrakciya- mi na urovne yadra yavlyayutsya upravlenie processami dlya mul'tiprogrammi- rovaniya i mnogozadachnosti, i fajlovaya sistema, kotoraya upravlyaet hra- neniem, formatom, poiskom fajlov i t.p. Kogda eti dve oblasti pereple- tayutsya, my imeem bazovuyu funkciyu mnogopol'zovatel'skoj mashiny i yadro operacionnoj sistemy. Odnoj iz naibolee vazhnyh oblastej, kotorymi upravlyaet yadro, yavlya- etsya bezopasnost'. Proverki identifikacii pol'zovatelya vypolnyayutsya v sistemnyh vyzovah vnutri yadra. Opredelennye mehanizmy ispol'zuyutsya yad- rom dlya upravleniya bezopasnost'yu fajlov, ustrojstv, pamyati i pro- cessov. Edinstvennyj sposob otklyuchit' mehanizmy bezopasnosti sostoit v izmenenii ishodnogo koda yadra i perekompilyacii vsej sistemy, chto krajne nezhelatel'no.

    UROVENX 4 - OPERACIONNAYA SISTEMA

Dannyj uroven' stroitsya na yadre, chtoby sozdat' polnuyu operacion- nuyu sredu. Potrebnost' v dopolnitel'nyh funkciyah sistemy mozhno udov- letvorit' sozdaniem avtonomnyh programm, imeyushchih konkretnoe naznache- nie. Takim obrazom, sovokupnost' vseh specificheskih funkcij opredelyaet operacionnuyu sistemu.

    UROVENX 5 - KOMPILYATORY

Kompilyator - eto instrument (ili programma), postroennyj na ope- racionnoj sisteme dlya dal'nejshej razrabotki bolee sovershennyh i bolee moshchnyh sred. Novye sredy mogut predpolagat' eshche bol'shie abstrakcii, chem na nizhnem urovne, i delat' bol'she dopushchenij o tom, chto uzhe sushchest- vuet. |to delaet vozmozhnym simvolicheskie konstrukcii bolee vysokogo urovnya, takie kak struktury dannyh i upravlyayushchie struktury. Rezul'ta- tom yavlyaetsya prikladnaya programma. S pomoshch'yu kompilyatora my mozhem opredelit' sovershenno novyj yazyk i sdelat' ego rabochim na komp'yutere, napisav kompiliruyushchuyu programmu, kotoraya chitaet etot novyj yazyk. |to otkryvaet celye novye oblasti vo vzaimodejstvii cheloveka s mashinoj. Vysokourovnevye yazyki mogut voplo- shchat' razlichnye podhody k resheniyu zadach, naprimer, procedurnuyu model' ili ob容ktno-orientirovannuyu model', i v konce koncov, ochevidno, mogut dostich' vyrazitel'noj moshchi razgovornogo yazyka tipa anglijskogo.

    UROVENX 6 - PRIKLADNYE PROGRAMMY

V nashe vremya prikladnye programmy mogut oznachat' massu raznoob- raznyh veshchej. My mozhem predpolozhit', chto lyubaya programma, kotoraya sde- lana s pomoshch'yu kompilyatora, yavlyaetsya prikladnoj programmoj. Primerami vozmozhnyh prikladnyh programm yavlyayutsya sleduyushchee pokolenie yazykov, in- terpretatorov i generatorov prikladnyh programm. Interpretator - eto programma, napisannaya na rasprostranennom yazyke vysokogo urovnya, koto- raya mozhet dekodirovat' i ispolnyat' drugoj sintaksis (ili yazyk). Prime- rom, kotoryj interesuet nas v sisteme UNIX, yavlyaetsya komandnyj pro- cessor shell. |to programma na yazyke Si, sozdannaya dlya chteniya i ispol- neniya komand, zapisannyh po pravilam sintaksisa, opredelennyh komand- nym processorom shell. Generator prikladnyh programm - eto programma, napisannaya na yazy- ke vysokogo urovnya. Ona prednaznachena dlya polucheniya dostatochnoj infor- macii ot pol'zovatelya o ego prilozhenii i mozhet ispol'zovat' kompilya- tornyj yazyk, naprimer Si, dlya napisaniya prikladnoj programmy, realizu- yushchej to, chto trebuetsya. Pol'zovatel' nichego ne programmiruet. Vyhodom generatora yavlyaetsya rabochaya programma. UNIX ne delaet osobyh razlichij mezhdu urovnyami. Nekotorye osoben- nosti sistemy, naprimer, konvejery, yavlyayutsya chast'yu yadra na nizhnem urovne. Komanda tipa cat vypolnyaet dovol'no prostuyu funkciyu na urovne operacionnoj sistemy. Nechto podobnoe ls napominaet prostuyu prikladnuyu programmu s otnositel'no malym naborom opcij. Bol'shie programmy, po- dobnye semejstvu roff, opredelenno yavlyayutsya polnovesnymi prilozheniyami, a sredstva tipa sed i awk yavlyayutsya fakticheski interpretatorami nebol'- shih yazykov programmirovaniya. Zamechatel'noj osobennost'yu sistemy UNIX yavlyaetsya edinoobrazie, kotoroe ona vnosit v etot shirokij diapazon funkcij.

    UROVENX 7 - KOMANDNYE FAJLY

|tot verhnij uroven' yavlyaetsya yazykom, kotoryj interpretiruet programma /bin/sh (v sluchae komandnogo processora Bourne shell). Ee sintaksis podderzhivaet polnyj yazyk programmirovaniya. Hotya etot yazyk lishen ryada vstroennyh struktur i funkcij sovremennogo yazyka vysokogo urovnya, on imeet vse neobhodimoe dlya napisaniya poleznyh programm. Bol'shim plyusom yavlyaetsya to, chto yazyku komandnogo processora dostupny v kachestve vneshnih funkcij lyubye sredstva, utility i programmy, kotorye imeyutsya v sisteme UNIX. |to znachit, chto algoritmy, kotorye mogut pot- rebovat' sto ili bolee strok na yazyke nizkogo urovnya tipa Si, yazyk ko- mandnogo processora mozhet vyrazit' v dvadcat' strok. Za schet poteri proizvoditel'nosti, razumeetsya.

    VASH "REGISTRACIONNYJ KATALOG"

Poskol'ku UNIX sozdavalas' kak mnogopol'zovatel'skaya sistema, mnogoe sdelano dlya togo, chtoby sistema byla bezopasnoj i udobnoj dlya kazhdogo pol'zovatelya. Vam vydelyaetsya opredelennaya chast' fajlovoj sistemy (t.e. oblast' na diske), kotoraya yavlyaetsya polnost'yu vashej i bol'she nichej. Vy mozhete zablokirovat' vashu oblast' tak, chtoby nikto ne mog zaglyanut' vovnutr', ili zhe mozhete ostavit' ee otkrytoj, chtoby dru- gie lyudi mogli chitat' etu oblast' ili pisat' v nee. Pomimo opredeleniya vashego mesta v sisteme, mozhno privyazat' "do- mashnij" katalog (home-catalog) k vashim tochnym specifikaciyam. "Regist- racionnyj katalog" - eto ne tol'ko oblast' fajlovoj pamyati, no i vsya vasha sreda. Mozhno ustanovit' peremennye komandnogo yazyka dlya opredele- niya putej po sisteme. Mozhno sozdat' instrumentarij, chtoby pomoch' vam v rabote.

    CHTO TAKOE SOSEDSTVO?

Vo mnogih bolee staryh mini- i mikrokomp'yuterah sreda imeet "ploskuyu" fajlovuyu sistemu. |to znachit, chto vse fajly razmeshchayutsya v odnoj ogromnoj oblasti hraneniya i net logicheskih razdelov dlya ih razg- ranicheniya. Otsutstvie razdelov porozhdaet massu fajlov, cherez kotorye nuzhno probrat'sya, kogda vy hotite najti opredelennyj element. Nekoto- rye sistemy imeli v svoih fajlovyh sistemah gruppovye razdely, no obychno takie razdely byli razlichnymi ploskimi fajlovymi sistemami. Vremya pokazalo, chto takoj tip sredy (ili modeli) - ne luchshee reshenie. Reshenie, kotoroe ispol'zuet UNIX,- perevernutaya model' dereva. Koren' sistemy nahoditsya naverhu, a vetvi rastut v storony i vniz. Imeetsya odin i tol'ko odin koren' naverhu. Vetvi mogut ishodit' v lyu- bom napravlenii i prostirat'sya vniz na lyubuyu glubinu. Krome togo, vy mozhete imet' prisoedinyaemye vetvi, kotorye mozhno iz座at' iz sistemy, a zatem vernut' obratno. Oni montiruyutsya na sushchestvuyushchuyu v sisteme dre- vovidnuyu strukturu. Kogda vy registriruetes' v sisteme, vy mozhete popast' v lyuboe mesto drevovidnoj struktury. Registracionnyj katalog opredelyaetsya v fajle parolej. K nej mozhno obratit'sya po imeni $HOME, kotoraya yavlyaetsya odnoj iz predopredelennyh peremennyh komandnogo yazyka dlya vashego ispol'zovaniya. Teper' u vas est' personal'naya drevovidnaya struktura pod etim imenem kataloga. Ona polnost'yu vasha i mozhet byt' sdelana ne- dostupnoj dlya kogo ugodno, krome kornya. Vy mozhete organizovat' vash re- gistracionnyj katalog ($HOME) lyubym priemlemym dlya vas sposobom.

    PLANIROVKA REGISTRACIONNOGO KATALOGA

Kak tol'ko vash registracionnyj katalog prisoedinen k opredelenno- mu mestu dereva, vy poluchaete polnoe upravlenie strukturoj, kotoraya sushchestvuet nizhe etogo mesta. Vy mozhete ostavit' ee ploskoj ili sdelat' podobnoj derevu. |ta struktura zavisit fakticheski ot vashih potreb- nostej i entuziazma v ekspluatacii vashej sobstvennoj oblasti. Naibol'- shaya vygoda dlya nas sostoit v tom, chtoby ispol'zovat' vashu "domashnyuyu" sredu dlya podderzhki vashih rabot i maksimal'no umen'shit' ob容m ruchnoj raboty. V sleduyushchih dvuh glavah opisano mnozhestvo sredstv, kotorye mo- gut rabotat' s vashej lichnoj fajlovoj sistemoj. Na ris.1-2 pokazana drevovidnaya struktura vashego registracionno- go kataloga. |ta planirovka predstavlyaet karkas sredy, kotoryj vy mo- zhete zapolnit' sootvetstvuyushchej informaciej. Po mere togo, kak rastet vashe masterstvo ispol'zovaniya sistemy, vam mogut ponadobit'sya eti tipy oblastej dlya razmeshcheniya v nih informa- cii. Vy obnaruzhite takzhe, chto nash scenarij hraneniya informacii predpo- lagaet dvizhenie po derev'yam, ili ih obhod, tak chto vam garantiruetsya vygoda ot ispol'zovaniya ierarhicheskoj konstrukcii. Davajte projdemsya po etoj primernoj strukture i opredelim, kakovy ee chasti. Dannaya struktura vklyuchaet mnogo fajlov i katalogov, no vse oni imeyut opredelennoe naznachenie. Vozmozhno, vy ne zahotite ispol'zo- vat' v tochnosti eti imena, no vy poluchaete sovet, kakie tipy kategorij mogut vstretit'sya i kak ispol'zovat' sistemu dlya podderzhki etoj struk- tury. Kornem etogo dereva yavlyaetsya registracionnyj katalog, kotoryj op- redelen v pyatom pole fajla /ets/passwd. Ispol'zovanie fajla parolej opisano v passwd(4). Vot primer parol'nogo vhoda avtora: russ:.pDIPADYfIXBY:103:101:Russ Sage:/usr/russ:/bin/sh Sleva napravo vy vidite imya pol'zovatelya (russ), parol' (.pDI...), identifikator pol'zovatelya (103), identifikator gruppy (101), lichnyj kommentarij, imya registracionnogo kataloga (/usr/russ) i komandnyj processor shell, poluchaemyj pri vhode v sistemu (/bin/ sh).

    FAJLY V REGISTRACIONNOM KATALOGE

Fajly, opisyvaemye nizhe, razdelyayutsya na tri kategorii: fajly, ko- torye obychno prisutstvuyut v vashej sisteme, esli vy rabotaete v System V, fajly, kotorye imeyutsya obychno v Berkeley 4.2, i fajly, kotorye soz- dayutsya pri ispol'zovanii programm iz nastoyashchej knigi.

    FAJLY System V

Pervyj fajl - eto .news_time. Data etogo fajla sootvetstvuet to- mu, kogda vy poslednij raz chitali novosti v kataloge /usr/news. Dlya chteniya novostej pol'zujtes' komandoj news(1). |ta komanda vydaet no- vosti, poyavivshiesya pozzhe daty sozdaniya fajla .news_time. Sleduyushchij fajl - .profile. |tot fajl vypolnyaetsya pri kazhdoj re- gistracii v interpretatore shell i mozhet byt' ispol'zovan dlya privyazki vashej sobstvennoj sredy. V dal'nejshem my rassmotrim etot fajl bolee podrobno. Sleduyushchij fajl - calendar (kalendar'). |tot fajl soderzhit daty i soobshcheniya. Komanda calendar(1) chitaet v etom fajle daty, ochen' blizkie k tekushchej date. Zatem pechatayutsya ili posylayutsya vam po pochte soobshche- niya. Poslednij fajl - mbox, vash sistemnyj pochtovyj yashchik. Kogda vy s pomoshch'yu komandy mail(1) sohranyaete pochtu, ona napravlyaetsya po umolcha- niyu v mbox.

    FAJLY 4.2 BSD

Pervym fajlom zdes' yavlyaetsya .cshrc. |to pervaya stadiya nastrojki sistemy na pol'zovatelya, vypolnyaemoj interpretatorom cshell. V sisteme UNIX prisutstvie "rc" v imeni fajla oznachaet "komandy zapuska" ("run commands") ili "zapusk pri zagruzke" ("run on boot up"). Fajl .login yavlyaetsya sinonimom fajla .profile interpretatora sh. |tot fajl soderzhit komandy nastrojki na sredu pol'zovatelya, kotoraya vam nuzhna pri registracii v sisteme. Sleduyushchij fajl - .logout. On vypolnyaetsya, kogda vy vyhodite iz sistemy. Naprimer, vy mozhete primenit' ego dlya pechati uchetnoj informa- cii, takoj kak vremya, v techenie kotorogo vy rabotali v sisteme, ispol'zuemyj vami razmer diskovogo prostranstva i t.d. System V ne imeet podobnogo fajla. Sleduyushchij fajl - .msgsrc, prednaznachennyj dlya komandy msgs(1) sistemy Berkeley. Fajl .msgsrc soderzhit poslednij, prochitannyj vami fajl soobshchenij. Fajly soobshchenij hranyatsya v vide posledovatel'no pronu- merovannyh fajlov v kataloge /usr/msgs.

    TRYUKI S GLAVNYMI FAJLAMI

Vot programmy i fajly, kotorye vy mozhete razrabotat' vo vremya ispol'zovaniya dannoj knigi. Fajl .lastlog soderzhit daty kazhdogo vhozh- deniya v sistemu s vashimi uchetnymi dannymi. Programma, kotoraya upravlya- et etim fajlom, nazyvaetsya lastlog i predstavlena v glave 5. Sleduyushchij fajl - .trashcan. |to katalog, kotoryj vremenno hranit fajly, udalennye vami. Esli vy uvereny, chto oni vam ne nuzhny, to ih mozhno udalit' navsegda. |ta osobennost' rassmotrena v glave 3. Poslednij fajl - .phone.list. |to vasha lichnaya baza dannyh so spiskom telefonov. Ona obsluzhivaetsya komandoj phone (sm. glavu 5).

    KATALOGI

Pervym katalogom yavlyaetsya adm. On soderzhit administrativnye faj- ly, kotorye vy mozhete imet', naprimer raspisaniya, informaciyu o sotrud- nikah, vstrechah i t.d. V kataloge bbs imeyutsya podkatalogi dlya kazhdoj "doski ob座avlenij", kotoruyu vy vyzyvaete. Kogda vy obrashchaetes' k etim sistemam, vy imeete mesto dlya razmeshcheniya vseh sootvetstvuyushchih fajlov i dannyh. Neobhodimaya vam informaciya - eto menyu dlya sistemy, vspomogatel'nyj tekst, zagruzki programm i obshchaya informaciya, kotoraya vas interesuet. Katalog bin soderzhit vse instrumental'nye sredstva, kotorye u vas est'. |to mogut byt' komandnye fajly ili ob容ktnye moduli otkompiliro- vannyh programm. Podkatalog src ne obyazatelen. V nem hranitsya ishodnyj kod na yazyke Si dlya ob容ktnyh modulej, imeyushchihsya v bin, tak chto ishod- nyj tekst dlya bystroj fiksacii oshibok i izmeneniya vsegda pod rukoj. Katalog doc - eto koren' vseh vidov dokumentacii. Podkatalogami zdes' mogut byt' formy, pis'ma, zapiski, raznoobraznaya informaciya i otchety. Kazhdyj podkatalog soderzhit opredelennye fajly v etih oblastyah. Katalog etc soderzhit lyubye sistemnye ili administrativnye komandy i fajly, kotorymi vy pol'zuetes'. Esli vy imeete administrativnye obya- zannosti, tipichnym soderzhimym etogo kataloga mozhet byt' rezervnaya ko- piya tekushchih konfiguracionnyh fajlov, ispol'zuemyh sistemoj. Vy mozhete sdelat' rezervnuyu kopiyu fajlov /.profile /etc/bcheckrc brc checklist gettydefs group inittab motd mountable unmountable passwd profile rc /usr/lib/crontab /usr/lib/uucp/L.sys USERFILE uudemon.day uudemon.hr uudemon.wk ili lyuboj drugoj informacii o sisteme. Katalog proj prednaznachen dlya special'nyh proektov, kotorye u vas est'. Skoree vsego, vy nazovete etot katalog ne proj, a po imeni pro- ekta, naprimer, dev dlya razrabotki (development) ili qa dlya chistovoj shlifovki (quality assurance). Vse dannye, korrespondenciya, dokumenta- ciya i ishodnyj kod dlya kazhdoj raboty napravlyayutsya v glavnyj katalog proekta. Konechno, u vas mozhet byt' bolee odnogo kataloga proekta. Sleduyushchij katalog - mail. |to horoshee mesto dlya razmeshcheniya vashej pochtovoj korrespondencii ot drugih lyudej, ispol'zuyushchih sistemu. Imena fajlov v etom kataloge yavlyayutsya pol'zovatel'skimi. Naprimer, esli by ya poluchil pochtu ot Boba, to ona nahodilas' by v fajle s imenem bob. Katalog src - dlya vsego ishodnogo koda. Logicheski sgruppirujte vash ishodnyj kod po podkatalogam, chtoby oblegchit' ego poisk v budushchem. Vozmozhnymi podkatalogami yavlyayutsya asm dlya assemblernogo koda, c dlya ishodnogo koda na Si, games (igry), misc (raznoe), script dlya komand- nyh fajlov i sys dlya lyubogo ishodnogo koda, otnosyashchegosya k sisteme. (Esli vy derzhite ishodnye teksty vashih lichnyh instrumentov v kataloge /bin/src, to zdes' vy, vozmozhno, produbliruete ih.) Katalog sys - eto sklad informacii, imeyushchej otnoshenie k sisteme. Zdes' mogut byt' rezervnye kopii kriticheskih sistemnyh fajlov, doku- mentaciya po oblastyam sistemy, kuski vyvodimoj informacii komand who, ps, uucp, registracionnyh fajlov ili chto-libo inoe. Poslednij katalog - tmp, kotoryj yavlyaetsya rabochej oblast'yu dlya razmeshcheniya vremennyh fajlov. V osnovnom vse, chto nahoditsya v tmp, vy mozhete v lyuboe vremya udalit', i sredstvo can, opisannoe v glave 3, po- mogaet vam v etom. Otmetim, chto registracionnyj katalog imeet minimal'noe kolichestvo obychnyh fajlov. |to umen'shaet putanicu, kotoraya mozhet proishodit' s ploskimi fajlovymi sistemami. Kazhdyj fajl dolzhen byt' na svoem meste, no mozhet byt' razmeshchen ne tol'ko zdes'. Esli voznikaet kakoj-libo rod zadach, kogda fajly, svyazannye s etoj zadachej, mogut byt' pereputany s drugimi fajlami, sozdajte otdel'nyj katalog.

    ANALIZ PRIMERA FAJLA NASTROJKI SISTEMY

Fajl .profile, kak sleduet iz ego nazvaniya (profilirovanie - for- mirovanie kontura, ochertanij), funkcioniruet dlya ustanovki i iniciali- zacii parametrov sistemy, kotorye vam nuzhny. Syuda vhodit ustanovka terminalov, opredelenie peremennyh, zapusk programm i konfigurirovanie ispolnyayushchej sistemy. Primer fajla nastrojki mozhno najti v opisanii ko- mandy profile(4). Rassmotrim .profile, ispol'zuemyj avtorom. My vklyu- chili ego na stol' rannej stadii, chtoby predlozhit' vam kosnut'sya ponya- tij, kotorye bolee podrobno raskryvayutsya dalee v etoj knige. Ne za- bot'tes' o ponimanii raboty kazhdoj chasti primera. Poka chto prosto sde- lajte myslennuyu otmetku vozmozhnostej. Vash .profile mozhet byt' proshche i pochti navernyaka budet drugim. 1 # @(#).profile v1.0 Defines "home" on the system Author: Russ Sage 3 CHOICE="ushort" 4 case $CHOICE in 5 ufull) PS1="`uuname -l`> ";; 6 ushort) PS1="`uuname -l|cut -c1-3`> ";; 7 graphic) PS1="^[[12mj^[[10m ";; 8 esac 10 LOGNAME=`logname` 11 HOME=`grep "^$LOGNAME:" /etc/passwd | cut -d: -f6` 12 MAIL=/usr/spool/mail/$LOGNAME 13 export LOGNAME HOME MAIL 15 HA=$HOME/adm 16 HBB=$HOME/bbs 17 HB=$HOME/bin 18 HD=$HOME/doc 19 HE=$HOME/etc 20 HM=$HOME/mail 21 HP=$HOME/proj 22 HSR=$HOME/src 23 HSY=$HOME/sys 24 HT=$HOME/tmp 25 HDIRS="HA HBB HB HD HE HM HP HSR HSY HT" 26 export $HDIRS HDIRS 28 P=/usr/spool/uucppublic/$LOGNAME; export P 30 CDPATH=.:..:$HOME:$HDIRS 31 PATH=.:/bin/:/usr/bin:/etc:$HOME/bin 32 SHELL=`grep "^$LOGNAME:" /etc/passwd|cut -d: -f7` 33 export CDPATH PATH SHELL 35 case "`basename \`tty\``" in 36 console) eval `tset -m ansi:ansi -m :\?ansi -r -s -Q`;; 37 tty00) eval `tset -m ansi:ansi -m :\?ansi -r -s -Q`;; 38 tty01) eval `tset -m ansi:ansi -m :\?ansi -r -s -Q`;; 38 esac 41 echo TERM = $TERM 42 TERMCAP=/etc/termcap 43 export TERM TERMCAP 45 HZ=20 46 TZ=PST8PDT 47 export HZ TZ 49 umask 0022 51 echo "\nTime of this login : `date`" 52 lastlog -l 54 RED="^[[31m" 55 GREEN="^[[32m" 56 YELLOW="^[[33m" 57 BLUE="^[[34m" 58 CYAN="^[[35m" 60 case "`date|cut -d' ' -f1`" in 61 Mon) echo "$RED";; 62 Tue) echo "$GREEN";; 63 Wed) echo "$YELLOW";; 64 Thu) echo "$BLUE";; 65 Fri) echo "$CYAN";; 66 esac

    KAK RABOTAET .profile

Kogda vy vhodite v sistemu, registracionnaya programma vypolnyaet interpretator shell s parametrom '-' (naprimer, -sh). |to signaliziru- et interpretatoru shell, chto sejchas moment registracii i chto dolzhen byt' vypolnen fajl nastrojki. Snachala vypolnyaetsya /etc/profile - obshchij fajl nastrojki, ustanovlennyj sistemnym administratorom dlya vseh pol'- zovatelej, a zatem fajl .profile pol'zovatelya. Kazhdyj interpretator shell posle etogo bol'she ne zapuskaet eti ustanovochnye programmy. V fajle /etc/ profile interesno proverit' mashinno-zavisimuyu informaciyu i posmotret', kakie umolchaniya byli dlya vas ustanovleny. Esli vy hotite vypolnit' vash .profile v lyuboj moment posle vhoda v sistemu, naberite ". .profile" (mozhno pisat' i ".profile", provereno, chto obe formy ra- botayut - Prim. perevodchika). Dlya podderzhki vashego registracionnogo kataloga, ispol'zujte pere- mennye komandnogo processora (peremennye shell), chtoby oblegchit' pe- redvizhenie i sokratit' kolichestvo nazhatij klavish pri rabote s marshrut- nymi imenami. Peremennye shell vsegda yavlyayutsya strokami i, buduchi odin raz opredelennymi, ne ischezayut, poka vy ne vyjdete iz sistemy. Pri ispol'zovanii peremennye shell yavlyayutsya lokal'nymi dlya rabo- tayushchego v dannyj moment interpretatora shell. Ih mozhno peredat' in- terpretatoram shell bolee glubokogo urovnya putem ih "eksportirovaniya". Sledovatel'no, esli vy sozdaete novyj komandnyj processor, vse vashi eksportirovannye peremennye budut po-prezhnemu opredeleny dlya etogo in- terpretatora shell. Ischerpyvayushchij spisok peremennyh shell, ustanovlen- nyh po umolchaniyu i ispol'zuemyh sistemoj, sm. v prilozhenii 1. Otmetim, chto v nashem primere fajla nastrojki dlya kazhdogo podkata- loga pervogo urovnya, kotoryj est' v nashem registracionnom kataloge, my takzhe imeem peremennye shell, svyazannye s imenem etogo podkataloga. Takim obrazom, my mozhem legko obrashchat'sya k razlichnym oblastyam nashego registracionnogo kataloga.

    POSTROCHNYJ RAZBOR PRIMERA FAJLA NASTROJKI

Stroki 3-8 delayut hitruyu ustanovku glavnoj podskazki - peremennoj PS1. V stroke 3 inicializiruetsya peremennaya, kotoraya vybiraet podskaz- ku. Znachenie ushort zhestko zakodirovano v fajle, no vy vsegda mozhete zaprosit' ego ili ustanovit' ego v zavisimosti ot fajla. Pervoj al'ternativoj yavlyaetsya ufull, ispol'zuemaya dlya ustanovki podskazki v vide polnogo imeni uzla uucp v lokal'noj sisteme. Vy vybi- raete takuyu podskazku, esli ispol'zuete neskol'ko mashin i dlya dostupa k odnoj mashine primenyaete druguyu. Otlichitel'naya podskazka napominaet vam, kakoj mashinoj vy pol'zuetes'. Otmetim, chto podskazka imeet odina- kovoe chislo simvolov i dlya korotkoj stroki, i dlya dlinnoj. Esli zhe vam nuzhno imya uzla uucp, no ne nuzhna dlinnaya stroka dlya podskazki, vy mo- zhete vybrat' ushort, chto daet pervye tri simvola imeni uzla. Kak poka- zano v stroke 6, imya poluchaetsya primeneniem komandy uuname dlya poluche- niya lokal'nogo imeni uzla (opciya -l). Zatem eto imya propuskaetsya cherez komandu cut, kotoraya vyrezaet simvoly s pervogo po tretij. Rezul'tat prisvaivaetsya peremennoj podskazki. Poslednyaya al'ternativa dlya teh iz vas, kto imeet graficheskie sim- voly. Naznachenie v stroke 7 est' grecheskij simvol. Ego mozhno poluchit' primeneniem special'nyh upravlyayushchih posledovatel'nostej, kotorye uka- zyvayut terminalam otobrazhenie special'nyh simvolov. Simvoly ^[ yavlya- yutsya vizual'nym predstavleniem upravlyayushchego simvola v programme vi. Vy mozhete poluchit' etot simvol v programme vi, nabrav control-v, a zatem ESC. Posledovatel'nost' ESC[12m oznachaet, chto sleduyushchij simvol budet napechatan kak graficheskij. Simvol j yavlyaetsya vashej podskazkoj i prev- rashchaetsya v graficheskij simvol, kotoryj vydaetsya na vash ekran. Ispol'- zuya razlichnye simvoly alfavita, vy mozhete imet' v vide vashej podskazki pochti lyuboj graficheskij simvol. ESC[10m vozvrashchaet vash terminal v re- zhim obychnogo teksta, tak chto vse simvoly, pechataemye posle togo, kak vy nabrali ESC[10m, yavlyayutsya normal'nymi. Esli vy hotite sohranit' vashu pol'zovatel'skuyu podskazku dlya vseh podchinennyh interpretatorov shell, eksportirujte ee. Inache vy poluchite $ dlya vseh interpretatorov shell nizhnego urovnya. Stroka 10 prisvaivaet peremennoj LOGNAME vyhod komandy logname(1). Komanda logname - eto obychnaya komanda sistemy UNIX, koto- raya pechataet vashe registracionnoe imya iz fajla /etc/passwd. Obychno eta peremennaya ustanovlena dlya vas sistemoj, no dannyj primer pokazyvaet, kak vy mozhete ustanovit' ee vruchnuyu. Stroka 11 inicializiruet peremennuyu HOME. Ona tozhe ustanavliva- etsya dlya vas sistemoj, no my hotim pokazat', kak delat' eti veshchi osoz- nanno, a ne po umolchaniyu. Snachala my ishchem v fajle parolej zapis', sootvetstvuyushchuyu peremennoj LOGNAME. My ishchem ot nachala stroki imya, ko- toroe zavershaetsya simvolom :, chtoby ubedit'sya, chto najdeno tol'ko kor- rektnoe sootvetstvie imeni pol'zovatelya. Zatem vsya zapis' posylaetsya komande cut, kotoraya vyrezaet shestoe pole - registracionnyj katalog. Preimushchestvo takoj strategii v tom, chto registracionnyj katalog avto- maticheski menyaetsya, esli menyaetsya zapis' v fajle /etc/passwd. Stroka 12 inicializiruet peremennuyu MAIL. Opredelyaya MAIL, vy uka- zyvaete, chto vy dolzhny byt' uvedomleny o posylke vam novoj pochty, esli vy nahodites' v rezhime on line. Stroka 13 eksportiruet eti peremennye, tak chto oni dostupny nam v porozhdennyh interpretatorah shell. Stroki 15-24 opredelyayut vse katalogi pervogo urovnya v nashem re- gistracionnom kataloge. Bol'shinstvo imen sostoyat iz dvuh bukv, nekoto- rye iz treh. Teper' my mozhem primenyat' komandy takogo vida: $ cd $HD $ ls -R $HSR $ cu -ltty00 dir | tee $HBB/board/session$$ Stroka 25 prisvaivaet peremennoj HDIRS vse imena katalogovyh pe- remennyh, chto oblegchaet podklyuchenie vseh katalogov bez povtornogo vvo- da ih imen. My mozhem prosmotret' vse katalogi i napechatat' razmer ispol'zuemogo diskovogo prostranstva: $ for DIR in $HDIRS > do > echo "disk usage for $DIR: `du -s $DIR`" > done Stroka 26 eksportiruet peremennye tak, chtoby my mogli vsegda ih ispol'zovat'. Otmetim, chto my eksportirovali $HDIRS i HDIRS. Pered tem, kak vypolnit' eksportirovanie, $HDIRS bylo rasprostraneno na vse razlichnye imena peremennyh. Sledovatel'no, fakticheski my eksportirova- li vse imena plyus samu peremennuyu HDIRS. Stroka 28 inicializiruet P tak, chtoby eto byl vash katalog v PUBDIR, to est' /usr/spool/uucppublic. Teper' u nas est' prostoj sposob ssylat'sya na nashi fajly pri rabote s komandoj uucp. Stroka 30 ustanavlivaet CDPATH. |to put', kotoryj proveryaetsya, kogda vy vypolnyaete komandu cd. Snachala proveryaetsya tekushchij katalog (.) na predmet togo, est' li v nem imya kataloga, v kotoryj vy hotite popast'. Zatem proveryaetsya .. (roditel'skij katalog). Posle etogo prosmatrivaetsya vash registracionnyj katalog. Poslednim naznacheniem CDPATH yavlyaetsya $HDIRS, chto podklyuchaet imena vseh podkatalogov. Cel' etih imen - pozvolit' komande cd iskat' v sootvetstvuyushchem kataloge vvedennoe vami imya. Naprimer, esli by vy byli v /etc i nabrali "cd doc", vy by popali v $HOME/doc, poskol'ku CDPATH soderzhalo v sebe $HOME. Analogichno, esli by vy imeli podkatalog $HOME/doc/status i vveli "cd status" otkuda-li- bo iz drugogo mesta v sisteme, vy by prishli v $HOME/doc/status, tak kak koren' $HOME/doc byl v CDPATH. Poryadok poiska v katalogah takoj zhe, kak ob座avleno v peremennoj CDPATH. Esli vy vvodite imya kataloga, kotoroe vstrechaetsya bolee chem v odnom meste, vy popadaete v pervyj katalog, obnaruzhennyj pri posledo- vatel'nom poiske. Naprimer, esli by vy skazali "cd sys", to popali by v $HOME/sys prezhde, chem v $HOME/ src/sys. V tabl. 1-1 priveden primer ekvivalentnyh komand cd, predstavlen- nyh v treh razlichnyh formah, kotorye ponimaet UNIX. To, kakuyu formu vy ispol'zuete, zavisit ot togo, chto schitaetsya naibolee udobnym i trebuet kak mozhno men'she nazhatij klavish. Tablica 1-1 Tri sposoba ispol'zovaniya komandy cd ------------------------------------------------------------- Absolyutnyj CDPATH Otnositel'no peremennoj ------------------------------------------------------------- cd /usr/russ cd cd $HOME cd /usr/russ/src/asm cd asm cd $HSR/asm cd /usr/russ/doc/paper/conf cd paper/conf cd $HD/paper/conf cd /usr/russ/tmp cd tmp cd $HT ------------------------------------------------------------- Stroka 31 inicializiruet peremennuyu PATH. PATH rabotaet takim zhe obrazom, kak CDPATH. Ona ishchet programmy, kotorye nuzhno zapustit', v kazhdom kataloge, ukazannom v peremennoj PATH. Esli imya ne najdeno ni v odnom iz etih katalogov, pechataetsya soobshchenie ": not found" (": ne najdeno"). Poskol'ku my mozhem ustanovit' nash PATH kak ugodno, mozhno ukazat' vse tainstvennye mesta v sisteme, v kotoryh raspolozheny ispolnyaemye moduli. Kogda my hotim ih vypolnit', my ne obyazany ih iskat' i nabi- rat' polnoe marshrutnoe imya. CHtoby dopolnit' PATH, vvedite, naprimer, sleduyushchee: PATH=$PATH:/usr/lib/uucp Komanda paths, predstavlennaya dalee v etoj knige, ispol'zuet $PATH, chtoby soobshchit' nam, v kakom kataloge razmeshchen ispolnyaemyj mo- dul'. Stroka 32 inicializiruet peremennuyu SHELL. |tu peremennuyu mogut ispol'zovat' ne bolee chem odna ili dve utility. Obychno ona ustanavli- vaetsya sistemoj, kogda vy registriruetes'. Stroka 33 eksportiruet pe- remennye CDPATH, PATH i SHELL. Stroki 35-39 - eto hitryj sposob ustanovki opredelenij termina- lov. Stroka 35 nachinaetsya so spryatannoj komandy tty, zaklyuchennoj v znaki udareniya (`...`). Vyhodom komandy tty yavlyaetsya "/dev/tty00". Za- tem my berem osnovnoe imya etoj stroki, t.e. "tty00". Dalee my ispol'- zuem strukturu pereklyuchatelya po etomu znacheniyu, chtoby uvidet', chto my hotim sdelat' dlya kazhdogo konkretnogo terminala. Komandy tset, poka- zannye zdes', otnosyatsya k srede XENIX i mogut byt' nepriemlemymi v va- shej srede. Stroka 41 delaet eho-otobrazhenie znacheniya TERM na ekran, chtoby soobshchit' vam tip vashego terminala, esli on vam nuzhen. |to znachenie dostupno, esli opisannaya ranee komanda tset ustanavlivaet dlya vas TERM kak chast' svoej obychnoj raboty. V stroke 42 ustanavlivaetsya peremennaya TERMCAP, ukazyvayushchaya na /etc/termcap. |to obychnyj sposob ustanovki peremennoj TERMCAP. Drugoj sposob - prisvoit' TERMCAP tekushchuyu zakodirovannuyu stroku, kotoraya na- hoditsya v fajle opisaniya terminala. Esli TERMCAP ustanovlen na zakodi- rovannuyu stroku, to utilite vi net neobhodimosti obrashchat'sya k fajlovo- mu vvodu-vyvodu, chtoby poluchit' harakteristiki vashego terminala. Stro- ka 43 eksportiruet eti znacheniya tak, chtoby oni byli dostupny na lyubom urovne interpretatora shell. Stroka 45 ustanavlivaet chastotnuyu peremennuyu. |to peremennaya iz XENIX i, vozmozhno, imeetsya v System V. Ona ispol'zuetsya dlya ustanovki informacii o vremeni. Stroka 46 ustanavlivaet informaciyu o zone vremeni, kak eto trebu- etsya v bibliotechnom vyzove ctime(3). Imeya peremennuyu TZ, vy mozhete pe- rekryt' podrazumevaemuyu zonu vremeni pri dostupe ko vremeni iz prog- rammy na yazyke Si. Stroka 47 eksportiruet eti peremennye. Stroka 49 ustanavlivaet vashe znachenie maski pol'zovatelya (umask). Ona upravlyaet podrazumevaemym razresheniem dostupa dlya vseh fajlov, ko- torye vy sozdaete. Sistema vychitaet znachenie umask iz 777. Rezul'tat stanovitsya pravom dostupa k fajlu, v dannom sluchae 755. Kogda vy soz- daete katalog s pravom dostupa 755, etot katalog pokazyvaetsya komandoj "ls -l" kak rwxr-xr-x. Kogda vy sozdaete nekatalogovyj fajl s pravom dostupa 755, etot fajl pokazyvaetsya kak rw-r--r--, chto ekvivalentno 644. Nekatalogovye fajly ne imeyut bita x, poetomu ih nel'zya ispolnit'. Katalogam zhe nuzhen ustanovlennyj bit x, chtoby oni byli dostupny po ko- mande cd. Stroki 51 i 52 soobshchayut vam o vremeni vashego seansa raboty v sisteme. Stroka 51 soobshchaet vam tekushchee vremya vashego vhoda v sistemu, a stroka 52 vyzyvaet programmu lastlog, kotoraya pechataet datu vashej poslednej registracii v sisteme. Programma lastlog opisana v glave 5. Stroki 54-58 inicializiruyut peremennye, generiruyushchie cveta na cvetnom monitore. Upravlyayushchie znacheniya yavlyayutsya standartnymi znacheniya- mi kodov ANSI. |to rabotaet v sisteme XENIX i mozhet rabotat' v vashej sisteme. Rastrovaya grafika ne dostupna, no imeetsya simvol'naya grafika i razlichnye osnovnye (foreground) i fonovye (background) cveta. Osnov- nye cveta kodiruyutsya chislami, nachinaya s 30, a fonovye cveta - chislami s 40. Stroki 60-66 - prosto dlya zabavy. Oni predstavlyayut soboj hitryj sposob ustanavlivat' kazhdyj den' na ekrane razlichnye cveta. Stroka 60 nachinaetsya s zapuska komandy date i peredachi ee vyhoda po konvejeru komande cut. Vyrezaetsya pervoe pole, kotoroe yavlyaetsya dnem nedeli. Za- tem my sozdaem strukturu pereklyuchatelya po stroke dnya, vypolnyaya razlich- nye dejstviya dlya kazhdogo dnya. Blagodarya eho-otobrazheniyu upravlyayushchih posledovatel'nostej, monitor reagiruet nemedlenno.

    TEORIYA OTNOSITELXNOSTI VNUTRI SISTEMY UNIX

Teper', kogda my oznakomilis' s "domashnej" sredoj, sleduyushchij shag - obratit'sya k sredam, nahodyashchimsya vne registracionnogo kataloga ($HOME). Naprimer, chto predstavlyayut soboj drugie katalogi na tom zhe urovne, chto vash $HOME ? Kto eshche rabotaet v sisteme? Kak poproshche polu- chit' dostup k ih katalogam? Mozhete li vy zapuskat' programmy v chuzhih katalogah? Takogo roda voprosy i dejstviya otnosyatsya k drugim lyudyam v vashej sisteme. Edinstvennyj sposob otvetit' na eti voprosy - posmotret' vokrug sebya. Nikto ne sobiraetsya rasskazyvat' vam, chto takoe sistema. Vy dolzhny sami issledovat' ee i vyyasnit', kuda vy mozhete hodit', a kuda net. Sistema konechna, tak chto vy mozhete sebe pomoch', delaya raspechatki vseh katalogov i fajlov. Vy mozhete manevrirovat' v sisteme UNIX, ispol'zuya otnositel'nuyu notaciyu. Poskol'ku sistemnoe derevo obrazovano iz katalogov, oboznache- niya . i .. pozvolyayut nam dvigat'sya vverh i vniz po derevu. V lyuboj tochke .. oznachaet roditel'skij katalog tekushchego kataloga, v kotorom my nahodimsya. Nizhe pokazany nekotorye primery otnositel'nyh komand. ls -l $HOME/.. perechislyaet fajly v moem roditel'skom kataloge. cd ../../.. v predpolozhenii, chto tekushchim katalogom yavlyaetsya /usr/russ/src/c, delaet moim tekushchim katalogom /usr. ls . perechislyaet fajly v tekushchem kataloge. ls .. perechislyaet fajly v moem roditel'skom kataloge. $HOME/../../bin/ls zapuskaet ls v kataloge /usr/russ/../../bin, t.e. v /bin/ls. ../fred/bin/ls zapuskaet komandu ls v kataloge dvoichnyh modulej Freda, kotoryj imeet tot zhe roditel'skij katalog, chto i ya, t.e. /usr/fred/bin/ls.

    OBSHCHAYA SISTEMNAYA SREDA

Sistemnaya sreda ne prosto NAHODITSYA v sisteme UNIX, a YAVLYAETSYA sistemoj UNIX. Kak my uvidim v etoj knige, vsya sistema - UNIX, Si, ko- mandy, fajly i t.d. - eto prosto logicheskij podhod k funkcionirovaniyu komp'yutera. Programmnoe obespechenie - eto to, chto opredelyaet sistema dlya konechnogo pol'zovatelya. My mozhem predstavlyat' vse mashiny, rabotayu- shchie v sisteme UNIX, kak odinakovye i traktovat' kazhdyj UNIX kak odin i tot zhe. My predpolagaem, chto reakciya mashiny budet kazhdyj raz odinako- voj. My mozhem smotret' na UNIX takim zhe obrazom, kak na fizicheskie za- kony. My ogranicheny imi, no my takzhe vol'ny primenyat' eti zakony v si- tuaciyah i oblastyah, s kotorymi my do etogo nikogda ne vstrechalis'. My mozhem doveryat' etim zakonam i dopuskat', chto oni primenimy vezde, kuda by my ni napravilis'. Takova sistema UNIX, po krajnej mere v ideale. Sistema imeet mnogo sred. Vazhno ponimat', chto oni soboj predstav- lyayut, kak vzaimodejstvuyut i dlya chego mogut byt' ispol'zovany. Tak zhe, kak programmy = struktury dannyh + algoritmy tak i UNIX = fajlovoe derevo + utility Sreda UNIX - eto sochetanie dvuh vazhnejshih veshchej: fajlovogo dereva i interfejsa sistemnyh vyzovov. |to derevo dopuskaet beskonechnoe rasshirenie vozmozhnostej, pozvolyaya montirovat' vneshnie diskovye oblasti v lyuboj tochke fajlovoj sistemy. Derevo pomogaet takzhe v sbore logi- cheski svyazannyh fajlov, chto delaet sistemu bolee organizovannoj. Interfejs sistemnyh vyzovov obespechivaet nabor instrumentov, iz kotoryh mozhno postroit' bol'shinstvo drugih funkcij. Opredelenie inter- fejsa System V imeetsya v vide tipografskoj knigi i mozhet byt' najdeno v knizhnyh magazinah. Strogoe sledovanie etomu standartu garantiruet sovmestimost' s postoyanno razvivayushchejsya AT&T System V.

    OBSHCHEE FAJLOVOE DEREVO

Dlya togo chtoby luchshe ponyat' mir UNIX, posmotrite primer raspechat- ki struktury UNIX na ris.1-3 . |to naglyadnoe predstavlenie polnogo de- reva kornevoj fajlovoj sistemy. Lyubye drugie rasshireniya fajlovoj sistemy montiruyutsya na etu fajlovuyu sistemu. Tochkoj vremennogo montirovaniya yavlyaetsya /mnt. Bolee postoyannye tochki montirovaniya dolzhny byt' sozdany administratorom, naprimer /0, /1 i t.d. ili /usr1, /usr2 i t.d.

    PERVYJ SLOJ

Samym levym katalogom yavlyaetsya /bin, kotoryj soderzhit vse glavnye dvoichnye utility. |to naibol'shij iz dvuh osnovnyh katalogov dvoichnyh modulej. Sleduyushchij katalog - /dev, v kotorom razmeshcheny vse fajly ust- rojstv. Fajly ustrojstv yavlyayutsya tochkami dostupa k periferii, podsoe- dinennoj k sisteme. |tot fajl privyazan k periferii s pomoshch'yu yadra i drajvera ustrojstva. Administrativnye utility i konfiguracionnye fajly hranyatsya v /etc. Primerami yavlyayutsya getty i gettydef, init i inittab, a takzhe fajl parolej (/etc/passwd). Sleduyushchij katalog - /lib, gde razmeshcheny biblioteki kompilyatora. Zdes' mogut hranit'sya i drugie tipy bibliotek. Katalog /lost+found ispol'zuetsya utilitoj fsck (glavnoe sredstvo podderzhaniya fajlovoj sistemy) dlya hraneniya logicheski udalennyh fajlov. Esli na samom dele vy hotite sohranit' eti fajly, oni mogut byt' izv- lecheny iz etoj uderzhivayushchej oblasti posle zaversheniya uborki fajlovoj sistemy. Sleduyushchij katalog - /mnt. |to vremennaya tochka montirovaniya dlya fajlovyh sistem. My chasto montiruem i demontiruem fajlovye sistemy prosto dlya togo, chtoby zapustit' bystruyu proverku chego-libo. Zdes' pod- hodyashchee mesto dlya etogo. Glavnym vremennym rabochim katalogom sistemy yavlyaetsya /tmp. Mnogie utility, takie kak vi, fsck, interpretatory shell i programmy rezerv- nogo kopirovaniya, ispol'zuyut /tmp dlya hraneniya rabochih fajlov. Sleduyushchij katalog - /usr, kotoryj primenyaetsya kak tochka montiro- vaniya. Fajlovaya sistema, smontirovannaya zdes', soderzhit dopolnitel'nuyu sistemnuyu informaciyu i katalogi pol'zovatelej. |to razdelenie mezhdu zagruzhaemoj fajlovoj sistemoj i pol'zovatel'skoj fajlovoj sistemoj by- lo sdelano, chtoby sbalansirovat' zagruzku diska. Esli by vse vazhnye fajly byli v odnom razdele, on byl by slishkom bol'shim. Proizvoditel'- nost' mozhet byt' uhudshena, esli vse dejstviya napravleny v odnu logi- cheskuyu oblast' diska. Blagodarya razbivke vsej sistemy na dve, kazhdaya fajlovaya sistema podderzhivaet razumnoe kolichestvo svobodnogo prost- ranstva. CHut' nizhe my rassmotrim katalog /usr bolee podrobno. Poslednij fajl - eto samo yadro, /unix. Ves' /unix fakticheski su- shchestvuet i predstavlyaet soboj bol'shoj a.out (skompilirovannyj ob容kt- nyj fajl). YAdro izgotavlivaetsya putem zapuska ld na gruppe bibliotek, kotorye zagruzhayutsya po ocheredi v ogromnyj ispolnyaemyj modul', nazyvae- myj /unix. Mashina zapuskaetsya s pervyh 512 bajtov kornevoj fajlovoj sistemy. Programma nachal'noj zagruzki, kotoraya nahoditsya zdes', zagru- zhaet programmu zagruzki bol'shego razmera, inogda nazyvaemuyu /boot. /boot zagruzhaet i zapuskaet /unix.

    VTOROJ SLOJ

Vtoroj sloj katalogov razmeshchaetsya pod /usr. Kak upominalos' ra- nee, /usr ispol'zuetsya kak tochka montirovaniya dlya drugoj fajlovoj sistemy. |to znachit, chto vse fajly, kotorye imeyutsya v /usr, nahodyatsya v drugom razdele zagruzhaemogo diska ili voobshche na drugom diske. Pervym katalogom yavlyaetsya adm, dlya administrirovaniya. On soderzhit uchetnye fajly i registracionnyj fajl dlya su (super- pol'zovatelya), a takzhe drugie administrativnye fajly. V kataloge bin imeyutsya ispolnyaemye moduli, kotorye ispol'zuyutsya menee chasto, chem moduli v dvoichnom kataloge kornevogo urovnya (/bin). Pochti vse ispolnyaemye moduli raspredeleny mezhdu etimi dvumya kataloga- mi. Drugie ispolnyaemye moduli rasseyany po vsej sisteme, naprimer /usr/lib/uucp/uucico i /usr/lib/ ex3.7preserve. Dalee games. UNIX prihodit s assortimentom interesnyh igr. Bol'- shinstvo iz nih tekstovye, no predostavlyaetsya neskol'ko programm grafi- cheskogo tipa, naprimer worm, worms i rain. Katalog include soderzhit vse fajly-zagolovki. Fajly-zagolovki ispol'zuyutsya v programmah na yazyke Si dlya opredeleniya struktur i sistemnyh prisvaivanij, poleznyh dlya programmirovaniya. Zdes' imeetsya podkatalog sys, kotoryj soderzhit vse fajly= zagolovki, otnosyashchiesya k sisteme. CHitaya eti fajly-zagolovki, mozhno mnogoe uznat' o sisteme UNIX. Sleduyushchij katalog - lib, kotoryj soderzhit bibliotechnye fajly dlya vseh vidov "imushchestva": fajly pechatayushchih ustrojstv, fajly podderzhki utility vi, drugie yazyki i uucp. Katalog /usr/ lib predstavlyaetsya skladom vsyakih bibliotek, kotorye imeyutsya v sisteme, otlichnyh ot bib- liotek kompilyatora. Katalog lost+found nahoditsya zdes' dlya toj zhe celi, chto i odnoi- mennyj katalog kornevogo urovnya. Kazhdaya fajlovaya sistema dolzhna imet' takoj fajl. Bez nego fsck ne imeet vremennogo mesta dlya razmeshcheniya po- luudalennyh fajlov i poetomu udalyaet ih navsegda. V kataloge mail nahoditsya vash sistemnyj pochtovyj yashchik. Kogda vy zapuskaete komandu mail, zdes' nakaplivaetsya ochered' soobshchenij. V ka- taloge usr/mail kazhdyj fajl nosit imya pol'zovatelya. V etom fajle hra- nitsya pochta pol'zovatelya, poka on ne prochitaet ee. Katalog man prednaznachen dlya aktivnyh stranic rukovodstv po sisteme UNIX. Nalichie postoyannogo dostupa k stranicam rukovodstv yavlya- etsya horoshim sredstvom. Odnako, eti stranicy zanimayut mnogo mesta, i dostup k nim mozhet potrebovat' dovol'no mnogo vremeni pri sil'no zag- ruzhennoj sisteme. V kataloge news hranyatsya vse fajly novostej. |ti fajly imenovany v sootvetstvii s poryadkom, v kotorom oni byli vvedeny v katalog. Ko- manda news(1) smotrit na datu fajla $HOME/ .news_time, chtoby soobshchit', kakie novosti vy eshche ne chitali. Katalog preserve prednaznachen dlya fajlov, svyazannyh s utilitoj vi. Oni pomeshchayutsya syuda, kogda vy rabotaete s vi ili s redaktorom ex i propadaet pitanie mashiny libo vash seans raboty preryvaetsya v vide "za- visaniya". Kogda v sisteme vosstanavlivaetsya pitanie, /tmp soderzhit fajly redaktora ex. Iz kataloga /etc/rc zapuskaetsya utilita /usr/lib/ex3.7preserve, kotoraya prosmatrivaet /tmp, preobrazuet ego v sohranennyj fajl i pomeshchaet ego v /usr/preserve. Kogda vy vhodite v sistemu, vy poluchaete pochtu o tom, chto u vas imeetsya sohranennyj fajl redaktora, kotoryj vy mozhete vosstanovit' i pomestit' ego na ishodnoe mesto. Katalog pub ne soderzhit nichego osobennogo, obychno v nem prosto nekotorye informacionnye fajly vrode tablicy ASCII ili grecheskih sim- volov. Katalog spool - eto glavnaya tochka vhoda dlya vseh buferizovannyh fajlov v sisteme. V etom kataloge imeetsya mnogo podkatalogov, soderzha- shchih specificheskie tipy buferizovannyh fajlov. Nekotorymi tipichnymi podkatalogami yavlyayutsya lp, uucp i uucppublic. V kataloge src hranitsya ishodnyj kod sistemy UNIX, esli on ime- etsya v sisteme. Ot etogo kataloga otvetvlyaetsya mnogo urovnej: komandy, biblioteki, kod yadra, kod mashinnogo yazyka i avtonomnye utility. CHasto v /usr/src hranitsya takzhe ishodnyj kod dlya lokal'noj mashiny. Katalog sys tradicionno hranit fajly, neobhodimye dlya generacii novogo yadra. |to fajly-zagolovki, konfiguracionnyj fajl, biblioteki i komandnyj fajl dlya sozdaniya novogo yadra iz vseh etih fajlov. Poslednij katalog - tmp. |to vtorichnaya vremennaya oblast' hrane- niya, kotoraya ispol'zuetsya ne tak chasto, kak /tmp. Ee, odnako, ispol'- zuet utilita sort.

    ZHIZNX SISTEMY UNIX: NEKOTORYE METAFORY

UNIX - eto osobyj mir, zhivushchij svoej zhizn'yu. Ego social'naya struktura imitiruet real'nuyu zhizn', s pravitel'stvom, soderzhashchim pra- vitelya (koren' root), shtatom podderzhki (bin, cron, lp, sys) i massami (/usr/*). Massy ne imeyut dostupa k moshchi pravitelya, esli ne ispol'zuyut predvaritel'no ustanovlennyh sredstv (/bin/su) ili ne zanimayutsya kri- minal'nymi dejstviyami i narusheniem mer bezopasnosti. Kak i v lyubom ob- shchestve, bol'shaya mnogopol'zovatel'skaya sistema UNIX ustanavlivaet prava i obyazannosti svoih pol'zovatelej. Pri vhode v sistemu pol'zovatel' poluchaet svoe "mesto pod soln- cem" (registracionnyj katalog - $HOME ). |to mesto zavisit ot togo, chto bylo ran'she (ot roditel'skogo kataloga ..), a budushchie mesta za- visyat ot togo, chto proishodit pozzhe (katalogi, podchinennye $HOME). Rabota raspredelyaetsya po organizaciyam i ierarhiyam v zavisimosti ot ih funkcij v obshchestve (vse pol'zovateli v /usr, vse tranzitnye faj- ly v /usr/spool, vse funkcii bezopasnosti v /etc). Posmotrite vokrug sebya v vashej sisteme, chtoby oznakomit'sya s vashim mirom. Vy mozhete posle etogo vybrat', uchastvovat' li v nekotoroj chasti etogo mira ili ignorirovat' ee. Dvizhenie lyudej v sisteme UNIX proishodit parallel'no. Nekotorye oblasti (/tmp) dostupny vsem, a nekotorye oblasti sil'no ohranyayutsya ot bol'shinstva lyudej (/etc/passwd). Transportnaya sluzhba mozhet perevezti nashi veshchi (peredacha fajlov po setyam uucp). My dazhe mozhem vospol'zo- vat'sya obshchestvennym transportom, chtoby dobrat'sya v raznye chasti goroda (vhod v drugie sistemy (rlogin), eta osobennost' imeetsya tol'ko v BSD). V mire UNIX nam dostupny razlichnye puti. |ti puti pomogayut nam sformirovat' svoyu sud'bu (diskovye razdely, montirovannye v lyuboe mesto fajlovogo dereva). Kogda diskovyj paket montiruetsya, on stano- vitsya dostupnym nam. Kogda on demontiruetsya, my teryaem dostup k nemu. Kogda zapuskayutsya processy, oni prohodyat cherez razlichnye etapy svoej zhizni. Oni rozhdayutsya (otvetvlyayutsya), rastut (stanovyatsya planiru- emymi i pomeshchayutsya v tablicu processov) i, nakonec, stanovyatsya proiz- voditel'nymi rabochimi v obshchestve (perehodyat v sostoyanie zapuska i vy- polnyayutsya). Vse processy imeyut famil'noe derevo. Porozhdennyj process vsegda imeet roditelya, a roditel'skie processy mogut porozhdat' mnogo "detej". V zavisimosti ot prilozheniya, oni mogut byt' "dedami" i "vnukami". Pro- cessy "umirayut" tak zhe legko, kak sozdayutsya. Odnoj iz neobychnyh veshchej v mire UNIX yavlyaetsya to, chto "deti" pochti vsegda "umirayut" ran'she svo- ih "roditelej". Pravitel'stvo (yadro) provodit v zhizn' parametry sredy, kotorye vyglyadeli by v dovol'no totalitarnom duhe, esli by eto bylo v real'nom mire. Tol'ko opredelennoe chislo rabochih dopuskaetsya k rabochemu mestu odnovremenno (eto maksimal'noe kolichestvo yacheek v tablice processov). Rabochie ogranicheny v chisle "detej", kotoryh oni mogut imet' (maksi- mal'noe kolichestvo processov na pol'zovatelya). Poskol'ku rabochie na- kaplivayut material'nye cennosti, oni ogranicheny v kolichestve tovarov, kotorye oni mogut pomestit' v komnaty svoih domov (maksimal'nyj razmer fajla, ili ulimit). Hotya ne ustanovlen limit na chislo razlichnyh fajlov (komnat) maksimal'nogo razmera, kotorye mogut sushchestvovat', vsya siste- ma imeet predel (df pokazyvaet svobodnoe prostranstvo), i odna ne- nasytnaya persona mozhet nanesti udar po okruzhayushchim. Zdes' voznikaet svoego roda ekologiya. Tak zhe, kak komp'yuternyj vek prohodit pod prismotrom elektronnoj avtomatiki, tak i UNIX vedet tablicy o deyatel'nosti vseh pol'zovate- lej. Mehanizmy ucheta organizovany pravitel'stvom (vnutri yadra) i vseg- da zapisyvayut dejstviya kazhdogo pol'zovatelya. Tem ne menee, eto svobod- noe obshchestvo v toj mere, chto vy mozhete poluchit' raspechatku o vashem kreditnom sostoyanii (ispol'zuya acctcom dlya pechati uchetnyh zapisej). Hotya sistema UNIX imeet negativnye aspekty (kak i chelovecheskoe obshchestvo), v nej est' takzhe nekotorye ochen' pozitivnye osobennosti. Gibkost' sistemy i bogatstvo instrumentov daet nam ochen' produktivnuyu i detal'no razrabotannuyu rabochuyu sredu. Nasha proizvoditel'nost' v etom smysle ogranichena v osnovnom nashim sobstvennym voobrazheniem. Kogda ra- bota stanovitsya slishkom utomitel'noj i skuchnoj, my vsegda mozhem sozdat' sredstva, delayushchie za nas etu rabotu. |to obstanovka svobodnoj inicia- tivy, v kotoroj horoshie idei mogut dat' znachitel'noe uvelichenie proiz- voditel'nosti.

    * GLAVA 2. Dostup k fajlam *

SODERZHANIE Vvedenie 2.1. Poisk fajlov 2.1.1. tree - vizualizaciya fajlovogo dereva 2.1.2. thead - pechat' nachala kazhdogo fajla 2.1.3. tgrep - poisk strok v dereve fajlovoj sistemy 2.1.4. paths - nahozhdenie puti dostupa k ispolnyaemym fajlam, so special'nymi opciyami 2.2. Vyvod informacii 2.2.1. lc - vyvod fajlovoj informacii na ekran po stolbcam 2.2.2. ll - vyvod fajlovoj informacii v dlinnom formate 2.2.3. kind - vyvod odnotipnyh fajlov 2.2.4. m - prostoj dostup k komande more 2.2.5. mmm - obrabotka programmoj nroff makrokomand dlya rukopisej 2.2.6. pall - pechat' vseh fajlov v dereve

    VVEDENIE

V glave 1 byl predstavlen obzor obshchej struktury sistemy UNIX i pokazano, kak vzaimodejstvuyut ee razlichnye chasti. |to pohozhe na vvede- nie v geografiyu, kogda na globuse pokazyvayut kontinenty i krupnye vod- nye prostranstva. Takaya informaciya, hotya i yavlyaetsya horoshim fundamen- tom dlya obshchih znanij, vryad li pomozhet najti nailuchshij put' iz San-Francisko v Los-Anzheles. Neobhodim sleduyushchij uroven' detalizacii: nazvaniya poselenij, dorog, razvilok, ulic, adresov. Fajlovaya sistema UNIX pohozha na kontinent so mnozhestvom gorodov i, dejstvitel'no, s adresami vnutri gorodov. Katalogi i razlichnye urovni podkatalogov mozhno sravnit' s marshrutami mezhdu razlichnymi punk- tami naznacheniya, nazvaniya fajlov - s adresami. Bol'shoe chislo putej i mest naznacheniya mozhet vyglyadet' pugayushche, no blagodarya regulyarnosti i logichnosti, fajlovaya sistema UNIX pozvolyaet vam legko peremeshchat'sya iz odnogo mesta v drugoe, esli vy znaete neskol'ko osnovopolagayushchih principov. Buduchi pol'zovatelyami UNIX, vse my nauchilis' pol'zovat'sya osnov- nymi komandami fajlovoj informacii, kak, naprimer, ls s razlichnymi op- ciyami. My znaem, kak peremeshchat'sya mezhdu katalogami i kopirovat' ili peremeshchat' fajly. Tem ne menee, nahodit' nuzhnuyu informaciyu o fajlah iz vsej massy informacii ne tak-to legko. Nam neobhodimo sozdat' instru- mental'nye sredstva, kotorye ispol'zuyut drevovidnuyu strukturu fajlov v UNIX, chtoby nahodit' to, chto my ishchem, i, sootvetstvenno, vyvodit' in- formaciyu o fajlah na ekran, pechatat' listingi soderzhimogo fajlov i t.d. |ta glava znakomit s instrumental'nymi sredstvami, kotorye obleg- chayut zadachu poiska i dostupa k fajlam. Dostup k fajlam mozhet byt' obespechen razlichnymi sposobami, poetomu tehnika i stil' menyayutsya ot odnogo komandnogo fajla k drugomu. Naprimer, v nekotoryh sluchayah vam nuzhno najti imena vseh fajlov v dannom segmente fajlovogo dereva, v drugih sluchayah vas budut interesovat' fajly tol'ko zadannogo tipa: tekstovye fajly voobshche ili ishodnye fajly na yazyke Si v chastnosti.

    KOMBINIROVANIE PRODUKTIVNYH IDEJ

Dve koncepcii yavlyayutsya obshchimi pochti dlya vseh fajlovyh instrumen- tal'nyh sredstv. Pervaya - eto ideya rekursivnogo poiska, kotoraya ozna- chaet, chto nekotorye komandy sistemy UNIX (naprimer, find) prosmatriva- yut vse fajlovoe derevo, nachinaya s nekotoroj zadannoj nachal'noj tochki (ili s tekushchego kataloga). Esli v dannom kataloge vstrechaetsya podkata- log, to ego soderzhimoe tozhe issleduetsya - i tak dalee vniz k samomu nizhnemu pod-podkatalogu. Tak prohodyatsya marshruty ko vsem fajlam v ce- lom dereve. Standartnye komandy sistemy UNIX obespechivayut tol'ko ogranichennoe chislo osnovnyh funkcij, kotorye mogut rabotat' rekursivno po vsemu fajlovomu derevu. Nasha strategiya pri sozdanii instrumental'nyh sredstv v etoj glave - vospol'zovat'sya preimushchestvami takogo rekursivnogo po- iska i rasprostranit' ih na mnogie drugie funkcii. Vtoraya klyuchevaya ideya, svyazannaya s poleznymi fajlovymi instrumen- tal'nymi sredstvami - eto vozmozhnost' soedineniya komand s programmnymi kanalami i upravlenie potokom dannyh s pomoshch'yu pereadresacii. Veroyat- no, vy uzhe vstrechalis' s podobnymi osobennostyami v vashej sobstvennoj rabote s UNIX i effektivno ih ispol'zovali. Vozmozhno, vy eshche ne osoz- nali, chto soedinenie rekursivnogo poiska, predostavlyaemogo nekotorymi standartnymi komandami, so specificheskimi funkciyami, predostavlyaemymi drugimi komandami, pozvolyaet nam sozdat' komandy, kotorye avtomati- cheski obhodyat obshirnye fajlovye derev'ya i izvlekayut nuzhnuyu informaciyu. (V sleduyushchej glave my vyjdem za predely raspechatki i otobrazheniya in- formacii na ekran i nauchimsya rabotat' s fajlami tak, chto my smozhem ko- pirovat', peremeshchat' i vosstanavlivat' ih po mere nadobnosti.) Dlya udobstva my sgruppiruem instrumental'nye sredstva v dva raz- dela: poisk fajlov i raspechatka fajlovoj informacii. Imeet smysl predstavlyat' ih v takom poryadke, tak kak vy snachala dolzhny najti fajl, chtoby potom s nim rabotat'.

    POISK FAJLOV

|tot razdel posvyashchen poisku fajlov, gde by oni ni nahodilis', vy- vodu na ekran vybrannoj informacii i poisku simvol'nyh strok vnutri fajlov. Pervaya programma, tree, obhodit vse fajlovoe derevo i pechataet imena vseh fajlov v formate vizual'nogo dereva. Ona rekursivno spuska- etsya v kazhdyj katalog i nahodit vse ego fajly, obespechivaya tem samym global'nyj osmotr fajlovyh oblastej i ih vlozhennoj po glubine struktu- ry. Drugoe instrumental'noe sredstvo - eto thead. Thead pechataet neskol'ko pervyh strok tekstovyh fajlov, kotorye nahodyatsya v dannom segmente fajlovogo dereva. Prosmatrivaya zagolovok, t.e. pervye neskol'ko strok fajla, vy mozhete poluchit' dostatochno informacii, chtoby identificirovat' soderzhimoe fajla. Pri vyzove thead vy mozhete yavno za- dat' katalog libo peredat' komande thead po konvejeru spisok polnyh imen fajlov. |to delaet komandu thead fil'trom - osobym vidom komand sistemy UNIX, kotoryj my obsudim pozzhe. Sleduyushchee instrumental'noe sredstvo - tgrep. Kak sleduet iz naz- vaniya, eto eshche odna komanda, svyazannaya s fajlovym derevom, kotoraya ispol'zuet utilitu grep. Tgrep ishchet simvol'nye stroki v kazhdom fajle, kotoryj nahoditsya v dannom segmente fajlovogo dereva. Tgrep takzhe yav- lyaetsya fil'trom, tak chto imena fajlov mozhno peredavat' ej po konveje- ru. V nashem poslednem proekte v etom razdele my obratimsya k ispol'zo- vaniyu katalogov kak sredstva "navigacii". Snachala my opishem osnovnoj algoritm dlya utility, kotoraya dlya kazhdogo fajla iz zadannogo spiska fajlov proveryaet, nahoditsya li etot fajl v kakom-libo kataloge po uka- zannomu marshrutu poiska. Zatem my postroim paths - utilitu, kotoraya dopolnyaet funkciyu poiska poleznymi opciyami.

    RASPECHATKA FAJLOVOJ INFORMACII

|tot razdel znakomit vas s instrumental'nymi sredstvami, prednaz- nachennymi dlya vyvoda na ekran imen fajlov i ih soderzhimogo. Instrumen- ty takogo roda ves'ma polezny, tak kak oni mogut znachitel'no umen'shit' kolichestvo neobhodimyh simvolov, nabiraemyh s klaviatury pri zapuske komandy, i vnesti bol'she smysla v odnu komandu. Pervye dva komandnyh fajla yavlyayutsya pre- i postprocessorami dlya komandy ls. Komanda lc vyvodit fajlovuyu informaciyu po stolbcam, koman- da ll perechislyaet fajly v dlinnom formate. |ti komandnye fajly dopol- neny opciyami komandy ls, chtoby sdelat' raspechatki bolee informativny- mi. Tak kak komanda ls ispol'zuetsya dovol'no chasto, upakovka naibolee chasto primenyaemyh nazhatij klavish v komandnye fajly predstavlyaetsya ce- lesoobraznoj. Upakovka umen'shaet kolichestvo postoyanno nabiraemyh sim- volov i uproshchaet ispol'zovanie komand, isklyuchaet neobhodimost' zapomi- naniya podrobnogo sintaksisa. Tret'e instrumental'noe sredstvo - eto kind. Kind - eshche odin ko- mandnyj fajl preprocessornogo tipa, ispol'zuyushchij komandu UNIX file. Komanda file chitaet ukazannyj fajl i zatem soobshchaet, yavlyaetsya li etot fajl tekstovym, arhivnym ili ispolnyaemym. Poskol'ku raspechatki komandy file ne vybirayut fajly zadannogo tipa, voznikaet neobhodimost' v soz- danii dlya etogo special'noj utility. Komanda kind rabotaet s raspechat- koj komandy file. Kind vyvodit na ekran imena fajlov tol'ko zadannogo tipa. Eshche odin komandnyj fajl - m, kotoryj oblegchaet rabotu so stan- dartnoj komandoj more sistemy UNIX, umen'shaya kolichestvo neobhodimyh dlya zapuska komandy simvolov i uproshchaya interfejs. Delaetsya eto bez po- teri gibkosti: tak zhe, kak vy mozhete ispol'zovat' komandu more dlya fajla ili peredat' komande more dannye po programmnomu kanalu, vy mo- zhete sdelat' to zhe samoe dlya m. Sleduyushchij komandnyj fajl - eto mmm. On sostoit iz odnoj zagotov- lennoj komandnoj stroki dlya programmy nroff sistemy UNIX. Sushchestvuet mnogo sposobov vyzova komandy nroff i mnozhestvo razlichnyh opcij k nej. Esli zhe vy redko ispol'zuete nroff, u vas mogut vozniknut' trudnosti v zapominanii specificheskih opcij, neobhodimyh dlya vashej raboty s koman- doj. |ti problemy otpadut, esli u vas est' komanda mmm. Opredelite op- cii, kotorye vy obychno ispol'zuete, i vvedite ih v komandnyj fajl mmm (o tom, kak eto sdelat' prakticheski, rech' pojdet nizhe). Teper' dosta- tochno nabrat' mmm - i vy imeete vozmozhnost' rabotat' s vashej komandoj nroff. Poslednyaya utilita - pall. Pall obhodit fajlovoe derevo, vedya po- isk fajlov zadannogo tipa, i gotovit ih k vyvodu na printer. Komanda pr sistemy UNIX ispol'zuetsya dlya razbivki na stranicy vseh fajlov vmeste i vklyucheniya zagolovkov. |ta komanda predlagaet na rassmotrenie printeru odin bol'shoj fajl i naibolee polezna v teh sluchayah, kogda u vas imeetsya mnozhestvo katalogov s tekstovymi fajlami ili s ishodnymi fajlami programm. Opredeliv v obshchem osnovnye nashi zadachi, perejdem k bolee blizkomu znakomstvu s upomyanutymi instrumental'nymi sredstvami.

    2.1. POISK FAJLOV

2.1.1. tree - vizualizaciya fajlovogo dereva ---------------------------------------------------- IMYA: TREE ---------------------------------------------------- tree - vyvod na ekran struktury fajlovogo dereva

    NAZNACHENIE

Nahodit vse fajly v fajlovom dereve i vyvodit na ekran imena faj- lov, pokazyvaya ierarhicheskuyu strukturu fajlovogo dereva.

    FORMAT VYZOVA

tree [dir]

    PRIMER VYZOVA

$ tree $HOME Vyvodit strukturu fajlovogo dereva registracionnogo kataloga.

    TEKST PROGRAMMY

1 : 2 # @(#) tree v1.0 Visual display of a file tree Author: Russ Sage 2a vyvod na ekran struktury fajlovogo dereva 4 if [ "$#" -gt 1 ] 5 then echo "tree: wrong arg count">&2 6 echo "usage: tree [dir]" >&2 7 exit 2 8 fi 9 if [ "$#" -eq 1 ] 10 then if [ ! -d $1 ] 11 then echo "$0: $1 not a directory">&2 12 echo "usage: tree [dir]" >&2 13 exit 2 14 fi 15 fi 17 find ${1:-.} -print | sort | sed -e "1p" -e "1d" \ 18 -e "s|[^/]*/| /|g" \ 19 -e "s|[^ */|/|" \ 20 -e "s|/\([^/]*\)$|\1|" OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL tree? Kak my uzhe otmechali, vsya sistema UNIX stroitsya vokrug fajlovoj sistemy, kotoraya pohozha na derevo. Derevo, s kotorym my rabotaem v sisteme UNIX, rastet vverh nogami: koren' nahoditsya vverhu, a vetvi i listva rastut vniz ot kornya. Fizicheskaya struktura real'nyh derev'ev i fajlovyh derev'ev, ispol'zuemyh v sisteme UNIX, ochen' shodna: odin ko- ren' (nachal'naya tochka) i odin stvol. Kak gluboko i kak daleko mogut uhodit' vetvi ot osnovnogo stvola - ne ogranichivaetsya nichem, krome og- ranichenij fizicheskogo prostranstva. Analogichno, chislo list'ev, kotorye mozhet imet' kazhdaya vetv', fakticheski ne ogranicheno. Mnogoe v sisteme UNIX zadumano dlya togo, chtoby prisposobit'sya k derevu. Nekotorye komandy obhodyat derevo i soobshchayut o ego komponentah, no obychno ih soobshcheniya vydayutsya v forme, ne ochen' udobnoj dlya chteniya chelovekom. |to delaet komandnye fajly ves'ma moshchnymi instrumentami. Perevesti neobrabotannye, nedruzhestvennye soobshcheniya komandnyh fajlov v udobnyj, informativnyj vid dovol'no legko. Komanda tree yavlyaetsya kombinaciej komand sistemy UNIX, kotorye predstavlyayut logicheskuyu fajlovuyu strukturu v naglyadnoj forme. |ta ko- manda polezna dlya polucheniya global'noj kartiny fajlov, ih raspolozheniya v ierarhicheskoj strukture fajlovogo dereva, gnezdovoj struktury kata- logov i podkatalogov. CHTO DELAET tree? Komanda tree - eto postprocessor dlya komandy UNIX find. Find prosmatrivaet segment fajlovogo dereva i polnye imena vseh fajlov, ko- torye sootvetstvuyut zadannomu kriteriyu. Komanda tree ispol'zuet utili- tu sed sistemy UNIX, chtoby perevesti vyhod komandy find v naglyadnuyu formu. Vhodnym parametrom dlya komandy tree yavlyaetsya imya kataloga, koto- roe mozhet byt' ukazano v lyubom absolyutnom vide, naprimer, /usr/spool/uucp, ili v otnositel'nom, naprimer, ../../bin. Esli nika- kogo imeni ne ukazano, podrazumevaetsya ., chto yavlyaetsya tekushchim katalo- gom. Imya kataloga yavlyaetsya nachalom (ili kornem) otobrazhaemogo dereva. CHtoby pokazat' glubinu dereva, vse fajly, podchinennye dannomu katalo- gu, otobrazhayutsya s otstupom. Dlya udobstva predstavleniya gnezdovoj struktury, mezhdu sleduyushchimi drug za drugom otvetvleniyami pechataetsya kosaya cherta (/). Rassmotrim primer struktury kataloga. Pust' kornevym katalogom budet /tmp s dvumya katalogami: a i b. V kataloge a nahoditsya podkata- log aa, kotoryj soderzhit fajl file1, a v kataloge b , sootvetstvenno, podkatalog bb, soderzhashchij fajl file2. Komanda find vydast raspechatku takogo vida: # find /tmp -print /tmp /tmp/a /tmp/a/aa /tmp/a/aa/file1 /tmp/b /tmp/b/bb /tmp/b/bb/file2 Kak vidno iz etogo listinga, fajly a i aa est' katalogi, a fajl file1 nahoditsya vnizu fajlovogo dereva. Sravnite etot rezul'tat s re- zul'tatom, kotoryj vydaet komanda tree, ispol'zuya utilitu sed. # tree /tmp /tmp / a / / aa / / / file1 / b / / bb / / / file2 Kornevym katalogom v etom listinge yavlyaetsya katalog /tmp. Tam, gde derevo perehodit na bolee glubokij uroven', pechatayutsya tol'ko sim- voly kosoj cherty. Pervyj uroven' - /tmp, pod etim urovnem nahodyatsya fajly-katalogi a i b, zatem, sootvetstvenno, ih podkatalogi aa i bb. Ishodya iz etogo listinga, my delaem vyvod, chto na pervom urovne kata- loga nahodyatsya dva fajla (i eti fajly v dejstvitel'nosti yavlyayutsya ka- talogami) i chto dva fajla nahodyatsya v podchinennyh katalogah. Otmetim, chto my smogli identificirovat' aa i bb kak katalogi tol'ko potomu, chto v nih prisutstvuyut fajly file1 i file2. Sravnite etot listing s vyhodom "neobrabotannoj" komandy find. Vyhod komandy tree isklyuchaet otvlekayushchee vnimanie povtorenie elementov putej dostupa pri kazhdom perehode k bolee nizkomu urovnyu. Blagodarya etomu, srazu zhe vidno SUSHCHESTVENNUYU informaciyu. Vot chto my imeem v vi- du, kogda govorim o sozdanii bolee naglyadnogo dlya cheloveka interfejsa s sistemoj UNIX.

    PRIMERY

1. $ tree Ispol'zuet podrazumevaemyj katalog (tekushchij katalog, chto rav- nosil'no komande "$ tree .") v kachestve nachala fajlovogo dereva. 2. $ tree / Pechataet drevovidnyj listing dlya KAZHDOGO fajla vsej sistemy. Ko- manda find pri takom ee zapuske nachinaet s kornevogo kataloga i vydaet informaciyu o vseh fajlah sistemy. 3. $ tree $HOME/.. Pokazyvaet drevovidnyj format dlya vseh drugih pol'zovatelej sistemy (predpolagaetsya, chto vse pol'zovatel'skie katalogi nahodyatsya v odnom i tom zhe kataloge, naprimer /usr/*).

    POYASNENIYA

Pervaya stroka soderzhit tol'ko znak dvoetochiya (:) - "nulevuyu ko- mandu". |to svyazano s tem, chto vse komandnye fajly, opisyvaemye v etoj knige, sdelany tak, chtoby ih mozhno bylo zapuskat' v srede interpreta- tora Bourne shell. Nash kommentarij v stroke 2, identificiruyushchij versiyu, nachinaetsya so znaka reshetki (#). Si-shell ishchet etot znak kak pervyj znak komandnogo fajla. Esli on najden, to predprinimaetsya po- pytka vypolnit' dannyj komandnyj fajl. V protivnom sluchae Si-shell pe- redaet komandnyj fajl interpretatoru Bourne shell. Vot pochemu my ne hotim nachinat' pervuyu stroku so znaka #. My, konechno, mogli by osta- vit' pervuyu stroku chistoj, no chistaya stroka nevidima i mozhet byt' slu- chajno udalena. Sootvetstvenno my budem ispol'zovat' chistye stroki v drugih sluchayah, chtoby vydelit' vazhnye uchastki programmy. Stroka 2 identificiruet versiyu. Simvol'naya stroka @(#) est' spe- cial'naya posledovatel'nost' v stroke kommentariya, kotoraya raspoznaetsya kak stroka "what" ("chto"). Komanda what v sisteme UNIX chitaet fajl i pechataet soobshchenie, kotoroe sleduet za strokoj "what". CHtoby identifi- cirovat' versiyu dannogo komandnogo fajla, naberite # what tree i budet napechatano sleduyushchee soobshchenie: tree: tree v1.0 Visual display of a file tree Author: Russ Sage Stroki 4-7 proveryayut, ne slishkom li mnogo argumentov bylo pereda- no komandnoj stroke. |to osushchestvlyaetsya putem issledovaniya peremennoj $#, kotoraya predstavlyaet soboj schetchik chisla pozicionnyh parametrov komandnoj stroki. Esli naschityvaetsya bolee odnogo parametra, pechata- etsya sootvetstvuyushchee soobshchenie ob oshibke v standartnyj fajl oshibok (stderr) i programma ostanavlivaetsya s plohim znacheniem statusa. Otmetim, chto komanda echo obychno pechataet v standartnyj vyhod (stdout). My mozhem perenapravit' stdout v drugoj fajlovyj deskriptor, ukazav ego. V dannom sluchae my sobiraemsya pechatat' v stderr. Sintaksis perevoditsya tak: "vyvesti etu stroku i perenapravit' ee v fajlovyj deskriptor (&) standartnogo fajla oshibok (2)". Pechat' soobshchenij ob oshibkah v stderr obespechivaet soglasovannoe povedenie komandnogo fajla nezavisimo ot sredy, v kotoroj on zapushchen. Otmetim takzhe, chto kody statusa vyhoda v interpretatore shell protivopolozhny tem, kotorye ispol'zuyutsya pri programmirovanii na yazyke Si. V Si istinnoe znachenie est' 1, lozhnoe otlichno ot 1. Pri programmi- rovanii na yazyke shell uspeshnym statusom vyhoda (istinoj) yavlyaetsya 0, a plohim statusom (lozh'yu) nenulevoe znachenie. Vy, vozmozhno, udivites', pochemu my tak bespokoimsya o tom, chtoby vernut' lozhnyj status vyhoda, esli komandnyj fajl sobiraetsya prosto napechatat' soobshchenie ob oshibke i prekratit' rabotu. Delo v tom, chto vse instrumental'nye sredstva sistemy UNIX dolzhny byt' sproektirovany tak, chtoby oni mogli byt' svyazany s drugimi komandami i processami, v kotorye oni mogut byt' vstroeny. Vozmozhno, chto drugoj komande neobho- dimo budet vyzvat' komandu tree i proverit', korrektno li ona otrabo- tala. Horoshim stilem proektirovaniya programmnyh sredstv yavlyaetsya prog- nozirovanie i razreshenie mnogih sposobov ispol'zovaniya programmy. Stroki 9-15 proveryayut, chtoby lyubye parametry, peredavaemye ko- mandnoj stroke, byli dejstvitel'no katalogami, kak ukazano v nashem sintaksise. Napomnim, chto v komandnoj stroke mozhet byt' pomeshchen tol'ko odin katalog. Esli my ispol'zuem tol'ko odin parametr i etot parametr ne yavlyaetsya katalogom, to my pechataem soobshchenie ob oshibke i vyhodim. Takim obrazom, operatory proverki garantiruyut, chto libo ne ispol'zu- etsya ni odin parametr, libo edinstvennyj ispol'zuemyj parametr yavlya- etsya korrektnym katalogom. My podoshli k serdcu komandy tree - eto stroki 17-20. Glavnym zdes' yavlyaetsya komanda find sistemy UNIX. Katalog, v kotorom vedetsya poisk, opredelyaetsya pri zapuske komandy. Sintaksis ${1:-.} yavlyaetsya formoj parametricheskoj podstanovki i oznachaet sleduyushchee: esli $1 (chto yavlyaetsya pervym pozicionnym parametrom) ustanovlen (inymi slovami, esli argument byl peredan komandnoj stroke i byl nenulevym), to nuzhno ispol'zovat' eto znachenie. V protivnom sluchae sleduet ispol'zovat' ka- talog . (tekushchij katalog). |tot tip podstanovki daet nam vozmozhnost' zapuskat' komandu tree bez ukazaniya imeni kataloga (kogda posle tree na komandnoj stroke nichego ne sleduet),- to est' rabotat' v rezhime "po umolchaniyu", chto chasto ispol'zuetsya v razlichnyh fajlovyh instrumentah. Komanda find vyvodit na pechat' polnoe imya kazhdogo fajla, kotoryj ej vstrechaetsya. Poskol'ku ne ispol'zuetsya nikakaya special'naya opciya dlya selekcii fajlov, pechatayutsya vse imena. Posle etogo vse polnye ime- na fajlov sortiruyutsya dlya bolee udobnogo chteniya. Takaya sortirovka neskol'ko uvelichivaet vremya raboty komandy, odnako naglyadnost' rezul'- tata govorit o tom, chto eto vremya bylo potracheno s pol'zoj. Dalee, otsortirovannye polnye imena fajlov peredayutsya po prog- rammnomu kanalu komande sed sistemy Unix. Sed - eto "potokovyj redak- tor", ochen' gibkoe sredstvo, kotoroe mozhet byt' ispol'zovano dlya iden- tifikacii i obrabotki razlichnyh obrazcov teksta. Opcii -e yavlyayutsya operaciyami redaktirovaniya, primenyaemymi k postupayushchim dannym. Pervyj operator prosto soobshchaet komande sed, chto nuzhno napechatat' pervuyu stroku, zatem udalit' stroku 1. |to delaetsya dlya togo, chtoby napecha- tat' nazvanie kornevogo kataloga, kotoryj issleduetsya. |toj stroke ne trebuetsya nikakoj dal'nejshej modifikacii, tak kak kornevoj katalog ne imeet nikakih dopolnitel'nyh elementov putej dostupa, kotorye nuzhno bylo by transformirovat' v simvoly kosoj cherty dlya pokaza otstupov. Udalenie pervoj stroki svyazano s tem, chto ona ne nuzhna v dal'nejshej rabote. Vtoraya operaciya redaktirovaniya yavlyaetsya komandoj podstanovki. Ona zamenyaet kazhdyj simvol, otlichnyj ot simvola kosoj cherty (vplot' do pervogo simvola /) na posledovatel'nost' probelov i zatem odin simvol (/). |to izbavlyaet nas ot pechataniya imen promezhutochnyh katalogov vpe- redi polnogo imeni fajla. Bukva g v konce etoj stroki oznachaet, chto eta operaciya vypolnyaetsya global'no, to est' dlya vseh schityvaemyh sim- volov. Itak, teper' stroka sostoit iz nachal'nogo elementa puti i odnoj ili bolee posledovatel'nostej probelov, razdelennyh simvolami kosoj cherty. Simvoly obratnoj kosoj cherty (\) v konce operacij redaktirova- niya - eto simvoly prodolzheniya, kotorye soobshchayut komande sed, chto nuzhno prodolzhit' rabotu so sleduyushchej strokoj v tekushchem pakete operacij re- daktirovaniya. Tret'ya operaciya redaktirovaniya (stroka 19) takzhe yavlyaetsya koman- doj podstanovki i zamenyaet kazhdyj simvol, kotoryj ne yavlyaetsya probelom (vplot' do simvola /) na "ne simvol" i odin simvol kosoj cherty. |tot operator udalyaet probely iz predydushchego rezul'tata redaktirovaniya i smeshchaet simvol v samuyu levuyu poziciyu. |to sozdaet gnezdovuyu indikaciyu, kotoruyu my videli v predydushchem primere. Poslednyaya operaciya redaktirovaniya (v stroke 20) zamenyaet simvol kosoj cherty i vse otlichnye ot nego simvoly (do konca stroki) prosto na simvoly, otlichnye ot /. Otmetim, chto eto ustranyaet samyj pravyj simvol /, kotoryj prisutstvuet v listinge komandy find. V rezul'tate ostaetsya imya podchinennogo fajla, sdvinutoe vpravo. Otmetim sintaksis \1 komandy sed - priznak, otnosyashchijsya k pervomu (v dannom sluchae edinstvennomu) regulyarnomu vyrazheniyu v skobkah, koto- roe emu predshestvuet. V dannom sluchae komande sed ukazano projti sim- voly, sootvetstvuyushchie regulyarnomu vyrazheniyu - simvoly, otlichnye ot /. 2.1.2. thead - pechat' nachala kazhdogo fajla ----------------------------------------------------- IMYA: thead ----------------------------------------------------- thead Pechataet zagolovok (pervye neskol'ko strok) fajlov.

    NAZNACHENIE

Projti fajlovoe derevo i napechatat' pervye neskol'ko strok kazhdo- go fajla. Esli ne ukazan katalog, to thead dejstvuet kak fil'tr.

    FORMAT VYZOVA

thead [dir...]

    PRIMER VYZOVA

$ find $HOME/src -name "*.c" -print | sort | thead Pechataet zagolovki (pervye neskol'ko strok) vseh moih ishodnyh fajlov na yazyke Si.

    TEKST PROGRAMMY

1 : 2 # @(#) thead v1.0 Prints head of files in tree Author: Russ Sage 2a Pechataet zagolovki fajlov v dereve 4 if [ "`echo $1|cut -c1`" = "-" ] 5 then echo "$0: arg error" 6 echo "usage: $0 [dir ...]" 7 exit 1 8 fi 10 case $# in 11 0) while read FILE 12 do 13 if file $FILE | fgrep text >/dev/null 2>&1 14 then echo "\n:::::::::::::::::::::" 15 echo " $FILE" 16 echo "\n:::::::::::::::::::::" 17 head -15 $FILE 18 fi 19 done;; 20 *) for NAME in $* 21 do 22 find $NAME -type f -print | sort | wile read FILE 23 do 24 if file $FILE | fgrep text >/dev/null 2>&1 25 then echo "\n:::::::::::::::::::::" 26 echo " $FILE" 27 echo "\n:::::::::::::::::::::" 28 head -15 $FILE 29 fi 30 done 31 done;; 32 esac

    PEREMENNYE SREDY VYPOLNENIYA

FILE Soderzhit imya kazhdogo fajla NAME Imya kataloga, zadannoe v komandnoj stroke OPISANIE ZACHEM NUZHEN KOMANDNYJ FAJL thead? Kak uzhe ob座asnyalos' ranee v etoj glave, ierarhicheskaya fajlovaya sistema yavlyaetsya ochen' znachitel'noj chast'yu sistemy UNIX. Odnako, tol'- ko neskol'ko komand v UNIX imeyut delo neposredstvenno s rekursivnym poiskom fajlov. Edinstvennyj sposob rasshirit' vozmozhnosti sistemy - sozdat' novye rekursivnye utility, rabotayushchie s fajlami. V dannom slu- chae my soedinim nashu strategiyu poiska po derevu s komandoj head siste- my UNIX dlya uproshcheniya identifikacii soderzhimogo vseh fajlov v vydelen- nom segmente fajlovogo dereva. Inogda u nas, vozmozhno, budet voznikat' zhelanie prosmotret' fajly v bolee chem odnom kataloge. V bol'shih proektah razrabotki programmnogo obespecheniya fajly obychno sozdayutsya v neskol'kih ierarhicheskih katalo- gah. Thead mozhet rabotat' so mnozhestvom putej dostupa i vyvodit' zago- lovki (neskol'ko pervyh strok fajlov) v vide nepreryvnogo potoka. CHTO DELAET thead? Thead - eto preprocessornaya komanda k komande head sistemy UNIX. Komanda head ochen' primitivna, no, dobavlyaya k nej upravlyayushchuyu struktu- ru i logiku, my mozhem sozdat' ochen' poleznoe instrumental'noe sredstvo, kotorogo net v standartnoj srede UNIX. Naprimer, my zahoteli prosmotret' zagolovki vseh tekstovyh fajlov v nashem registracionnom kataloge. Esli u nas imeetsya bol'shoe chislo podkatalogov, nam neobhodimo vse ih projti i prosmotret' vse fajly, soderzhashchiesya v nih. My mozhem sdelat' eto s pomoshch'yu komandy $ thead $HOME Esli my hotim prosmotret' tol'ko ishodnye fajly na yazyke Si (*.c), to predstavlennyj vyshe sintaksis ne goditsya dlya etogo. On ne obladaet dostatochnoj gibkost'yu. Nam neobhodimo imet' sposob ukazat' (ili kvalificirovat') fajly v $HOME pered tem, kak prosmatrivat' ih. Tak kak komanda thead mozhet vosprinimat' polnye imena fajlov, my mozhem ispol'zovat' sleduyushchuyu komandu: $ find $HOME -name "*.c" -print | sort | thead Komanda find generiruet spisok fajlov s rasshireniem C, kotoryj sortiruetsya i podaetsya po kanalu na vhod komande thead. Kak vidno iz predstavlennyh dvuh primerov, ves'ma poleznoj dlya komandnogo fajla yavlyaetsya vozmozhnost' poluchat' vhodnye dannye libo iz argumentov komandnoj stroki (kak v pervom primere), libo po programm- nomu kanalu (kak vo vtorom primere). Sposobnost' ispol'zovat' prog- rammnyj kanal pozvolyaet vam primenyat' kakie-libo drugie komandy siste- my UNIX, kotorye mogut otbirat' vhodnye dannye dlya vashego komandnogo fajla. Komanda s takoj dvojnoj vozmozhnost'yu nazyvaetsya FILXTROM. Sredi standartnyh komand sistemy UNIX vy najdete lish' neskol'ko komand-fil'- trov, takih kak wc, awk, sort. |ti dva sposoba postupleniya vhodnyh dannyh v programmy delayut in- terfejs s komandnymi fajlami ochen' gibkim. My mozhem podstraivat' prog- ramnye sredstva pod nashi nuzhdy, a ne podstraivat' nashi zhelaniya pod imeyushcheesya programmnoe obespechenie. Argumentami dlya komandy thead yavlyayutsya katalogi. Nikakih opcij, nachinayushchihsya so znaka "-" net, tol'ko katalog ili polnye imena fajlov. Komanda thead znaet iz sintaksisa, kakoj sposob zapuska komandy budet ispol'zovat'sya. Esli komandnaya stroka soderzhit imya fajla, thead prosmotrit vse pozicionnye parametry. Esli nikakie imena ne ukazany, thead chitaet standartnyj vvod (stdin) i ostanavlivaetsya, kogda vstre- chaet EOF. (Takoe byvaet v sluchae, kogda komanda thead poluchaet vhodnye iz programmnogo kanala.) Dlya kazhdogo fajla, s kotorym rabotaet thead, vypolnyaetsya kontrol' - tekstovyj li eto fajl. Primenenie komandy head k ispolnyaemym modulyam privodit k vyvodu "tainstvennyh" simvolov na ekran i inogda mozhet vyz- vat' damp operativnoj pamyati.

    PRIMERY

1. $ thead /etc Pechataet dannye iz kazhdogo tekstovogo fajla, nahodyashchegosya v kata- loge /etc. Ochen' poleznaya komanda, tak kak bol'shinstvo fajlov v /etc yavlyayutsya ispolnyaemymi modulyami. Udobno imet' vozmozhnost' bystro izoli- rovat' tekstovye fajly. 2. $ thead /usr/include Prosmatrivaet vse podklyuchaemye fajly (*.h), dazhe v sistemnom pod- kataloge sys. 3. $ find $HOME -ctime 0 -print | thead Ishchet vse fajly v vashem registracionnom kataloge, kotorye byli iz- meneny v techenii poslednih 24 chasov. Dlya kazhdogo fajla proveryaetsya, tekstovyj li on. Esli fajl tekstovyj, to on pechataetsya.

    POYASNENIYA

Stroki 4-8 vypolnyayut proverku oshibok. Tak kak komanda thead ne imeet nikakih opcij, lyubye pozicionnye parametry, kotorye nachinayutsya s defisa (-) yavlyayutsya nevernymi. Esli pervym simvolom pervogo pozicion- nogo parametra okazyvaetsya "-", to pechataetsya soobshchenie "argument error" (oshibka argumenta) vmeste s soobshcheniem o sposobe zapuska i ko- manda thead prekrashchaet rabotu. Nekotorye priemy programmirovaniya dlya interpretatora shell, ispol'zuemye v etih strokah, dovol'no chasto vstrechayutsya v dannoj kni- ge, poetomu imeet smysl ostanovit'sya na nih podrobnee. Proanaliziruem stroku 4, rabotayushchuyu iznutri naruzhu. Komanda echo vydaet soderzhimoe $1 (tekushchij parametr komandnoj stroki), kotoroe pe- redaetsya po programmnomu kanalu komande cut. Komanda cut ispol'zuetsya dlya togo, chtoby vydelit' opredelennye simvoly ili gruppy simvolov iz stroki. V dannom sluchae opciya -c1 ispol'zuetsya dlya polucheniya tol'ko pervogo simvola. KOMANDA cut DLYA BSD V sisteme BSD net komandy cut, no sleduyushchij komandnyj fajl vse zhe "vyrezaet" pervoe nepustoe pole v tekushchem argumente. Predpolozhim, my ispol'zuem komandu dlya generacii celogo nabora strok. V dannom sluchae eto komanda who: for NAME in 'who | sed "s/^\([^ ]*\).*/\1/"' do done Dlya kazhdoj obnaruzhennoj stroki (argumenta) komanda sed dolzhna podstavit' vtoruyu stroku simvolov vmesto pervoj stroki. Pervaya stroka - eto stroka, kotoraya vyrezaetsya. My ishchem ot nachala stroki (^) simvol, otlichnyj ot probela ([^ ]), za kotorym sleduet lyuboe chislo nepustyh simvolov (*). |ta operaciya preryvaetsya po dostizhenii probela. Nabor nepustyh simvolov ogranichivaetsya obratnymi kosymi chertami \( i \). Vposledstvii ssylka na etot nabor daetsya v vide \1. Simvoly .* oznacha- yut, chto posle togo, kak najden probel, neobhodimo schitat' podhodyashchimi vse simvoly do konca stroki. My nahodimsya fakticheski srazu posle togo, chto zaklyucheno v paru simvolov \( i \). Gruppiruya pervyj nabor simvo- lov, otlichnyh ot probela, my poluchaem to, chto yavlyaetsya rezul'tatom ra- boty komandy "cut -f1". V etom meste my podhodim k znakam udareniya (`), okajmlyayushchim vse vyrazhenie. Oni berut rezul'tat raboty vseh komand, zaklyuchennyh v znaki udareniya i peredayut na sleduyushchuyu ohvatyvayushchuyu strukturu v nashih vlo- zhennyh vyrazheniyah. |tot sleduyushchij uroven' okajmleniya ukazan kavychkami. Kavychki prevrashchayut simvol v stroku, chtoby ego mozhno bylo sravnit' s simvolom "-". Sleduyushchij sloj - kvadratnye skobki, ukazyvayushchie uslovie dlya operatora if. |to privodit k tomu, chto generiruetsya nulevoe (isti- na) ili nenulevoe (lozh') uslovie, kotoroe upravlyaet tem, budet li vy- polnena chast' then operatora if-then. My ne sobiraemsya podrobno analizirovat' mnogo strok dannogo ko- mandnogo fajla, no my hotim pokazat' vam, kak chitat' vyrazhenie ili vsyu stroku teksta programmy tak, chtoby eto imelo smysl. Ostal'naya chast' komandnogo fajla predstavlyaet soboj odin ogromnyj operator vybora (case). Argumentom, ispol'zuemym dlya vetvleniya, yavlya- etsya chislo pozicionnyh parametrov v komandnoj stroke. Esli pozicionnyh parametrov net, to v strokah 11-19 aktiviruetsya cikl while. Zametim, chto cikl while vypolnyaet operator chteniya, no ne ukazyvaet, otkuda dol- zhen byt' vzyat ego vhod. |to svyazano s tem, chto vhodom po umolchaniyu yav- lyaetsya standartnyj vvod (stdin). Dlya kazhdogo imeni fajla, kotoroe chi- taetsya iz standartnogo vvoda, zapuskaetsya komanda file sistemy UNIX. Vyhod komandy file peredaetsya po programmnomu kanalu komande fgrep (a ne grep, chto uvelichivaet skorost'), chtoby posmotret', yavlyaetsya li fajl tekstovym. Fakticheskij vyhod komandy fgrep perenapravlyaetsya na nulevoe ust- rojstvo (v beskonechnuyu oblast' pamyati), poskol'ku on nam ne nuzhen. Nas interesuet lish' kod vozvrata posle vypolneniya vsego konveje- ra. Esli komandy file i fgrep otrabotali uspeshno, kodom vozvrata yavlya- etsya nol'. |to istinnoe znachenie, poetomu vypolnyaetsya uchastok cikla posle then (stroki 14-17). Esli fajl ne sushchestvuet ili ne yavlyaetsya tekstovym, to kod vozvrata nenulevoj, i uslovnyj operator zavershaetsya. |to privodit nas v konec cikla, vypolnyaetsya sleduyushchaya iteraciya cikla while i my rassmatrivaem sleduyushchij argument iz standartnogo vvoda. Teper' rassmotrim obrabotku, vypolnyaemuyu po then (stroki 14-17). Dlya kazhdogo fajla, kotoryj yavlyaetsya tekstovym, pechataetsya stroka dvoe- tochij (:) do i posle imeni fajla, a komanda head sistemy UNIX pechataet pervye 15 strok. Takoj scenarij prodolzhaetsya, poka ne zakonchatsya dan- nye v standartnom vvode. Rassmotrim druguyu al'ternativu, pokryvaemuyu dannym operatorom vy- bora. Ona obrabatyvaet situaciyu, kogda imeetsya neskol'ko pozicionnyh parametrov (chto ukazano simvolom * v operatore case). Cikl for probe- gaet vse parametry (stroka 20). Zvezdochka (*) v operatore case oznacha- et, chto podhodit lyuboe znachenie, kotoroe ne podoshlo ranee. |to ulavli- vayushchaya (catchall) opciya. Cikl for ispol'zuet argument $* v kachestve svoego vhoda. On predstavlyaet znacheniya vseh pozicionnyh parametrov, chto yavlyaetsya fakticheski vsej komandnoj strokoj, isklyuchaya imya utility. Komanda find ispol'zuetsya dlya poiska vseh normal'nyh fajlov v ka- taloge. "Normal'nye" fajly ne oznachaet "tol'ko tekstovye fajly", poe- tomu my proverim eto pozzhe. Vyhod komandy find peredaetsya po kanalu komande sort, chtoby sdelat' ego bolee naglyadnym. Otsortirovannyj spisok peredaetsya po kanalu v cikl while, kotoryj pomeshchaet imya fajla v peremennuyu FILE (stroka 27). Proveryaetsya, tekstovyj li fajl, zatem on pechataetsya komandoj head. Esli my sravnim stroki 13-18 i stroki 24-29, to my uvidim, chto eto odin i tot zhe kod. V bol'shinstve yazykov programmirovaniya eto ozna- chalo by, chto my dolzhny oformit' eti stroki kak proceduru i vyzyvat' ee, kogda nuzhno. YAzyk programmirovaniya interpretatora shell, hotya i dovol'no moshchnyj, ne imeet horoshego sposoba realizacii procedur. Poslednij interpretator shell v System V imeet funkcii, kotorye pozvo- lyayut reshit' eti problemy. Otmetim, chto vnutrennij cikl while povtoryaetsya na kazhdom fajle, kotoryj sushchestvuet v opredelennom kataloge, a vneshnij cikl for proho- dit ot kataloga k katalogu.

    VOZMOZHNYE MODIFIKACII

Dlya uvelicheniya gibkosti horosho by dobavit' opcii, chtoby vy mogli perehodit' na komandu find neposredstvenno iz thead. Poleznymi argu- mentami byli by -name dlya izolirovaniya obrazcov imen fajlov i -ctime dlya obrabotki izmenenij, svyazannyh so vremenem. Eshche odnoj privlekatel'noj osobennost'yu bylo by dobavlenie opcii grammaticheskogo razbora (osnovannoj na -) i opcii -n, ukazyvayushchej, chto iz komandy head dolzhno byt' napechatano n strok.

    VOZMOZHNYE ISSLEDOVANIYA

V chem otlichie mezhdu dvumya sleduyushchimi operatorami? $ find $HOME -name "*.c" -print | thead i $ find $HOME -name "*.c" -exec head {} \; Oni vyglyadyat ochen' pohozhe, i oni dejstvitel'no pohozhi. Oni obra- batyvayut odni i te zhe fajly i pechatayut odni i te zhe dannye iz kazhdogo fajla. Osnovnoe otlichie v tom, chto stroka, kotoraya ispol'zuet thead, pechataet horoshee oformlenie vokrug imeni fajla, a chistaya komanda find pechataet nepreryvnyj potok teksta tak, chto ochen' trudno opredelit', kakoj fajl vy prosmatrivaete. 2.1.3. tgrep - poisk strok v dereve fajlovoj sistemy -------------------------------------------------------------- IMYA: tgrep -------------------------------------------------------------- tgrep Poisk stroki po shablonu v dereve fajlov

    NAZNACHENIE

Obhodit fajlovoe derevo i ishchet v kazhdom fajle ukazannuyu stroku. Esli ne ukazan nikakoj katalog, tgrep dejstvuet kak fil'tr.

    FORMAT VYZOVA

tgrep [-c|-h] string [file ...]

    PRIMER VYZOVA

# tgrep "profanity" / Poisk slova "profanity" po vsej sisteme (superpol'zovatel' snova na trope vojny!)

    TEKST PROGRAMMY

1 : 2 # @(#) tgrep v1.0 Search for string in tree Author: Russ Sage 2a Poisk stroki v dereve 4 OPT="" 6 for ARG in $@ 7 do 8 if [ "`echo $ARG|cut -c1`" = "-" ] 9 then case $ARG in 10 -c) OPT="-name \"*.c\"" 11 shift;; 12 -h) OPT="-name \"*.h\"" 13 shift;; 14 *) echo "$O: incorrect argument" >&2 15 echo "usage: $O [-c|-h] string [file ...] >&2 16 exit 1;; 17 esac 18 fi 19 done 21 case $# in 22 0) echo "$O: argument error" >&2 23 echo "usage: $O [-c|-h] string [dir ...]" >&2 24 exit 2 25 ;; 26 1) while read FILE 27 do 28 grep -y "$1" $FILE /dev/nul 29 done 30 ;; 31 *) STRING=$1; shift 32 eval find "$@" -type f $OPT -print | sort | while read FILE 33 do 34 grep -y "$STRING" $FILE /dev/null 35 done 36 ;; 37 esac

    PEREMENNYE SREDY VYPOLNENIYA

FILE Soderzhit imya kazhdogo fajla OPT Soderzhit special'nye opcii komandy find STRING Vremennaya peremennaya, v kotoroj soderzhitsya stroka poiska OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL tgrep? Kak my mogli videt' na primere dvuh predydushchih utilit, rekursiv- nyj prosmotr fajlov ochen' polezen. On sohranyaet vremya, poskol'ku poz- volyaet izbezhat' poiska fajlov vruchnuyu, a takzhe sozdaet sredstva, koto- rye mogut byt' ispol'zovany v bolee moshchnyh utilitah. CHem bol'she ime- etsya sozdannyh nami sredstv, tem bol'she novyh sredstv my mozhem postro- it' s ih pomoshch'yu. Edinstvennaya problema zaklyuchaetsya v tom, chto vy dolzhny pozabotit'sya ob ih vzaimozavisimosti (kakim utilitam ili sredstvam trebuyutsya drugie utility ili sredstva i kto na kogo vliyaet). Eshche odna oblast', gde UNIX ne imeet "rodnoj" rekursivnoj komandy - eto obrabotka strok. Semejstvo komand tipa grep ochen' veliko, no vse oni rabotayut tol'ko po odnomu fiksirovannomu marshrutnomu imeni fajla. Nam neobhodim preprocessor dlya komandy grep. Pravda, my mozhem dat' zapros na vse fajly vo vsej sisteme ili kakoj-libo ee chasti po nashemu vyboru. Esli my popytaemsya sdelat' eto vruchnuyu, to eto oznachaet, chto my dolzhny mnogo raz nazhimat' na klavishi, chto mozhet privesti k sin- taksicheskoj oshibke. Vy takzhe dolzhny tochno pomnit', kak vy sozdavali komandnuyu stroku, esli vy v sleduyushchij raz zahotite vypolnit' takuyu zhe zadachu. Zachem vypolnyat' gryaznuyu rabotu? Dlya etogo sushchestvuet komp'- yuter. Sozdavaya programmu avtomaticheskogo obhoda dereva fajlov, my osvo- bozhdaemsya dlya togo, chtoby napravit' nashu energiyu na bolee vazhnye veshchi vmesto togo, chtoby vyputyvat'sya iz situacii v sluchae kakogo-libo slish- kom specifichnogo sintaksisa. Odin raz sozdav dostatochno moshchnye sredstva dostupa k fajlam, my mozhem posvyatit' nashe vremya napisaniyu programm, obrabatyvayushchih fajly dannyh dlya resheniya kakih-libo zadach. CHTO DELAET tgrep? Osnovnym prednaznacheniem tgrep yavlyaetsya obespechenie bol'shej gib- kosti i legkosti ispol'zovaniya vozmozhnostej komandy grep. Ee sintaksis tochno takoj zhe, kak i u grep, za isklyucheniem dopustimyh tipov fajlov. V komande grep UNIX v kachestve argumenta mozhet ukazyvat'sya prakticheski lyuboj fajl, no ukazanie tekstovogo fajla imeet naibol'shij smysl. V ko- mande tgrep takzhe mogut ispol'zovat'sya tekstovye fajly, no naibol'shij smysl imeet ukazanie katalogov, poskol'ku my ishchem imena fajlov. Koman- da find rabotala by ne ochen' horosho, esli by pytalas' izvlech' mnozhest- vo imen fajlov iz tekstovogo fajla. V komandnoj stroke mozhet ukazy- vat'sya mnozhestvo imen katalogov, poskol'ku vse oni ispol'zuyutsya kak nachal'noe mesto poiska operatora find. Po umolchaniyu tgrep nahodit vse obychnye fajly. V etoj programme net nikakoj proverki na to, tekstovyj fajl ili net, poskol'ku my ne pytaemsya napechatat' vse na ekran. Poetomu my ishchem stroki simvolov vo vseh fajlah, nachinaya ot arhivnyh i zakanchivaya ispolnyaemymi. Esli vy hotite vybrat' tipy fajlov, ispol'zujte dve opcii, -c i -h. Opciya -c zastavlyaet komandu UNIX find iskat' tol'ko fajly s imena- mi vida *.c. Analogichno, opciya -h sootvetstvuet fajlam *.h. |ti opcii mogut byt' polezny dlya upravleniya programmami na yazyke Si, s kotorymi my bolee detal'no poznakomimsya v glave 4. |ti opcii ne samoe vazhnoe, no oni pokazyvayut, kak legko dobavit' novye opcii v programmu. Esli pri vyzove byla ukazana kakaya-to inaya opciya, krome upomyanu- tyh, vyvoditsya soobshchenie ob oshibke i programma ostanavlivaetsya. Podob- no thead, tgrep yavlyaetsya fil'trom.

    PRIMERY

1. $ tgrep unix $HOME Poisk lyubogo vhozhdeniya slova unix vo vseh fajlah moego registra- cionnogo kataloga. 2. $ tgrep -c "^sleep()$" $HOME/src Poisk vyrazheniya (nachalo stroki, simvol'naya stroka, konec stroki) vo vseh ishodnyh fajlah na yazyke Si v registracionnom kataloge s ishodnymi tekstami (opciya -c). 3. # find /usr/src -name "*.c" -print | tgrep "ioctl" Poisk vseh vyzovov ioctl v ishodnyh Si-fajlah, nachinaya s kataloga /usr/src. (Obratite vnimanie, chto ya yavlyayus' superpol'zovatelem. |to vidno iz togo, chto ya zanimayus' poiskom v ogranichennoj chasti sistemy, a imenno v ishodnyh distributivah, a takzhe iz togo, chto v kachestve sim- vola priglasheniya ispol'zuetsya simvol "#".) 4. $ tgrep "| more" `find . -type f -print` Poisk simvola vertikal'noj cherty (|), posle kotorogo sleduet slo- vo more, v spiske imen fajlov, generiruemom operatorom find. Find pe- chataet imena vseh fajlov tekushchego kataloga i vseh podkatalogov, koto- rye yavlyayutsya obychnymi fajlami. 5. $ tgrep trap /bin /usr/bin /etc Poisk komandy preryvaniya (trap) vo vseh komandnyh fajlah interp- retatora shell, kotorye imeyutsya v treh katalogah.

    POYASNENIYA

V stroke 4 peremennaya OPT, v kotoroj hranyatsya neobyazatel'nye ko- mandy operatora find, inicializiruetsya v nulevoe znachenie. Stroki 6-18 vypolnyayut proverku na nalichie oshibok. Proveryaetsya, yavlyaetsya li pervym simvolom kazhdogo pozicionnogo parametra simvol "-". Esli proverka uspeshna, to proveryaetsya na korrektnost' sam argument. Vozmozhnymi opciyami yavlyayutsya -c i -h. Esli ukazano chto-libo drugoe, vy- voditsya soobshchenie ob oshibke i programma zavershaetsya. Obratite vnima- nie, chto s pomoshch'yu komandy shift dopustimye opcii udalyayutsya iz komand- noj stroki. |to sdelano dlya togo, chtoby vposledstvii vyrazhenie $@ mog- lo byt' ispol'zovano dlya polucheniya tol'ko argumentov stroki poiska i marshruta. Vyrazhenie $@ yavlyaetsya drugoj formoj vyrazheniya $ *, v kotoroj ono rasprostranyaetsya na vse pozicionnye parametry. Odnako v posleduyu- shchem tekste my uvidim odno bol'shoe otlichie mezhdu nimi. Eshche odin tryuk sdelan pri prisvoenii znacheniya peremennoj OPT v stroke 10. |toj peremennoj nam neobhodimo prisvoit' znachenie, kotoroe vklyuchaet v sebya paru kavychek, poskol'ku kavychki dolzhny byt' chast'yu stroki poiska, kotoraya v konce koncov ispol'zuetsya operatorom find. Odnako obnaruzhenie vtoroj kavychki obychno ZAVERSHAET operator prisvaiva- niya, a my etogo v dannom sluchae ne hotim. Vyhodom iz situacii yavlyaetsya ispol'zovanie simvola \, kotoryj otmenyaet special'noe znachenie sleduyu- shchego za nim simvola. V dannom sluchae special'noe znachenie bylo by kon- com stroki prisvaivaniya. Takim obrazom, kavychka pered zvezdochkoj (*) v stroke 10 rassmat- rivaetsya kak chast' znacheniya peremennoj OPT, vmesto togo, chtoby zaver- shat' operaciyu prisvaivaniya. Sleduyushchaya vstrechennaya kavychka takzhe dolzhna byt' sohranena v znachenii peremennoj, chtoby ukazat' konec hranimoj zdes' stroki poiska, poetomu ona takzhe ekranirovana simvolom \. Poslednyaya kavychka v etoj stroke ne ekranirovana obratnoj kosoj chertoj. |ta kavychka sootvetstvuet svoej obychnoj funkcii v smysle interpretato- ra shell i zavershaet operator prisvaivaniya. Vam nuzhno poeksperimentirovat' s ispol'zovaniem kavychek, chtoby ponyat' ego. Kogda kakoj-to komandnyj fajl ne zhelaet rabotat' pravil'- no, no oshibok ne vidno, prover'te pravil'nost' ispol'zovaniya kavychek. Ostavshayasya chast' komandnogo fajla - eto operator case (stroki 21-37), kotoryj imeet delo s chislom argumentov komandnoj stroki. Esli net nikakih argumentov, pechataetsya soobshchenie ob oshibke i my vyhodim iz programmy. My ved' ne mozhem delat' nikakogo poiska komandoj grep, esli my dazhe ne znaem, kakuyu stroku nuzhno iskat'. Esli ukazan tol'ko odin argument, to eto dolzhna byt' stroka po- iska. |to takzhe oznachaet, chto v komandnoj stroke ne ukazany imena faj- lov i poetomu my chitaem ih so standartnogo ustrojstva vvoda, t.e. ko- mandnyj fajl dejstvuet kak fil'tr. Cikl while (stroki 26-29) chitaet so standartnogo vvoda imya kazhdogo fajla dlya poiska v nem komandoj grep nuzhnoj stroki. Opciya -y komandy grep oznachaet nechuvstvitel'nost' k re- gistru simvolov pri poiske. Ispol'zovanie etoj opcii daet nam horoshie shansy popast' na nuzhnuyu stroku. Drugoj interesnoj osobennost'yu etogo cikla yavlyayutsya dve komandy grep v strokah 28 i 34. My ishchem nuzhnuyu stroku ne tol'ko v fajle, no takzhe v kataloge /dev/null. |to kazhetsya strannym? Da. Problema zaklyu- chaetsya v samoj komande grep. Grep znaet, kogda v komandnoj stroke uka- zano bolee odnogo fajla. Esli imeetsya bolee odnogo fajla, to imya fajla vyvoditsya na ekran do vyvoda najdennoj stroki. Esli zhe v komandnoj stroke ukazan tol'ko odin fajl, to ego imya ne vyvoditsya, poskol'ku schitaetsya, chto pol'zovatel' dolzhen pomnit' eto imya. |to sozdaet prob- lemy pri napisanii komandnyh fajlov, kogda vy imeete mnogo imen faj- lov, no oni obrabatyvayutsya po odnomu. My obrabatyvaem fajly po odnomu, poskol'ku esli by my ispol'zovali ukazanie gruppovogo imeni fajlov s pomoshch'yu metasimvolov, to moglo by okazat'sya slishkom mnogo imen fajlov v odnoj komandnoj stroke dlya komandy grep. Poetomu vmesto ispol'zova- niya nekotoroj zamyslovatoj shemy dlya sokrashcheniya kolichestva argumentov, my izbegaem etogo putem obrabotki v cikle kazhdogo fajla po ocheredi. Poskol'ku na samom dele my ishchem bol'shoe kolichestvo raznyh strok, to my hotim videt' imena fajlov, v kotoryh oni byli najdeny. Pri ukazanii v komandnoj stroke grep kataloga /dev/null, grep vsegda pechataet imya fajla do vyvoda najdennoj stroki v nashem cikle, poskol'ku teper' imeetsya dva imeni fajla v kachestve argumentov. Konech- no, v /dev/null nichego nel'zya najti, poskol'ku on pust po opredeleniyu. Poslednij obrazec v operatore case (stroki 31-36) - eto lovushka. On sootvetstvuet lyubomu kolichestvu pozicionnyh parametrov sverh odno- go, chto pozvolyaet nam imet' peremennoe chislo katalogov v komandnoj stroke. Dazhe hotya my mozhem ukazat' neskol'ko katalogov v komandnoj stro- ke, pervym argumentom po-prezhnemu yavlyaetsya stroka poiska. Ne tak legko skazat': "nachinaya so vtorogo parametra", poetomu my sohranyaem stroku poiska (v peremennoj STRING - Prim. perev.) i ubiraem ee komandoj shift. Teper' my mozhem poluchit' dostup k ostal'noj chasti komandnoj stroki s pomoshch'yu vyrazheniya $@. Davajte posmotrim, chto proishodit, kogda my ssylaemsya na peremen- nuyu $OPT dlya polucheniya opcij komandy find. Dopustim, my vyzvali tgrep s opciej -c. Kogda my prisvaivaem znachenie peremennoj OPT, my stavim stroku c v vide "*.c" vnutri dvojnyh kavychek, poskol'ku my ne zhelaem, chtoby shell raskryval etu stroku (t.e. traktoval ee kak imena vseh fajlov, sootvetstvuyushchih dannomu obrazcu) imenno sejchas. Teper', kak tol'ko k peremennoj $OPT est' obrashchenie v komande find, znacheniem OPT yavlyaetsya *.c, chto oznachaet poisk fajlov, simvol'nye imena kotoryh sootvetstvuyut *.c. Dlya otmeny simvol'noj interpretacii my dolzhny ispol'zovat' komandu eval. Pered vypolneniem komandy find komanda eval zastavlyaet shell povtorno analizirovat' komandu v otnoshenii rasprost- raneniya znacheniya peremennoj. Na etom prohode vyrazhenie "*.c" prevrashcha- etsya v *.c, chto razreshaet generaciyu imen fajlov takim obrazom, chtoby byli prosmotreny vse eti fajly. Ukazyvaya $@ v komande find, my mozhem proizvodit' poisk vo vseh katalogah srazu. Takim obrazom, nam nuzhno vyzvat' find tol'ko odin raz, chto pozvolyaet sberech' vremya central'nogo processora. Odnoj iz in- teresnyh problem, voznikshih pri razrabotke dannogo komandnogo fajla bylo to, chto vyrazhenie vida $* ne rabotalo. V komande find voznikala oshibka sohraneniya. Dazhe zapusk shell'a v rezhime -x (ustanovlennyj flag razresheniya vypolneniya) ne razreshil problemu. Izmenenie sintaksisa, ka- zhetsya, pomoglo razobrat'sya s nej. Okazyvaetsya, prichina v tom, chto vy- razhenie $* raskryvaetsya v "$1 $2 ...", v to vremya kak vyrazhenie $@ prevrashchaetsya v "$1" "$2" (t.e. v otdel'nye argumenty). Proishodilo to, chto vyrazhenie $* peredavalo imena neskol'kih katalogov komande find kak odnu stroku. Komanda find ne mogla obnaruzhit' fajl takogo tipa, poetomu prekrashchala vypolnenie. Kogda zhe vmesto etogo bylo ispol'zovano vyrazhenie $@, komanda find poluchila neskol'ko nezavisimyh strok s ime- nami. |to vpolne podoshlo komande find, i vse zarabotalo. Takie melkie detali vsegda trebuyut mnogo vremeni dlya izucheniya!

    VOZMOZHNYE ISSLEDOVANIYA

V chem raznica mezhdu dvumya sleduyushchimi operatorami? grep "$1" `find "$2" -print` i find "$2" -print | while read F do grep "$1" $F done Oni kazhutsya sovershenno pohozhimi, no sushchestvuet razlichie v glav- nom. Pervyj operator - eto odin vyzov komandy grep. Argumentami yavlya- yutsya mnozhestvo imen fajlov, postavlyaemyh komandoj find. Esli find sge- neriruet slishkom mnogo imen fajlov, to vypolnenie komandy zavershitsya. O tom, chto sgenerirovano slishkom mnogo imen fajlov, nikakogo predup- rezhdeniya ne vydaetsya, no bol'shoe kolichestvo fajlov fatal'no dlya grep. Poetomu my dolzhny rassmatrivat' takoj sintaksis kak nedopustimyj v ob- shchem sluchae. Vtoroj operator - eto cikl. On rabotaet medlennee i vyzyvaet grep mnogo raz, chto zabiraet mnogo vremeni central'nogo processora. Odnako polozhitel'nym momentom yavlyaetsya to, chto cikl poluchaet dannye po konve- jeru, kotoryj fakticheski ne imeet ogranichenij na chislo dannyh, kotoroe on mozhet imet'. Nasha programma nikogda neozhidanno ne prekratit vypol- nenie. 2.1.4. paths - nahozhdenie puti dostupa k ispolnyaemym fajlam, so special'nymi opciyami ------------------------------------------------------------ IMYA: paths ------------------------------------------------------------ paths Opredelitel' marshrutnyh imen fajlov so special'nymi opciyami

    NAZNACHENIE

Vyvodit na ekran katalog, v kotorom raspolagaetsya fajl, vydaet imya fajla v dlinnom formate ili ishchet fajly s ustanovlennym bitom pol'- zovatel'skogo identifikatora (setuid bit files) v katalogah po ukazan- nomu marshrutu.

    FORMAT VYZOVA

paths [-l] [-s] file [file ...]

    PRIMER VYZOVA

$ paths -l ed ex vi Vydaet v dlinnom formate imena fajlov, kotorye yavlyayutsya ispolnyae- mymi modulyami redaktorov ed, ex i vi

    TEKST PROGRAMMY

1 : 2 # @(#) paths v1.0 Path locator with special options Author: Russ Sage 2a Opredelitel' mestonahozhdeniya fajlov so special'nymi opciyami 4 FORMAT="path" 6 for ARG in $@ 7 do 8 if [ '`echo $ARG | cut -c1`" = "-" ] 9 then case $ARG in 10 -l) FORMAT="ls" 11 shift;; 12 -s) FORMAT="set" 13 set "1";; 14 *) echo $0: arg error" >&2 15 echo "usage: $0 [-l] [-s] file [file ...]" >&2 16 exit 1;; 17 esac 18 fi 19 done 21 IFS="${IFS}:" 23 for FILE in $@ 24 do 25 for DIR in $PATH 26 do 27 case $FORMAT in 28 path) if [ -f $DIR/$FILE ] 29 then echo $DIR/$FILE 30 fi;; 31 ls) if [ -f $DIR/$FILE ] 32 then ls -l $DIR/$FILE 33 fi;; 34 set) echo "\n:::::::::::::::::::" 35 echo "$DIR" 36 echo "::::::::::::::::::::" 37 ls -al $DIR | grep "^[^ ]*s[^ ]*";; 38 esac 39 done 40 done

    PEREMENNYE SREDY VYPOLNENIYA

ARG Soderzhit kazhdyj argument komandnoj stroki DIR |lement s imenem kataloga v peremennoj PATH FILE Soderzhit imya kazhdogo fajla v komandnoj stroke FORMAT Tip trebuemogo formata vyhodnyh dannyh IFS Peremennaya shell'a, razdelitel' polej PATH Peremennaya shell'a, puti k katalogam ispolnyaemyh modulej OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL paths? V nashej srede interpretatora shell peremennaya s imenem PATH so- derzhit imena katalogov, otdelennye drug ot druga simvolami dvoetochiya (:). Kazhdyj raz, kogda vy vvodite komandu posle priglasheniya shell'a, interpretator shell, nachinaya s pervogo kataloga, ukazannogo v peremen- noj PATH, smotrit, nahoditsya li vvedennaya vami komanda v etom katalo- ge. Esli da, to komanda vypolnyaetsya. Esli net, to shell idet v sleduyu- shchij katalog, ukazyvaemyj peremennoj PATH, i tak dalee, poka ne budut provereny vse katalogi. Esli komanda vse zhe ne budet najdena, to vy poluchite sleduyushchee soobshchenie ob oshibke: ------------------------- | | $ whatchamacallit | sh: whatchamacallit: not found | | Takoj poisk komandy osushchestvlyaetsya avtomaticheski, no sama sistema ne soobshchaet vam, GDE razmeshchena komanda. Nam neobhodima utilita, koto- raya ishchet i vyvodit na ekran marshrut k ukazannomu fajlu. Imeya takuyu utilitu, vy mozhete ispol'zovat' kratchajshie puti polucheniya togo, chto vam nuzhno, i vypolnyat' mnozhestvo razlichnyh tryukov. Vy mozhete kombini- rovat' podobnuyu komandu s drugimi komandami dlya sozdaniya gorazdo bolee moshchnyh sredstv. S marshrutom mozhno takzhe kombinirovat' komandy more, ls, file i cd sistemy UNIX. Vozmozhno, vy obnaruzhite i drugie komandy po mere eksperimentirovaniya. Komanda, neskol'ko pohozhaya na tu, kotoruyu my ishchem, sushchestvuet gde-to v mire sistemy UNIX Systev V. Naprimer, v sisteme AT&T eto ko- manda where. V sisteme UNIX Berkeley eto komanda which (tekst na yazyke Si-shell'a) ili whereis (ispolnyaemaya programma). Whereis daet dopolni- tel'nuyu informaciyu, takuyu kak mesto razmeshcheniya fajlov s ishodnymi tekstami (v kataloge /usr/src). Uvidev, kak my sozdaem nashu sobstven- nuyu komandu poiska marshruta, vy mozhete modificirovat' ee dlya obespeche- niya raboty s osobennostyami nekotoryh drugih komand i prisposobit' ta- kie veshchi k vashim nuzhdam. Prezhde chem my udovletvorim svoi prihoti, davajte beglo glyanem na komandu path, bolee prostuyu, chem paths. Vsya programma vyglyadit primer- no tak: IFS="${IFS}:" for FILE in $@ do for DIR in $PATH do if [ -f $DIR/$FILE ] then echo $DIR/$FILE fi done done Osnovnaya ideya ochen' prosta. Sperva my dobavlyaem dvoetochie (:) k razdelitelyu polej. Nam neobhodimo sohranit' znacheniya, prinyatye po umolchaniyu (probely, tabulyacii, simvoly novoj stroki), tak, chtoby my mogli vse-taki obrabatyvat' komandnuyu stroku s probelami v kachestve simvolov-razdelitelej. Simvol : daet nam vozmozhnost' otdel'no rassmat- rivat' kazhdyj marshrut, hranimyj v peremennoj PATH. Vsya programma predstavlyaet soboj dva cikla for. Vneshnij cikl prosmatrivaet imena vseh fajlov, ukazannyh v komandnoj stroke. Vnut- rennij cikl posledovatel'no obhodit vse katalogi, soderzhashchiesya v pere- mennoj PATH. Dlya kazhdogo fajla prosmatrivayutsya vse katalogi s cel'yu opredeleniya, soderzhit li etot katalog fajl s takim imenem. Polnoe marshrutnoe imya predstavlyaet soboj kombinaciyu prefiksa-kataloga i imeni fajla (nazyvaemyh imenem kataloga i bazovym imenem sootvetstvenno). Vstroennaya shell-komanda test ispol'zovana dlya opredeleniya togo, su- shchestvuet li fajl v opredelennom kataloge. Esli vasha peremennaya PATH vyglyadit tak: PATH=.:/bin:/usr/bin:/etc/:$HOME/bin to vnutrennij cikl vypolnit pyat' iteracij v takom poryadke: ., /bin, /usr/bin, /etc i, nakonec, $HOME/bin. Esli by zapros imel vid "path ll" dlya poiska utility, kotoruyu my sozdadim pozzhe v etoj glave, to re- zul'tat mog by vyglyadet' tak: --------------------------------------------- | | /usr/bin/ll | /usr/russ/bin/ll | | |to znachit, chto komanda ll byla najdena v dvuh mestah iz vashego nabora marshrutov poiska. CHTO DELAET paths? Teper', kogda my znaem, kak rabotaet bolee prostaya komanda path, my mozhem po dostoinstvu ocenit' dopolnitel'nye vozmozhnosti special'noj komandy polucheniya marshruta - komandy paths. Paths imeet tri osnovnye funkcii. Ona mozhet vypolnyat'sya kak osnovnaya komanda path, kotoruyu my uzhe rassmotreli, i davat' polnoe marshrutnoe imya ispolnyaemogo modulya. Ona mozhet vydavat' marshrut fajla v dlinnom formate. Ona takzhe mozhet vydat' spisok vseh fajlov s ustanovlennym pol'zovatel'skim identifika- torom (setuid bit files), kotorye est' v vashih marshrutnyh katalogah. (Sm. glavu 8, gde opisany bity setuid.) Sintaksis vyzova nemnogo otlichaetsya dlya raznyh opcij. Dlya togo chtoby ispol'zovat' format vydachi marshruta ili format komandy ls, nuzhna takaya komandnaya stroka: paths [-l] file [file ...] kak, naprimer, v komandah "paths ls who date" ili "paths -l ll". Dlya poiska fajlov s ustanovlennym pol'zovatel'skim identifikatorom (setuid files) ne nuzhno ukazyvat' imena fajlov v komandnoj stroke. Vsya komanda dolzhna byt' takoj: paths -s Format setuid i formaty vydachi marshruta yavlyayutsya vzaimoisklyuchayu- shchimi, poskol'ku predpolagaetsya, chto vy hotite uznat' ot komp'yutera, kakie i gde nahodyatsya fajly, a ne otgadyvat' imena fajlov. Esli v komandnoj stroke nahoditsya kakaya-to drugaya opciya, to v standartnyj vyvod vyvoditsya soobshchenie ob oshibke i komandnyj fajl za- vershaetsya. Opcii ustanavlivayut flag formata vyvoda v odno iz treh zna- chenij. Ves' dal'nejshij vyvod iz komandnogo fajla upravlyaetsya vybrannym formatom vyvoda.

    PRIMERY

1. $ paths ls more who paths /bin/ls /usr/bin/more /bin/who /usr/russ/bin/paths Poisk marshrutov k komandam ls, more, who, paths. Pri vyvode uka- zyvayutsya polnye absolyutnye marshrutnye imena. Obratite vnimanie, chto v konce imeni kazhdogo fajla pechataetsya simvol novoj stroki, chtoby polu- chit' raspechatku, v kotoroj kazhdoe imya fajla stoit v otdel'noj stroke. 2. $ more `paths gettydefs termcap paths` Esli vasha peremennaya PATH soderzhit katalog /etc, to etot primer budet rabotat'. Esli net, to pervye dva fajla ne budut najdeny. Snacha- la zapuskaetsya komanda paths, i ee vyvod pomeshchaetsya na svoe mesto v komandnoj stroke komandy more. Kogda zapuskaetsya komanda more, ona ne znaet, chto ee argumenty polucheny ot drugoj komandy. Posle zaversheniya raboty komandy paths komanda more prinimaet vid: more /etc/gettydefs /etc/termcap /usr/russ/bin/paths s polnymi marshrutnymi imenami kazhdogo fajla. |tot primer pokazyvaet, kak mozhno zastavit' komandu paths vypolnyat' vsyu rabotu po poisku i po- kazu fajlov, kotorye vy hotite uvidet'. 3. $ ll `paths ll` V etom primere v dlinnom formate vyvodyatsya fajly s imenami ll, kotorye najdet path. (My predstavim nashu versiyu komandy ll neskol'ko pozzhe v etoj zhe glave.) Kak i v predydushchem sluchae, snachala generiru- etsya informaciya o marshrute, zatem ona pomeshchaetsya v komandnuyu stroku, a zatem zapuskaetsya komanda ll. 4. $ m `paths paths` V dannom primere generiruetsya marshrutnoe imya samogo komandnogo fajla paths i peredaetsya programme m, kotoraya ispol'zuet komandu more dlya raspechatki. (Komandnyj fajl m my takzhe pokazhem vam pozzhe.)

    POYASNENIYA

V stroke 4 inicializiruetsya peremennaya FORMAT, ukazyvaya marshrut- nyj tip poiska. Vypolnyaetsya dejstvie po umolchaniyu, tochno takoe zhe, kak v komandnom fajle path, kotoryj my rassmotreli ranee. V strokah 6-19 vse argumenty komandnoj stroki proveryayutsya na kor- rektnost'. Kriteriem togo, chto argument est' opciya, yavlyaetsya defis v roli pervogo simvola. Zametim, chto zdes' ne razresheno ispol'zovanie sintaksisa "-xyz". |to zastavlyaet vas pol'zovat'sya sintaksisom "-x -y -z". Hotya etot moment mozhet pokazat'sya nesushchestvennym, na samom dele on vazhen. Vsegda nuzhno dostigat' kompromissa mezhdu bystroj razrabotkoj komandnogo fajla pri soglasii na nedostatki zhestkogo sintaksisa - i razresheniem gibkogo formata za schet dopolnitel'nyh usilij po kodirova- niyu i otladke i za schet bolee medlennogo vypolneniya. Vash vybor zavisit ot vashih prioritetov, ot kolichestva lyudej, ispol'zuyushchih vashe instru- mental'noe sredstvo, i ot togo, naskol'ko kritichna skorost' vypolne- niya. Konechno, esli skorost' kritichna, vy, veroyatno, zahotite ispol'zo- vat' kakim-to obrazom yazyk Si. My ostavlyaem obrabotku konkatenirovan- nyh opcij v kachestve uprazhneniya dlya chitatelya. Cikl for prohodit po vsem pozicionnym parametram. Esli pervym simvolom argumenta yavlyaetsya "-", to on sveryaetsya so spiskom dopustimyh argumentov s pomoshch'yu operatora case v strokah 9-17. Opciya "-l" izmenya- et peremennuyu formata, posle chego ubiraetsya iz rassmotreniya. |to dela- etsya dlya osvobozhdeniya etoj pozicii, chtoby konechnym rezul'tatom byli prosto imena fajlov v komandnoj stroke. Opciya "-s" takzhe izmenyaet peremennuyu formata. Odnako, vmesto to- go, chtoby ubrat' opciyu iz komandnoj stroki, ona likvidiruet vsyu ko- mandnuyu stroku i zamenyaet ee simvolom "l". |to zastavlyaet cikl for prohodit' tol'ko odnu iteraciyu, tak kak v komandnoj stroke teper' tol'ko odin parametr. Blagodarya takomu obrashcheniyu s komandnoj strokoj, nam ne nuzhen drugoj cikl: my mozhem ispol'zovat' tot zhe cikl, chto i v opredelenii marshruta, bez vsyakih modifikacij. Poskol'ku posle opcii s ne ozhidaetsya nikakih imen fajlov, my bol'she ne hotim rassmatrivat' ko- mandnuyu stroku. Esli ispol'zovana opciya, kotoraya ne yavlyaetsya ni l, ni s, to etoj opcii sootvetstvuet zvezdochka (*) i v standartnyj fajl oshibok vyvo- ditsya soobshchenie ob oshibke. Zatem komandnyj fajl zavershaetsya. My by mogli prosto proverit' pervyj parametr komandnoj stroki, chtoby vyyasnit', yavlyaetsya li on opciej, i esli yavlyaetsya, to ustanovit' etu opciyu. Poskol'ku mozhno ispol'zovat' tol'ko odnu opciyu za odin raz, my mogli by predpolagat', chto v ostal'noj chasti komandnoj stroki byli imena fajlov. Tem ne menee, etot cikl dopuskaet prostoe dobavlenie drugih opcij, kotorye mogli by dejstvovat' v dopolnenie k odnoj osnov- noj. |to bolee predpochtitel'no, i ono ne vliyaet na proizvoditel'nost'. V stroke 21 my dobavlyaem simvol dvoetochiya (:) k drugim simvolam razdelitelya polej. My dolzhny imenno dobavit' dvoetochie, a ne prevra- tit' razdelitel' polej tol'ko v dvoetochie. Esli by my sdelali posled- nee, to eto zaputalo by razbor imen fajlov v komandnoj stroke. Osnovnoj cikl predstavlen v strokah 23-40. |to dvojnoj cikl for. Vneshnij cikl prohodit po kazhdomu fajlu v komandnoj stroke, a vnutren- nij cikl obrabatyvaet kazhdyj katalog, ukazannyj v vashej peremennoj PATH. Obratite vnimanie, chto vneshnij cikl idet po imenam fajlov, a ne po zapisyam katalogov. Esli by my vybrali vtoroe, to v raspechatke naru- shilsya by poryadok imen fajlov, poskol'ku poisk shel by snachala po kata- logam. Sledovatel'no, dlya kazhdogo imeni fajla i kataloga dejstvie za- visit ot trebuemogo formata. Marshrutnyj format pechataet polnoe imya, listingovyj format vypolnyaet komandu ls, a format set ne ishchet ukazan- nye imena fajlov, no proveryaet prava dostupa i ishchet fajly s ustanov- lennym pol'zovatel'skim identifikatorom. Obrat PRIEMY PROFESSIONALXNOJ RABOTY V UNIX analogami. Opciya ls est' dopolnenie, kotoroe sokrashchaet ob容m raboty pri vyzove. Nalichie kombinacii poiska i komandy ls osvobozhdaet togo, kto vyzyvaet etot komandnyj fajl ot neobhodimosti primenyat' komandu podstanovki. Staraya i novaya komandy vyglyadyat primerno tak: ll `path ll` Nahodit put' k ll, a zatem zapuskaet na nem komandu ls -l. paths -l ll Nahodit put' i vmesto togo, chtoby ego napechatat', vypolnyaet komandu ls -l primenitel'no k etomu puti. Format setuid v stroke 34 proshchaetsya s podhodom "odin fajl za odin raz" i vklyuchaet katalogovuyu mashinu. Poskol'ku vneshnij cikl ustanovlen na odnu iteraciyu, vnutrennij cikl stanovitsya glavnym. Dlya kazhdogo ka- taloga, ukazannogo v PATH, pechatayutsya oformlenie iz dvoetochij i imya kataloga. |to delaet raspechatku priyatnoj, informativnoj i naglyadnoj. Klyuchevoj komandoj yavlyaetsya kombinaciya ls-grep. Kazhdoe imya fajla v kataloge raspechatyvaetsya v dlinnom formate, zatem prosmatrivaetsya bit ustanovki pol'zovatel'skogo identifikatora. Model' takova, chto komanda ls -al $DIR pechataet sleduyushchee: ------------------------------- | | -rws--x--x 1 root bin 16235 Sep 13 1985 /bin/su | | Argument "^[^ ]*s[^ ]*" oznachaet poisk ot nachala stroki simvola, otlichnogo ot probela, za kotorym sleduet odin ili bolee simvolov, ot- lichnyh ot probela, zatem simvol s i zatem odin ili bolee simvolov, ot- lichnyh ot probela. |to vyrazhenie ogranichivaet poisk bitami prav dostu- pa v nachale stroki. Esli imeetsya simvol s gde-libo v pravah dostupa (libo v pol'zovatel'skom identifikatore processa, libo v gruppovom identifikatore processa), to komanda grep otrabatyvaet uspeshno i pecha- taetsya vsya stroka. Takoj vid poiska ustanovlennogo pol'zovatel'skogo identifikatora neskol'ko "legkovesen" v tom smysle, chto poisk vedetsya tol'ko soglasno peremennoj PATH, kotoraya u vas est'. Fajly s ustanovlennym pol'zova- tel'skim identifikatorom mogut nahodit'sya v katalogah, kotorye ne uka- zany v PATH. Odnako v takoj realizacii dannaya opciya obespechivaet byst- roe obrashchenie k vashim lokal'nym fajlam s ustanovlennym pol'zova- tel'skim identifikatorom.

    VOZMOZHNYE MODIFIKACII

Dannyj komandnyj fajl otkryt dlya mnogih razlichnyh vidov modifika- cii. Poisk polnogo imeni fajla yavlyaetsya fundamental'noj zadachej prog- rammnogo obespecheniya po soprovozhdeniyu fajlov. |ta vozmozhnost' pozvolya- et nam polagat'sya na samu programmu paths ili ispol'zovat' paths v ka- chestve kuska bolee ob容mnoj programmy. Pri razrabotke vashih sobstvennyh programm sleduet obratit' vnima- nie na gibkost' komandnogo fajla paths, kotoraya vyrazhaetsya v otlichii mezhdu obrabatyvaemymi formatami. Pervye dva formata ispol'zuyut otdel'- nye fajly, a format set ispol'zuet katalogi. Dal'nejshie dopolneniya k komandnomu fajlu paths mogut kasat'sya lyuboj iz etih strok ili mogut kombinirovat' ih. Esli est' neobhodimost', programmnoe obespechenie mo- zhet prisposobit'sya k etomu.

    2.2. VYVOD INFORMACII

2.2.1. lc - vyvod fajlovoj informacii na ekran po stolbcam ------------------------------------------------------------- IMYA: lc ------------------------------------------------------------ lc Vydaet spisok fajlov v kolonochnom formate

    NAZNACHENIE

Vydaet informaciyu o fajlah v formate kolonok, pokazyvaya katalogi i ispolnyaemye moduli. |tot listing mozhno propustit' cherez komandu more.

    FORMAT VYZOVA

lc [-m] [ls options] file [file ...]

    PRIMER VYZOVA

lc -R $HOME Vydaet spisok vseh fajlov vo vseh podkatalogah moego registra- cionnogo kataloga.

    TEKST PROGRAMMY

1 : 2 # @(#) lc v1.0 List files in a column Author: Russ Sage 2a Vyvodit spisok fajlov v kolonochnom vide 4 if [ "$1" = "-m" ] 5 then MORE="| /usr/bin/more" 6 shift 7 else MORE="" 8 fi 10 eval "/bin/ls -a $@ | /bin/pr -5t" $MORE # pre System V 11 eval /bin/ls -aCF $@ $MORE # System V

    PEREMENNYE SREDY VYPOLNENIYA

MORE Soderzhit programmnyj kanal k komande more OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL lc? V mire komp'yuterov mnogie lyudi izobretayut koleso, a drugie lyudi izobretayut ego snova. Esli pervoe koleso ne togo razmera ili ne togo cveta, delaetsya drugoe koleso. V nashej konkretnoj situacii ishodnym kolesom yavlyaetsya komanda ls sistemy UNIX, kotoraya imeet nekotorye ne- dostatki v svoih rannih realizaciyah. Ona vydaet horoshuyu informaciyu, no ona pechataet imena fajlov tol'ko v odnu kolonku, chto privodit k nera- cional'nomu rashodovaniyu mesta i zatrudnyaet chtenie imen fajlov. Poeto- mu my sozdaem versiyu komandy ls, kotoraya otobrazhaet raspechatki v neskol'ko kolonok. Kak vidno iz predydushchego listinga, lc imeet dve formy. Odna pred- naznachena dlya sistem, bolee rannih, chem System V, a drugaya - dlya System V i posleduyushchih versij UNIX. Prichina v tom, chto System V versii 2 imeet novuyu komandu ls, kotoraya delaet imenno to, chto my hotim. Sistema Berkeley takzhe imeet versiyu komandy ls, kotoraya po umolchaniyu ispol'zuet neskol'ko kolonok pri vyvode na terminal. No dlya XENIX i rannih versij System V my dolzhny delat' eto sami. Delo v tom, chto hotya v vashej versii UNIX, XENIX ili chego-libo eshche mogut otsutstvovat' ko- mandy, imeyushchiesya v drugih versiyah, vy obychno mozhete postroit' to, chto vam nuzhno. |to mozhet potrebovat' opredelennyh usilij, i vashi programmy mogut rabotat' ne tak bystro i ne tak effektivno, no vy MOZHETE polu- chit' nuzhnoe sredstvo. Pol'zovatelyam interpretatorov csh i poslednego sh, imeyushchego funk- cii, vidimo, luchshe by zamenit' ves' etot scenarij na to, chtoby sdelat' lc psevdonimom (alias). Ispol'zovat' vozmozhnost' vvedeniya psevdonimov, chtoby prisvoit' imya lyuboj korrektnoj komandnoj stroke UNIX (naprimer, vyzovu komandy ls s ukazannymi opciyami). |to legche, chem pisat' komand- nyj fajl, no ogranichivaet vas neobhodimost'yu rabotat' s uzhe imeyushchimisya komandami ili opciyami. |to bystree, tak kak ne sozdaetsya nikakih do- polnitel'nyh processov. Pri rabote so starym interpretatorom sh my dolzhny projti cherez obychnuyu proceduru izgotovleniya komandnogo fajla i razmeshcheniya ego v ka- taloge bin. S drugoj storony, SCO XENIX System V reshaet etu problemu, svyazyvaya eti zhe imena (lc, lf, l) s obychnoj komandnoj ls i ispol'zuya vyzyvayushchee imya dlya opredeleniya formy raspechatki. Itak, zachastuyu imeetsya mnogo al'ternativ. Mastera UNIX, stalkiva- yas' s kakoj-libo problemoj, ne boryutsya s nej s pomoshch'yu Si ili komand- nogo fajla interpretatora shell. Poskol'ku oni znakomy s sushchestvuyushchimi resursami sistemy UNIX, oni mogut rassmotret' problemu i vybrat' stra- tegiyu, ispol'zuyushchuyu naimenee slozhnoe sredstvo, vypolnyayushchee dannuyu ra- botu s priemlemym urovnem proizvoditel'nosti. V poryadke vozrastaniya slozhnosti, eto mogut byt' neponyatnaya, no sushchestvuyushchaya komanda i/ili opciya, psevdonim, komandnyj fajl interpretatora shell ili programma na yazyke Si. CHTO DELAET lc? Obshchij podhod k razrabotke etoj komandy zaklyuchaetsya v tom, chtoby sobrat' vmeste nekotorye opcii i sdelat' novuyu komandu s bolee moshchnym interfejsom. CHtoby dostich' etoj moshchi, my mozhem sdelat' pre- ili post- processor dlya obychnoj komandy sistemy UNIX. Glavnaya zadacha zdes' - pechat' kolonok, poetomu my smotrim na op- cii komandy ls, chtoby zadejstvovat' ih. Konechno, my vklyuchaem opciyu -C. Kakie eshche opcii ls nam nuzhny? Obychno UNIX ne pechataet fajly, imena ko- toryh nachinayutsya s tochek, naprimer, .profile, esli tol'ko vy ne ukazy- vaete ls -a. |to zabyvaetsya pri prosmotre etih vazhnyh fajlov, poetomu my konstruiruem nashu komandu tak, chtoby ona pechatala ih po umolchaniyu. Nikakie fajly ne skryvayutsya ot nas. Dlya pol'zovatelej System V i BSD (ili dlya lyubogo, kto imeet opciyu -F), listing uluchshaetsya za schet vyvo- da "/" posle imeni kataloga i "*" posle ispolnyaemogo fajla. Rannyaya ko- manda ls sistemy UNIX ne imela vozmozhnosti pechatat' v takom stile. Ot- metim, chto dannoe ispol'zovanie termina "ispolnyaemyj" oznachaet pokaz togo, chto flagi prav dostupa imeyut bit "x", a ne to, chto eto fajl tipa a.out s magicheskim chislom. |to otlichie vazhno tem, chto delaet nash ko- mandnyj fajl bolee poleznym. Esli ozhidaetsya dlinnaya raspechatka, kak eto byvaet obychno dlya re- kursivnyh katalogov, to vy hotite imet' dostup k komande more. My vstraivaem komandu more tak, chtoby ee mozhno bylo aktivirovat' s po- moshch'yu opcii -m. Opciya -m dolzhna byt' pervoj opciej posle imeni koman- dy, iz-za sposoba, kotorym ona proveryaetsya vnutri programmy. Esli ona peredaetsya posle pervoj opcii, ona perehodit k komande UNIX ls i in- terpretiruetsya kak pechat' v potokovom formate. |to takoj format, v ko- torom vse imena raspolozheny v strokah, razdelennyh zapyatymi (,). Kak my uzhe otmechali, vy mozhete sdelat' interfejs etogo komandnogo fajla bolee gibkim za schet dopolnitel'noj raboty nad nim.

    PRIMERY

1. $ lc `path lc` Poluchaet polnoe imya dlya lc i raspechatyvaet fajlovuyu informaciyu v vide kolonok. 2. $ lc -m -R / Pechataet kolonochnyj spisok VSEH fajlov v sisteme, rekursivno pro- hodya vniz po ierarhii sistemnogo dereva i propuskaya raspechatku cherez komandu more. Eshche odin malen'kij fokus: etot sintaksis byl ispol'zovan dlya soz- daniya drugoj komandy, nazvannoj expose. Komandnaya stroka "lc -m -R $@" davala by rekursivnyj spisok vseh fajlov v lyubom kataloge po vashemu vyboru v priyatnom postranichnom formate. 3. $ lc -m -R /usr/lib Rekursivno raspechatyvaet spisok vseh fajlov vo vseh katalogah, nachinaya s /usr/lib, i propuskaet listing cherez komandu more. 4. $ lc -m . | more Vydaet spisok fajlov v tekushchem kataloge i propuskaet listing che- rez komandu more, a zatem snova propuskaet vse cherez more. Rabotaet li eto ? Nikoim obrazom. Voznikaet polnaya putanica, i klavisha preryvaniya obychno yavlyaetsya nailuchshim sposobom vyhoda iz dannoj situacii.

    POYASNENIYA

V strokah 4-8 proveryaetsya, yavlyaetsya li pervym argumentom komand- noj stroki -m - opciya komandy more. Esli eta opciya najdena, to v pere- mennuyu MORE zanositsya ukazanie konvejera i komanda more. Tem samym ustanavlivaetsya postobrabotka, kotoruyu sleduet primenit' k vyhodu ko- mandy ls. Zatem eta opciya ubiraetsya iz komandnoj stroki. |to delaetsya dlya togo, chtoby ostatok komandnoj stroki mozhno bylo peredat' komande ls, ne vyzvav pri etom nezhelatel'nyh effektov. Esli pervoj opciej ne yavlyaetsya -m, peremennoj MORE prisvaivaetsya nulevoe znachenie, chtoby ona vposledstvii ne vliyala na komandnuyu stroku. Stroka 10 - eto komandnaya stroka, kotoruyu vy by ispol'zovali na staroj UNIX-mashine tipa Version 7 ili System III. Ona ne imeet ni vstroennoj opcii dlya pechati simvolov kosoj cherty (/) i zvezdochek (*), ni vozmozhnosti pechati v vide kolonok. Vy dolzhny pozhertvovat' pervoj vozmozhnost'yu, a raspechatki v vide neskol'kih kolonok mozhno poluchit' s pomoshch'yu komandy pr sistemy UNIX. Komanda pr ispol'zovana s opciej "-5t", poetomu ona pechataet v pyat' kolonok (chto obychno priemlemo, no esli vstrechayutsya dlinnye imena fajlov, to pyati kolonok mozhet okazat'sya slishkom mnogo) i ne pechataet verhnij i nizhnij kolontituly. Blagodarya otkazu ot kolontitulov, 24-strochnyj format ne slishkom neudoben dlya vas. Otmetim, chto zdes' ispol'zovana komanda eval. |to special'naya vstroennaya komanda interpretatora shell, kotoraya vypolnyaet perevy- chislenie tekushchej stroki, podlezhashchej vypolneniyu. Interpretator shell povtorno analiziruet etu stroku, chtoby raskryt' znachenie imen peremen- nyh v komandnoj stroke i obespechit' raspoznavanie peremennyh kak tako- vyh. Zdes' my perevychislyaem peremennuyu MORE. Napomnim, chto my pomesti- li v etu peremennuyu konvejer. Esli my ne perevychislim komandnuyu stro- ku, to komanda pr popytaetsya otkryt' fajly "|" i "more", kotorye ne sushchestvuyut. Dlya togo, chtoby shell vmesto etogo vosprinyal eti simvoly kak ukazaniya konvejerov i programm, i ispol'zuetsya komanda eval. Stroka 10 imeet eshche odnu osobennost'. V komandnoj stroke uzhe est' odin konvejer. Otkuda shell znaet, traktovat' li simvol "|" kak imya fajla ili kak konvejer? Blagodarya tomu, chto argument komandy eval zak- lyuchen v kavychki. |to ukazyvaet komande eval sohranit' vse, chto naho- ditsya v kavychkah, bez izmenenij, no raskryt' znachenie peremennoj MORE i pomestit' ego v konec komandnoj stroki, nahodyashchejsya v kavychkah. Neskol'ko neponyatno, no esli vy dumaete ob etom paru let, ono stano- vitsya osmyslennym. Dlya teh iz vas, kto imeet novuyu komandu ls (System V, versiya 2 ili BSD 4.2), ne trebuetsya dva konvejera v komande. Kak pokazyvaet stroka 11, my poluchaem podhodyashchij kolonochnyj format iz samoj komandy ls, vmeste s pokazom vseh fajlov i special'nymi simvolami / i * dlya katalogov i ispolnyaemyh fajlov. Oboznachenie $@ otnositsya ko vsemu so- derzhimomu komandnoj stroki, t.e. k vashim dopolnitel'nym opciyam komandy ls i k imenam fajlov, spisok kotoryh vy hotite raspechatat'. Postupaya takim obrazom, my sozdaem fundament (opcii a,C,F), a vy mozhete nadstraivat' ego (ispol'zuya opcii R,t i t.d.). Skromnyj, no elegantnyj fokus zastavit' ls soobshchit' svoi opcii zaklyuchaetsya v tom, chtoby vyz- vat' ee s nevernoj opciej. Bol'shinstvo komand ne ispol'zuyut opcii z ili ?, poetomu vyzov "ls -z" ili "ls -?" privedet k takomu rezul'tatu: -------------------------------- | | ls: illegal option -- z | usage: -1ACFRabcdfgilmnopqrstux [files] | Vse eti opcii predstavlyayut opredelennyj interes. Esli vy chasto ispol'zuete kakie-libo iz nih, pomestite ih v komandnyj fajl lc, i vy poluchite vashu sobstvennuyu adaptirovannuyu komandu. Vy obratili vnimanie, chto vse obychnye komandy sistemy UNIX, ispol'zuemye v nashem komandnom fajle, imeyut polnye marshrutnye imena? |to mozhet pokazat'sya neskol'ko strannym, no prichina ukazaniya polnyh marshrutnyh imen v tom, chto kogda shell zapuskaet komandu, on ne dolzhen vozvrashchat'sya k analizu peremennoj PATH i iskat', gde raspolozhena ko- manda. Esli vy obrashchaetes' k komandam otnositel'nym sposobom, vremya poiska fajlov predstavlyaet soboj bol'shie nakladnye rashody. Kogda vy vyzyvaete lc, interpretator shell ishchet etu komandu, zatem lc vyzyvaet ls, kotoruyu tozhe nuzhno najti. Esli posle etogo rezul'taty propuskayutsya cherez more ili pr, to trebuetsya dopolnitel'nyj poisk. A polnye marsh- rutnye imena raspoznayutsya interpretatorom shell srazu zhe (on vidit, chto pervym simvolom yavlyaetsya /), i nuzhnaya komanda mozhet byt' vyzvana bystro. Izderzhki na poisk - edinstvennye izderzhki komandy lc. Ispol'zovanie polnyh imen, estestvenno, trebuet, chtoby vy znali, gde v sisteme razmeshcheny utility, k kotorym vy hotite obratit'sya. Vy mozhete primenit' komandu paths, chtoby poluchit' korrektnye polnye imena dlya zhestkogo ukazaniya ih v tekste vashego komandnogo fajla, a mozhete perepisat' dannyj komandnyj fajl pri perehode v druguyu sistemu. |to prosto eshche odna illyustraciya universal'nogo kompromissa mezhdu skorost'yu i effektivnost'yu, s odnoj storony, i gibkost'yu i mobil'nost'yu, s dru- goj. 2.2.2. ll - vyvod fajlovoj informacii v dlinnom formate ------------------------------------------------------------- IMYA: ll ------------------------------------------------------------- ll Vydaet spisok fajlov v dlinnom formate

    NAZNACHENIE

Vydaet spisok fajlov v dlinnom formate (-l). Raspechatku mozhno propustit' cherez komandu more.

    FORMAT VYZOVA

ll [-m] [ls options] file [file...]

    PRIMER VYZOVA

ll *.c Vydacha spiska fajlov s ishodnymi tekstami na yazyke Si v dlinnom formate.

    TEKST PROGRAMMY

1 : 2 # @(#) ll v1.0 Long listing of files Author: Russ Sage 2a Vyvodit spisok fajlov v dlinnom formate 4 if [ "$1" = "-m" ] 5 then MORE="| /usr/bin/more" 6 shift 7 else MORE="" 8 fi 10 eval /bin/ls -al $@ MORE

    PEREMENNYE SREDY VYPOLNENIYA

MORE Soderzhit stroku peredachi rezul'tatov po konvejeru komande more OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL ll? Motivy dlya sozdaniya komandy ll te zhe, chto my obsudili ranee dlya komandy lc. My mozhem ispol'zovat' ll dlya neskol'kih celej. Ona umen'- shaet kolichestvo trebuemyh nazhatij na klavishi, pozvolyaet izbezhat' neob- hodimosti pomnit' special'nye opcii i voobshche nastraivaet sistemu soot- vetstvenno nashim trebovaniyam vmesto togo chtoby nam prisposablivat'sya k sisteme. CHTO DELAET ll? Osnovoj etoj komandy yavlyaetsya izvestnaya komanda "ls -l". Ona, esli vy pomnite, daet ochen' emkuyu informaciyu o kazhdom fajle, vklyuchaya prava dostupa, svyazi, imya vladel'ca, razmer i tak dalee. (Kstati, programmisty, ispol'zuyushchie yazyk Si, mogut poluchit' etu informaciyu pri pomoshchi sistemnogo vyzova stat(2).) Poskol'ku takoj spisok pri nalichii mnozhestva fajlov mozhet legko perepolnit' ekran, to predostavlyaetsya op- ciya -m. Ona obespechivaet postranichnyj vyvod s pomoshch'yu komandy more. Otmetim, chto esli ispol'zuetsya eta opciya, to ona dolzhna stoyat' pervoj. Stroka simvolov, sootvetstvuyushchaya etoj opcii, udalyaetsya komandoj shift, tak chto ona ne smeshivaetsya s imenami fajlov i obychnymi opciyami komandy ls, kotorye peredayutsya kak argumenty. Posle opcii -m (esli ona est') ll dopuskaet ukazanie lyubyh drugih dopustimyh opcij komandy ls. Mozhno takzhe ispol'zovat' lyubuyu kombinaciyu imen fajlov. Zdes' primenimy obychnye sredstva porozhdeniya imen fajlov: * sootvetstvuet lyubym simvolam, ? - odnomu simvolu, a simvoly [] zada- yut diapazon iz nekotorogo nabora simvolov. V itoge my poluchili komandu ls, kotoraya po umolchaniyu rabotaet kak "ls -l", vyzyvaet komandu more s pomoshch'yu odnoj opcii vmesto neobhodimosti ukazaniya konvejera v komand- noj stroke i pri etom sohranyaet gibkost' komandy ls.

    PRIMERY

1. $ ll /etc/*mount* Vyvodit spisok vseh fajlov v kataloge /etc, imena kotoryh soder- zhat v kakom-libo meste slovo mount (naprimer, mount, umount, unmountable). 2. $ ll -i `who|awk '{print "/dev/" $2}'` Sperva vypolnyaetsya komanda who, zatem rezul'tat ee raboty po kon- vejeru peredaetsya komande awk, kotoraya vyrezaet imya ustrojstva i pri- pisyvaet emu prefiks /dev/. V rezul'tate spisok polnyh marshrutnyh imen ko vsem terminal'nym ustrojstvam, zaregistrirovannym v nastoyashchij mo- ment, pomeshchaetsya v komandnuyu stroku komandy ls -li. V raspechatke uka- zana vsya informaciya ob indeksnom deskriptore fajla (inode) dlya kazhdogo terminal'nogo ustrojstva. 3. $ ll `kind -a /lib` Vyvodit v dlinnom formate spisok vseh fajlov arhiva v kataloge /lib. |tot katalog soderzhit biblioteki kompilyatorov vseh yazykov siste- my UNIX. (Komanda kind, kotoraya otbiraet fajly po ih tipu, rassmatri- vaetsya v sleduyushchem razdele.) 4. $ ll -m -i /dev Vyvodit vsyu obychnuyu informaciyu plyus nomer indeksnogo deskriptora dlya vseh fajlov v kataloge /dev. Vydacha na ekran proishodit s pomoshch'yu komandy more.

    POYASNENIYA

Esli pervym pozicionnym parametrom yavlyaetsya -m, to v stroke 4 inicializiruetsya peremennaya MORE dlya podklyucheniya konvejera i programmy /usr/bin/more. (Vopros o tom, pochemu ispol'zuetsya absolyutnoe marshrut- noe imya, obsuzhdalsya v predydushchem razdele.) Zatem simvol'naya stroka -m komandoj shift ubiraetsya iz komandnoj stroki. Esli zhe pervoj opciej ne yavlyaetsya -m, to peremennaya MORE ustanavlivaetsya v nul', chtoby ne vli- yat' na povtornyj razbor komandnoj stroki, vypolnyaemyj s pomoshch'yu koman- dy eval (stroka 10). V stroke 10 komanda eval ispol'zovana dlya polucheniya rezul'tiruyu- shchej komandnoj stroki. Komanda ls vyzyvaetsya s opciyami -al (vydacha spiska vseh fajlov v dlinnom formate), kotorye my ustanovili po umol- chaniyu. Zatem berutsya argumenty komandnoj stroki (minus pervyj argu- ment, esli eto byl -m, kotoryj my ubrali komandoj shift). |timi argu- mentami mogut byt' dopolnitel'nye opcii komandy ls plyus imena fajlov ili katalogov. V konce stroki znachenie peremennoj MORE obespechivaet konvejer s komandoj more, esli byla ukazana opciya -m. V protivnom slu- chae znachenie peremennoj MORE ravno nulyu i ne okazyvaet nikakogo vliya- niya na analiz soderzhimogo komandnoj stroki. CHto proizoshlo by, esli by pol'zovatel' ukazal opciyu -m v kachestve vtoroj (ili posleduyushchej) opcii? V etom sluchae opciya -m peredalas' by komande ls. Komanda ls traktovala by etu opciyu kak "potokovyj vyvod", a eto sovsem ne to, chto my hoteli. Odnako komanda ls byla vyzvana tak- zhe s opciej -l, kotoraya otmenyaet opciyu -m v sootvetstvii s tekstom programmy ls. Vy ne poluchili by vyvod s pomoshch'yu komandy more, no vashi vyhodnye dannye po-prezhnemu byli by vyvedeny v pravil'nom formate. 2.2.3. kind - vyvod odnotipnyh fajlov ------------------------------------------------------------- IMYA: kind ------------------------------------------------------------- kind Vydacha spiska imen fajlov opredelennogo vida

    NAZNACHENIE

Vybiraet i vyvodit imena vseh fajlov v ukazannom kataloge (kata- logah), imeyushchih ukazannyj tip. Esli ne ukazan nikakoj tip, vybirayutsya tekstovye fajly.

    FORMAT VYZOVA

kind [-a] [-d] [-t] [-x] [file...]

    PRIMER VYZOVA

more `kind /etc/*` Vyvod komandoj more vseh tekstovyh fajlov, imeyushchihsya v katalo- ge /etc.

    TEKST PROGRAMMY

1 : 2 # @(#) kind v1.0 Prints files of the same kind Author: Russ Sage 2a Vyvodit spisok fajlov opredelennogo vida 4 if [ $# -gt 0 ] 5 then if [ `echo $1 | cut -c1` = "-" ] 6 then case #1 in 7 -a) KIND='archive' 8 shift;; 9 -d) KIND='data' 10 shift;; 11 -t) KIND='text' 12 shift;; 13 -x) KIND='executable' 14 shift;; 15 *) echo "kind: arg error" >&2 16 echo "usage: kind [-a] [-d] [-t] [-x] [file...]" >&2 17 echo " -a archive" >&2 18 echo " -d data" >&2 19 echo " -t text, default" >&2 20 echo " -x executable" >&2 21 echo " if no args, reads stdin" >&2 22 exit 1;; 23 esac 24 fi 25 fi 27 : ${KIND:='text'} 29 case $# in 30 0) while read FILE 31 do 32 file $FILE | fgrep $KIND | cut -d: -f1 33 done;; 34 *) file $@ | fgrep $KIND | cut -d: -f1;; 35 esac

    PEREMENNYE SREDY VYPOLNENIYA

FILE Soderzhit imena fajlov po mere ih chteniya iz stdin (standartnogo vvoda) KIND Soderzhit stroku, opredelyayushchuyu tip fajla OPISANIE ZACHEM NUZHEN KOMANDNYJ FAJL kind? Fajlovaya sistema UNIX imeet strogie standarty pri rassmotrenii fajlov. Imeetsya tri vida fajlov: obychnye fajly (teksty, dannye, ispol- nyaemye fajly), katalogi i ustrojstva. Kazhdyj vid fajlov imeet svoe prednaznachenie i obychno imeet osobye komandy ili fajly dannyh, kotorye rabotayut s nim. Davajte rassmotrim, kak nekotorye iz sushchestvuyushchih komand sistemy UNIX rassmatrivayut tipy fajlov. Komanda ls delaet razlichie mezhdu kata- logami i drugimi fajlami, poetomu ona mozhet byt' polezna. Drugoj vazh- noj komandoj yavlyaetsya komanda file. Ona soobshchaet vam, kakoj tip imeet dannyj fajl, chto potencial'no polezno, no slishkom malo. Dlya togo chtoby izvlech' iz komandy file kakuyu-libo poleznuyu informaciyu, vy dolzhny nadstroit' nad nej nekotoruyu programmu. CHto nam dejstvitel'no nuzhno, tak eto nekij gibrid komand ls i file, t.e. utilita, kotoraya vyvodit imena vseh fajlov ukazannogo tipa. Primerom poleznosti takogo roda utility mozhet sluzhit' analiz so- derzhimogo katalogov. Voz'mem, naprimer, katalog /etc. On soderzhit programmy, fajly dannyh i tekstovye fajly. Dlya kazhdogo iz etih tipov trebuetsya svoj sobstvennyj tip analiza. Programmy analiziruyutsya koman- dami ls, size, nm i file. Fajly dannyh analiziruyutsya komandoj od. Tekstovye fajly analiziruyutsya komandami more, wc, head, tail i drugi- mi. Takim obrazom, obychno vam neobhodimo rabotat' v dannyj moment vre- meni s fajlami kakogo-nibud' odnogo tipa. CHTO DELAET kind? Komandnyj fajl kind - eto utilita, kotoraya raspechatyvaet imena vseh fajlov, imeyushchih ukazannyj tip. Ona imeet interfejs, pohozhij na interfejs komandy ls, t.e. vy mozhete peredat' ej opcii i imena fajlov ili simvoly rasshireniya imen fajlov. Pri vyvode otobrazhayutsya polnye imena, esli oni byli ukazany, no vy mozhete izbezhat' poyavleniya lishnej informacii pri vyvode, esli predvaritel'no perejdete v nuzhnyj katalog s pomoshch'yu komandy cd. Naprimer, esli by ya nahodilsya v moem registraci- onnom kataloge (/usr/russ) i vvel komandu $ kind -d /etc/* to vyvod mog by vyglyadet' tak: -------------------------------- | | /etc/mnttab | /etc/utmp | /etc/wtmp | To est', vyvelsya spisok vseh fajlov dannyh. A esli by ya vypolnil takuyu posledovatel'nost' komand: $ cd /etc $ kind -d * to pri vyvode ubralsya by marshrut, ispol'zovannyj v vyzyvayushchej posledo- vatel'nosti, i napechatalos' by sleduyushchee: ----------------------------------------------- | | mnttab | utmp | wtmp | Zatem vyhod v takom vide mozhet byt' ispol'zovan vo vneshnej koman- de dlya raspechatki i analiza fajlovoj informacii. Dopustimymi opciyami komandy kind yavlyayutsya -a dlya fajlov arhivov, -d dlya fajlov dannyh, -t dlya tekstovyh fajlov (chto yavlyaetsya umolchani- em) i -x dlya ispolnyaemyh fajlov. Opredelenie etih tipov sootvetstvuet komande UNIX file. Zametim, chto kriterii togo, chto fajl yavlyaetsya ispolnyaemym, v komande file otlichayutsya ot teh, kotorye primenyaet ko- manda ls: ls proveryaet bity x v indeksnom deskriptore fajla, v to vre- mya kak file proveryaet, yavlyayutsya li pervye neskol'ko bajtov soderzhimogo fajla "magicheskim chislom". |to magicheskoe chislo yavlyaetsya identifikato- rom struktury a.out (sm. /usr/include/a.out.h), kotoryj soobshchaet "YA yavlyayus' skompilirovannoj Si-programmoj". Imena fajlov poyavlyayutsya v komandnoj stroke posle opcij. |ti imena mogut byt' porozhdeny lyubym standartnym metodom sistemy UNIX. Esli v komandnoj stroke net imen fajlov, to kind prevrashchaetsya v fil'tr i chi- taet standartnyj vvod dlya polucheniya spiska imen fajlov. (Obratite vni- manie, chto ya skazal "imen fajlov", a ne "fajlov". Mozhno ispol'zovat' opcii, poskol'ku oni ubirayutsya iz komandnoj stroki komandoj shift po mere togo, kak oni vstrechayutsya.) Takim obrazom, vy mozhete ispol'zovat' drugie komandy dlya togo, chtoby peredat' po konvejeru spisok fajlov utilite kind. Ona otfil'trovyvaet i vyvodit tol'ko te iz nih, kotorye sootvetstvuyut nuzhnomu vam tipu.

    PRIMERY

1. $ od `kind -d /etc/*` Vyglyadit tak, kak budto eto dolzhno rabotat', no komanda od ne ra- botaet s naborom imen fajlov. Ona mozhet obrabatyvat' tol'ko odin fajl v dannyj moment vremeni. 2. $ ll `sh -x kind -a /lib/*` | m |to dlinnyj primer. Vyvodit v dlinnom formate spisok vseh fajlov arhivov, kotorye nahodyatsya v kataloge /lib. My zapuskaem shell v otla- dochnom rezhime vypolneniya, tak chto vy mozhete uvidet' kazhduyu komandnuyu stroku pered ee vypolneniem. Rezul'tat po konvejeru peredaetsya komande more. 3. # find / -print | kind -x | while read FILE > do > ll $FILE > done > /tmp/filelist Dannyj cikl obnaruzhivaet vse dejstvitel'no ispolnyaemye fajly. Dlya kazhdogo iz nih vypolnyaetsya komanda "ls -l". Otmetim, chto zdes' komanda ll vyzyvaetsya dlya kazhdogo imeni fajla. Vy mogli by vypolnit' tu zhe operaciyu pri pomoshchi takogo operatora find: # find / -perm -0111 -exec ll {} \; no opciya perm v dannom sluchae opyat' zhe proveryaet bity prav dostupa v indeksnom deskriptore fajla, a ne ishchet magicheskoe chislo v strukture a.out, kak opisano ranee. Kstati, dlya togo, chtoby vy mogli uspeshno za- pustit' komandu file (i tem samym kind) na sistemnyh fajlah, vy dolzhny imet' prava chteniya, chtoby mozhno bylo prochitat' magicheskoe chislo. 4. $ for F in `kind /bin/* /usr/bin/* /etc/*` > do > fgrep "trap" $F /dev/null > done $ fgrep "trap" `kind /bin/* /usr/bin/* /etc/*` $ find /bin /usr/bin /etc -exec fgrep "trap" {} \; |to tri razlichnyh sposoba poiska slova "trap" vo vseh tekstovyh fajlah.

    POYASNENIYA

Opcii, kotorye mogut byt' ukazany v komandnoj stroke, dolzhny byt' samym pervym argumentom. |to sozdaet bolee strogij sintaksis, po koto- romu mozhno vylovit' oshibku. No eto neskol'ko ogranichivaet gibkost'. Kak bylo ranee otmecheno, vy mozhete, esli hotite, po-svoemu razreshit' kompromiss mezhdu effektivnost'yu i gibkost'yu putem dopolnitel'nogo programmirovaniya. V stroke 4 proveryaetsya, vklyucheny li kakie-libo parametry. Esli parametry est', to oni obrabatyvayutsya. Esli ne ispol'zuyutsya nikakie parametry, nichego ne delaetsya i upravlenie peredaetsya na stroku 27. Esli byli ispol'zovany kakie-libo argumenty i pervym simvolom yav- lyaetsya znak minusa (-), to vypolnyaetsya operator case dlya opredeleniya togo, kakoj tip fajla ukazan. Peremennaya KIND ustanavlivaetsya v soot- vetstvii s tipom fajla, i dannyj parametr udalyaetsya iz komandnoj stro- ki komandoj shift. Esli argument ne sovpadaet ni s odnoj iz dopustimyh opcij, to emu sootvetstvuet sluchaj *, chto oznachaet oshibku. Na stan- dartnoe ustrojstvo registracii oshibok vyvoditsya sootvetstvuyushchee soob- shchenie ob oshibke i sintaksicheskaya podskazka, posle etogo kind zaversha- etsya s plohim statusom vypolneniya. V stroke 27 proizvoditsya proverka togo, ustanovlena peremennaya KIND ili ravna nulyu. Esli ona ravna nulyu, v nee podstavlyaetsya simvol'- naya stroka "text". Esli KIND uzhe ustanovlena, to ona ne menyaetsya. |to neplohoj operator prisvoeniya znacheniya po umolchaniyu. Takim obrazom, pol'zovatel' ne obyazan ukazyvat' opciyu -t v komandnoj stroke. Esli zhe opciya -t byla ukazana, to ej est' chto sopostavit' v operatore case. Ostavshayasya chast' programmy v strokah 29-35 predstavlyaet soboj eshche odin operator case, kotoryj proveryaet kolichestvo argumentov, ostav- shihsya v komandnoj stroke posle obrabotki oshibok. Esli byla ukazana ka- kaya-libo opciya, to peremennaya KIND ustanovlena i opciya ubrana komandoj shift. V komandnoj stroke mogli ostat'sya tol'ko argumenty, kotorye yav- lyayutsya imenami fajlov ili marshrutami. Esli k tomu vremeni, kogda my uzhe gotovy k zaklyuchitel'noj obrabotke, ne ostalos' nikakih argumentov, to znachit v komandnoj stroke ne bylo ukazano ni odnogo imeni fajla. V etom sluchae v strokah 30-33 organizovyvaetsya cikl, kotoryj chi- taet imena fajlov iz standartnogo vvoda, zapuskaet komandu file i ispol'zuet komandu fgrep dlya opredeleniya togo, sootvetstvuet li tip fajla, vydannyj komandoj file, interesuyushchemu nas tipu (hranimomu v pe- remennoj KIND). Zatem my ispol'zuem komandu cut dlya vydeleniya togo, chto nam nuzhno. Obychnyj vyvod komandy file soderzhit imya fajla, dvoeto- chie i zatem opisanie. Nam nuzhno tol'ko imya fajla, poetomu my vyrezaem pervoe pole, ispol'zuya razdelitel' ":". Kogda nikakie dannye bol'she ne postupayut, cikl while zavershaetsya, my popadaem v konec operatora case i vyhodim iz programmy. Esli zhe argumenty NAJDENY v komandnoj stroke, to vmesto vsego etogo vypolnyaetsya vetv' operatora case v stroke 34. S pomoshch'yu obozna- cheniya $@, imena vseh fajlov v komandnoj stroke vklyucheny v komandu file. Takim obrazom, ne nuzhen nikakoj cikl. Vo vsem ostal'nom obrabot- ka identichna stroke 32.

    VOZMOZHNYE MODIFIKACII

Bylo by neploho, esli by komandnyj fajl kind mog rabotat' odnov- remenno s raznymi tipami fajlov. |to oznachaet nalichie neskol'ko opcij v komandnoj stroke, naprimer -a i -d. Vam mogla by ponadobit'sya sostavnaya stroka, v kotoroj kazhdaya chast' byla by otdelena simvolom |. Zatem eta stroka mogla by byt' ispol'zovana v komande egrep, naprimer, "egrep 'archive|data'". Vam prishlos' by organizovat' cikl po komandnoj stroke vmesto ispol'zovaniya fiksirovannyh pozicij i ubedit'sya v tom, chto vy ne poluchite zaciklivshijsya konvejer, kogda zadana tol'ko odna opciya. 2.2.4. m - prostoj dostup k komande more ------------------------------------------------------------- IMYA: m ------------------------------------------------------------- m Prostoj dostup k komande more

    NAZNACHENIE

Obespechivaet bystryj i prostoj sposob postranichnogo vyvoda

    FORMAT VYZOVA

m [more options] [file ...]

    PRIMER VYZOVA

m * Vyvod komandoj more vseh fajlov tekushchego kataloga

    TEKST PROGRAMMY

1 : 2 # @(#) m v1.0 Easy access to more 2a Prostoj dostup k komande more 4 /usr/bin/more $@ OPISANIE ZACHEM NUZHEN KOMANDNYJ FAJL m? Sistema UNIX sil'no zagromozhdaetsya po mere svoego funkcionirova- niya. V nej obychno imeetsya mnozhestvo tekstov i dannyh. Prosmotr gromad- nogo kolichestva dannyh trebuet mnogokratnogo nazhatiya na klavishi, esli vy dolzhny vruchnuyu upravlyat' postranichnym vyvodom ili periodicheski vy- zyvat' komandu more. Nam neobhodimy programmnye sredstva, kotorye po- mogut nam uskorit' etu rabotu. Odnim iz takih sredstv yavlyaetsya m. Ono ochen' korotkoe i prostoe, no eto ne znachit, chto ono bespolezno. Imeetsya dva osnovnyh sposoba vyvoda dannyh na ekran. Pervyj sposob - neposredstvennyj vyzov komandy, naprimer, "more datafile". Vy napravlyaete dannye na ekran samoj komandoj. Vtoroj sposob - ispol'zo- vat' kakuyu-nibud' komandu dlya polucheniya dannyh, a zatem v konce pereh- vatit' ih komandoj more, naprimer "od -c . | more". V oboih etih slu- chayah my vvodim s klaviatury mnogo simvolov. Sdelav tak, chtoby komanda more vyzyvalas' po odnomu simvolu, my mogli by umen'shit' poslednie dve komandy na shest' nazhatij na klavishi. Za celyj den' eto hot' nemnogo predohranit klaviaturu ot razrusheniya! (Esli vasha sistema podderzhivaet vyzov komand po psevdonimam (aliasing), to, kak ukazyvalos' ranee, vy mogli by ispol'zovat' v etom sluchae komandu alias: "alias m more".) CHTO DELAET m? Nadeemsya, vse vashi sistemy imeyut komandu more ili hotya by ee za- menu. Postranichnyj vyvod imeet vazhnoe znachenie pri rabote s tekstom bol'shogo ob容ma. Vse opcii i argumenty peredayutsya v komandnoj stroke. Vy mozhete ukazat' opcii komandy more v komandnoj stroke komandy m. Oni pereda- yutsya bez izmenenij. Mozhno ukazat' imena fajlov. Esli oni ukazany, ko- manda more vyvodit ih. V protivnom sluchae ozhidaetsya postuplenie dannyh so standartnogo vvoda. Takim obrazom, m mozhet byt' ispol'zovana v ka- chestve "perehvatchika" ili kak fil'tr, kak i komanda more. Dlya teh, kto ne slishkom znakom s opciyami komandy more, otmetim, chto sushchestvuyut dve izyashchnye vozmozhnosti: 1) vhod v redaktor vi v tom meste, gde nahoditsya kursor pri vyvode komandoj more; 2) vyhod iz more dlya zapuska komandy shell i vozvrat v to mesto, otkuda vy vyshli. Per- vaya opciya vypolnyaetsya pri nazhatii klavishi "v" v stroke sostoyaniya ko- mandy more. (To est' kogda more otobrazila polnyj ekran teksta i zhdet prodolzheniya.) Vtoraya opciya zapuskaetsya pri vvode ":!cmd" ili "!cmd". Kogda komanda vypolnitsya, more vernetsya v to zhe mesto. Kak vidite, eto sintaksis komandnoj stroki ex. Komanda more v samom dele imeet nebol'- shuyu chast' redaktora ex, spryatannuyu vnutri nee. Vy mozhete vypolnit' mnogie komandy redaktora, ukazyvaya ih posle podskazki v stroke sostoya- niya komandy more. Obychnyj seans raboty vyglyadit tak: -------------------------- | | m `path termcap` <-poisk tablicy opisaniya ter- | minala (termcap) i vyvod | . ee komandoj more . . --More--(5%) <-stroka sostoyaniya more v vi /etc/termcap vi +210 /etc/termcap <-komandnaya stroka dlya redak- tora vi poluchena ot more . . :q <-vyhod iz vi --More--(5%) <-vozvrat v more :!sh porozhdenie novogo shell'a $ date zapusk komandy date Wed Apr 23 07:15:04 PST 1986 $ ^d <-ubrat' porozhdennyj shell --More--(5%) <-vozvrat v more :f raspechatka imeni fajla, vyvodimogo komandoj more "/etc/termcap" line 54 vyhod komandy f --More--(5%) f <-komanda more dlya propuska polnogo ekrana .skipping 23 lines . . --More--(9%) <-propusk i vydacha teksta q vyhod iz komandy more

    PRIMERY

1. $ ll -R / | m Nachinaya s kornevogo kataloga (/), vyvesti v dlinnom formate (ll) vse fajly (opciya -a podrazumevaetsya v ll) vsej sistemy (-R) i postra- nichno raspechatat' na ekran (| m). 2. $ m `path inittab rc passwd` Obnaruzhit' i vyvesti s pomoshch'yu more sistemnye fajly inittab, rc i passwd. Nepriyatnost' zdes' zaklyuchaetsya v tom, chto dannyj marshrut sko- ree vsego otnositsya k katalogu /bin/passwd, a ne /etc/passwd (poskol'- ku katalog /etc razmeshchaetsya v konce katalogov), a eto oznachaet, chto vy mozhete popytat'sya vyvesti na ekran ispolnyaemyj fajl. V zavisimosti ot togo, kakuyu iz versij komandy more vy zapustili, eto mozhet privesti k chemu ugodno nachinaya s soobshcheniya komandy more o tom, chto eto byl ne tekstovyj fajl, i zakanchivaya tem, chto vash terminal nachnet pokazyvat' neponyatnye simvoly i dazhe zavisnet.

    POYASNENIYA

Poskol'ku v etom komandnom fajle ne tak mnogo teksta, to vse do- vol'no ponyatno, net ni obrabotki oshibok, ni drugih dopolnenij. Prosto nehitryj vyzov komandy more. Polnoe imya zdes' ukazano s cel'yu povyshe- niya bystrodejstviya, kak my obsuzhdali ranee. Vy dolzhny pereproverit' mestonahozhdenie vashej komandy more. V sisteme Berkeley ona mozhet naho- dit'sya v kataloge /usr/ ucb/more. Vospol'zujtes' komandoj path more dlya opredeleniya etogo mesta i vstav'te sootvetstvuyushchij marshrut vmesto ukazannogo nami. Kstati, fokus popadaniya etoj simvol'noj stroki v tekst vashego ko- mandnogo fajla sostoit v tom, chtoby vojti v redaktor i vyzvat' sleduyu- shchuyu komandu: :.!path more Zdes' proishodit perehod v shell i zapusk komandy path (:!), za- tem vyhod komandy path (kotoryj predstavlyaet soboj polnoe marshrutnoe imya) pomeshchaetsya v bufer redaktora v samom nachale tekushchej stroki (.). Posle etogo vy imeete eti dannye v vashem redaktiruemom fajle i pri ne- obhodimosti mozhete otredaktirovat' ih. 2.2.5. mmm - obrabotka programmoj nroff makrokomand dlya rukopisej -------------------------------------------------------------- IMYA: mmm -------------------------------------------------------------- mmm Komandnaya stroka nroff dlya makrosov obrabotki rukopisej

    NAZNACHENIE

Vyzyvaet tekstovyj processor nroff so special'nymi opciyami, koto- rye inicializiruyut makrosy obrabotki rukopisej.

    FORMAT VYZOVA

mmm file [...]

    PRIMER VYZOVA

mmm memo Obrabotat' s pomoshch'yu nroff fajl moih zametok memo i otobrazit' ego na ekran

    TEKST PROGRAMMY

1 : 2 # @(#) mmm v1.0 Nroff command line with mm macros Author: Russ Sage 2a Komandnaya stroka nroff s makrosami mm 4 if [ "$#" -eq 0 ] 5 then echo "mmm: wrong arg count" >&2 6 echo "usage: mmm file [...]" >&2 7 exit 1 8 fi 10 LIST="" 11 for ARG in $* 12 do 13 if [ ! -f $ARG ] 14 then echo "mmm: $ARG is not a regular file" >&2 15 else LIST="$LIST $ARG" 16 fi 17 done 19 nroff -r0O -mm $LIST

    PEREMENNYE SREDY VYPOLNENIYA

ARG Soderzhit kazhdyj pozicionnyj parametr komandnoj stroki LIST Soderzhit spisok proveryaemyh imen fajlov OPISANIE ZACHEM NUZHEN KOMANDNYJ FAJL mmm? Odnim iz faktov delovogo mira yavlyaetsya rabota s bumagami. My pro- izvodim zametki, pis'ma, kontrakty, dokumenty, rukovodstva i tak da- lee. Esli vy znakomy so stilem proizvodstva dokumentacii v sisteme UNIX, to vashi tekstovye fajly v osnovnom predstavleny v odnom iz for- matov programmy nroff. Odnako razlichnye programmy formatirovaniya tekstov sluzhat razlich- nym celyam. Imeetsya standartnyj nroff i nroffs dopolneniyami, takimi kak makrosy ms i mm. Dlya podgotovki graficheskoj informacii i vypolne- niya tipografskih rabot razrabotana programma troff. Sistema AT&T imeet celuyu programmnuyu sredu pod nazvaniem Writers Workbench, i sistema Berkeley imeet analogichnye vozmozhnosti. Bol'shinstvo nashih zadach po napisaniyu kakih-libo tekstov mozhet byt' svedeno k neskol'kim standartnym formatam, takim kak pis'ma, ru- kopisi voobshche, stranicy rukovodstv i tak dalee. Ne tak legko zapomnit' opcii komandy nroff (ili drugoj komandy), kotorye sleduet ispol'zovat' v dannom sluchae, da my i ne dolzhny delat' eto. Nasha komanda mmm sluzhit illyustraciej programmy, kotoruyu my mozhem zapuskat' vsyakij raz, kogda nam nuzhen opredelennyj format. Vy mozhete sozdat' neskol'ko versij programmy, kotorye udovletvoryayut vashim sobstvennym nuzhdam pri napisa- nii tekstov. Ispol'zovanie zagotovlennyh zaranee komand oznachaet, chto my mozhem delat' poleznuyu rabotu, dazhe esli nekotoroe vremya my ne vypolnyali ra- botu opredelennogo vida. My takzhe mozhem izbezhat' mnogokratnyh nazhatij na klavishi. Mastera UNIX'a periodicheski uedinyayutsya v svoih gornyh ube- zhishchah, gde shtudiruyut spravochnye rukovodstva v poiskah poleznyh, no dosele nezamechennyh opcij, kotorye mogut byt' vstroeny v programmnye sredstva dlya povsednevnoj raboty. Esli slishkom nekritichno polagat'sya na vash tekushchij nabor instrumental'nyh sredstv, to mozhno propustit' po- leznye vozmozhnosti. CHTO DELAET mmm? Komandnyj fajl mmm - eto interfejsnyj processor dlya komandy nroff. Pod slovom "interfejsnyj" my podrazumevaem, chto on obrabatyvaet vyzyvayushchuyu komandnuyu stroku i ustanavlivaet vse opcii dlya vyzova prog- rammy nroff. Nekotorye iz opcij nroff zhestko zaprogrammirovany v vyzo- ve. |ti opcii inicializiruyut otdel'nye chasti programmy nroff. Esli vy ne vklyuchaete nikakie argumenty, mmm raspoznaet eto kak oshibku i vyvodit sintaksicheskuyu podskazku. Obratite vnimanie, chto esli vy peredadite mmm takoj argument, kak -z, to etot argument budet rassmatrivat'sya kak imya fajla, a ne kak podlezhashchaya peredache opciya, i eto snova vyzovet oshibku. Vtoraya oshibka ne yavlyaetsya fatal'noj, v to vremya kak pervaya fatal'na. Posle obrabotki vseh argumentov programma nroff ispol'zuet imena fajlov v kachestve fajlov s vhodnymi dannymi. Po umolchaniyu vyvod proiz- voditsya v stdout (standartnyj vyvod). Obychno eto ekran vashego termina- la, no vyvod mozhet byt' pereadresovan ili peredan po konvejeru na ust- rojstvo pechati ili kuda-libo eshche.

    PRIMERY

1. $ mmm nroffile | m Zapusk komandy nroff primenitel'no k fajlu nroffile, vyvod re- zul'tata na ekran s peredachej po konvejeru komande more. |to polezno pri izuchenii utility nroff, provedenii eksperimentov s razlichnymi ko- mandami i nablyudeniya za sootvetstvuyushchimi rezul'tatami. 2. $ for F in proj.? do mmm $F > $F.rf done Obrabotka v cikle vseh fajlov, imena kotoryh soderzhat simvol'nuyu stroku "proj.", za kotoroj sleduet odin simvol. |to mogut byt' proj.1, proj.2 i tak dalee po vsemu naboru simvolov vplot' do proj.z, proj.{, proj.|, proj.} i proj.~, esli schitat', chto u vas est' fajly, imena ko- toryh soderzhat eti simvoly. Kazhdyj fajl obrabatyvaetsya, i vyhod nroff perenapravlyaetsya v fajl s takim zhe imenem, dopolnennym simvolami .rf. 3. $ mmm status[12] | lpr -o5 Obrabotka komandoj nroff fajlov status1 i status2. Vyhod v stan- dartnyj vyvod peredaetsya po konvejeru programme lpr. Programma lpr yav- lyaetsya fil'trom i prinimaet ili imena fajlov v komandnoj stroke, ili neposredstvenno dannye, peredavaemye ej po konvejeru (no ne to i dru- goe srazu). Opciya -o5 ukazyvaet lpr smestit' stranicu na 5 simvolov.

    POYASNENIYA

V stroke 4 proveryaetsya, ravno li nulyu kolichestvo argumentov v ko- mandnoj stroke. Esli da, v standartnyj fajl oshibok vydaetsya soobshchenie ob oshibke. Vyvoditsya takzhe sintaksicheskaya podskazka, i mmm zavershaetsya s plohim statusom. Peremennaya LIST inicializiruetsya nulevym znacheniem v stroke 10. Obychno peremennye interpretatora shell i tak v nachale ravny nulyu, no predvaritel'naya ustanovka znacheniya yavlyaetsya horoshim stilem programmi- rovaniya. Zatem my obrabatyvaem kazhdyj argument komandnoj stroki v cikle (stroki 11-17). Vse argumenty dolzhny byt' imenami fajlov, poetomu kazh- dyj iz nih proveryaetsya na to, sushchestvuet li on kak obychnyj fajl. Esli eto ne fajl, to v standartnyj fajl oshibok vyvoditsya soobshchenie ob oshib- ke. Tem ne menee programma ne zavershaetsya. Ne sleduet avarijno prekra- shchat' vsyu programmu tol'ko potomu, chto net ukazannogo fajla. My pro- puskaem ego i idem do konca spiska argumentov. |to osobenno aktual'no, esli dannaya komanda ispol'zuetsya kak fonovaya vo vremya vypolneniya dru- goj raboty. Pol'zovatel' skoree soglasitsya s tem, chtoby bylo vypolneno pobol'she raboty, chem ne sdelano voobshche nichego. |to reshenie, prinyatoe v dannoj programme, i vy mozhete izmenit' ego, esli ono ne podhodit v va- shej situacii. Esli imeni sootvetstvuet dopustimyj fajl, ono dobavlyaetsya v spisok horoshih imen fajlov. |tot spisok stanovitsya glavnym spiskom dlya komandy nroff. Posle togo kak vse argumenty provereny, my v stroke 9 stroim i vypolnyaem komandnuyu stroku nroff. Opciya -rO0 dlya nroff ukazyvaet makrosam obrabotki rukopisej (pa- ketu mm) ustanovit' registr, kotoryj imeet delo s otstupom teksta, v sostoyanie, sootvetstvuyushchee otstupu v 0 simvolov. |to znachit, chto ves' tekst nachinaetsya s krajnej levoj pozicii, t.e. vyrovnen sleva. Putem provedeniya eksperimentov ya obnaruzhil, chto levoe vyravnivanie teksta programmoj nroff i ustanovka otstupa dlya printera daet naibolee nadezh- nyj vyvod na pechat'. V protivnom sluchae, esli vy ustanovite otstup teksta v nroff i otstup v printere, to mozhet proizojti nastoyashchee stolk- novenie, kogda delo kosnetsya vyvoda kolonok v stranice. Vy mozhete iz- menit' eto mesto, esli vashi programmy vyvoda ili ustrojstva pechati ve- dut sebya kak-to inache. Opciya -mm ukazyvaet programme nroff prosmotret' biblioteku makrosov obrabotki rukopisej, chtoby opredelit', ispol'zu- yutsya li kakie-libo iz nih vo vhodnom dokumente. |ti makrosy ochen' bol'shie i trebuyut mnogo vremeni central'nogo processora. Esli vam ne- obhodimo ispol'zovat' ih, to vam potrebuetsya bol'shoj komp'yuter ili komp'yuter, special'no prednaznachennyj dlya etoj celi, chtoby dobit'sya horoshego vremeni polucheniya rezul'tata. Poslednim argumentom yavlyaetsya $LIST. V etoj peremennoj nahoditsya stroka imen fajlov, razdelennyh probelami. |ti imena pomeshchayutsya v ko- mandnuyu stroku nroff. Mozhete byt' uverennymi, chto v etom meste net ni- kakih oshibok.

    VOZMOZHNYE MODIFIKACII

Poskol'ku vse argumenty rassmatrivayutsya kak imena fajlov, to u nas net sposoba peredachi dopolnitel'nyh komand paketu mm. Nalichie ta- koj vozmozhnosti bylo by zhelatel'nym, poskol'ku pri eksperimentirovanii s komandoj nroff vam neobhodimo probovat' razlichnye opcii, chtoby uvi- det', kak oni dejstvuyut. Bylo by tyazheloj rabotoj vypolnyat' redaktiro- vanie teksta mmm, chtoby dobavit' odnorazovye opcii, kotorye mogut vam nikogda ne ponadobit'sya ili opcii, kotorye vy dolzhny postoyanno menyat'. Odin iz putej dostizheniya bol'shej gibkosti - posmotret', imeet li kakoj-libo argument defis v kachestve pervogo simvola. Esli da, pereh- vatit' etu opciyu i ubrat' ee iz spiska imen fajlov. Posle etogo vy by imeli spisok opcij, kotorye nuzhno vklyuchit' v komandnuyu stroku, i spisok imen fajlov, podlezhashchih obrabotke. Otmetim, chto mesto, zanyatoe v nashem komandnom fajle ukazaniem pa- keta mm, mozhno vmesto etogo zapolnit' ssylkoj na drugie makropakety, imeyushchiesya v vashej sisteme, naprimer -ms ili -me, v zavisimosti ot nuzh- nogo vam formata. Otkaz ot poiska makrosov, kotorye vam ne nuzhny, uskorit obrabotku: podrobnosti vy najdete v dokumentacii po nroff ili troff. 2.2.6. pall - pechat' vseh fajlov v dereve ------------------------------------------------------------- IMYA: pall -------------------------------------------------------------- pall Raspechatka vseh fajlov v dereve katalogov

    NAZNACHENIE

Nahodit vse fajly v zadannom kataloge v sootvetstvii s nekotorym kriteriem, razbivaet fajly na stranicy i pomeshchaet rezul'tat v odin fajl, gotovyj k raspechatke na printere.

    FORMAT VYZOVA

pall [-t|-d] directory

    PRIMER VYZOVA

pall /usr/lib Vyvodit na pechat' postranichno vse tekstovye fajly v kataloge /usr/lib

    TEKST PROGRAMMY

1. : 2 # @(#) pall v1.0 Print all files in a tree Author: Russ Sage 2a Pechataet vse fajly v dereve 4 if [ $# -eq 0 -o $# -gt 2 ] 5 then echo "pall: wrong argument count" >&2 6 echo "usage: pall [-t|-d] dir" >&2 7 echo " -t text (default)" >&2 8 echo " -d dev (.c,.h,.mk,.s)" >&2 9 exit 1 10 fi 12 NAME="" 13 if [ `echo $1 | cut -c1` = "-" ] 14 then case $1 in 15 -t) NAME="" 16 shift;; 17 -d) NAME="-name \"*.[chms]*\"" 18 shift;; 19 *) echo "pall: invalid arg $1" >&2 20 echo "usage: pall [-t|-d] dir" >&2 21 echo " -t text (default)" >&2 22 echo " -d dev (.c,.h,.mk,.s)" >&2 23 exit 1;; 24 esac 25 fi 27 echo "creating output file: /tmp/lpr$$" 29 eval find $1 -type f $NAME -print | sort | while read FILE 30 do 31 if file $FILE | 32 egrep 'exec|data|empty|reloc|cannot open' >/dev/null 2>&1 33 then continue 34 else file $FILE > /dev/tty 35 pr $FILE 36 fi 37 done >> /tmp/lpr$$ 39 echo "\nSend /tmp/lpr$$ to line printer (y/n): \c" 40 read CMD 41 if [ "$CMD" = "y" ] 42 then lpr /tmp/lpr$$ 43 fi

    PEREMENNYE SREDY VYPOLNENIYA

FILE Soderzhit imya kazhdogo fajla, kotoryj dolzhen byt' obrabotan v cikle while NAME Soderzhit stroku poiska dlya opredeleniya mestona- hozhdeniya ukazannyh fajlov CMD Soderzhit komandu vydachi rezul'tatov na printer OPISANIE ZACHEM NUZHEN KOMANDNYJ FAJL pall? |ta utilita ob容dinyaet koncepcii obhoda dereva fajlov i vyvoda soderzhimogo fajlov. Dazhe kogda fajly upryatany v podkatalogah, my vse ravno hotim najti ih. Nam neobhodima dlya etogo utilita, kotoraya obho- dit drevovidnuyu strukturu fajlov, nahodit fajly nuzhnogo nam tipa, go- tovit ih k raspechatke i stavit v ochered' dlya vyvoda na printer. Takogo roda utilita osobenno polezna, esli ishodnye teksty ili fajly s dokumentaciej hranyatsya v ierarhicheskom dereve. Delo oslozhnya- etsya tem, chto obychno eti tekstovye fajly smeshany s ispolnyaemymi fajla- mi (otkompilirovannymi programmami), fajlami dannyh i, vozmozhno, s ar- hivnymi fajlami. Neobhodimo imet' vozmozhnost' otfil'trovat' vse nepri- godnye dlya pechati fajly i podgotovit' tekstovye fajly. Dolzhny byt' provereny vse fajly s tem, chtoby ni odin ne byl propushchen. Dlya vypolneniya vsego etogo processa vruchnuyu trebuetsya, chtoby vy po komande cd perehodili v kazhdyj uroven' dereva fajlov, nahodili tekstovye fajly, obrabatyvali ih (obychno komandoj pr sistemy UNIX ili kakim-libo drugim tekstovym processorom) i raspechatyvali ih. Posle vy- polneniya vsej etoj raboty vy eshche dolzhny sobrat' vse otdel'nye raspe- chatki vmeste v strogo opredelennom poryadke. |to bol'shaya rabota, pod- verzhennaya oshibkam so storony cheloveka. Pochemu by ne pozvolit' mashine vypolnyat' etu rabotu? Sejchas my imeem koncepcii i sredstva, neobhodi- mye dlya sozdaniya takoj utility. V dopolnenie k vozmozhnosti upravleniya fajlami, pall takzhe mozhet upravlyat' ustrojstvom pechati. Obychno kazhdoe zadanie, postavlennoe v ochered' na vypolnenie k printeru, imeet zagolovok, kotoryj pechataetsya pervym. |to znachit, chto esli vy postavili v ochered' na pechat' desyat' otdel'nyh zadanij, to vperedi kazhdogo iz nih budet dve-tri stranicy, kotorye dolzhny byt' ubrany vruchnuyu. Pomnozh'te eto na sotni fajlov, i vy budete imet' kuchu bumag, kotorye dolzhny byt' vybrosheny. Pall isklyuchaet eti poteri, poskol'ku vse obrabotannye dannye so- birayutsya v odin bol'shoj tekstovyj fajl. Kogda vsya obrabotka vypolnena, etot odin fajl mozhet byt' postavlen v ochered' na pechat' ili sohranen dlya nekotoryh drugih celej. Edinstvennoe ogranichenie pri takom podhode zaklyuchaetsya v maksimal'nom razmere fajla, kotoryj vy mozhete sozdat'. |tot razmer vychislyaetsya umnozheniem znacheniya ulimit na razmer bloka. Naprimer, moe znachenie ulimit ravno 4096. Razmer bloka v dannom sluchae raven 512, a ne 1024. Maksimal'nyj razmer fajla raven 2097152. Vy mo- zhete vychislit' eto pryamo s klaviatury, kak pokazano nizhe: $ ulimit 4096 $ expr 4096 \* 512 2097152 |togo znacheniya dostatochno dlya bol'shinstva sluchaev. CHTO DELAET pall? Komandnyj fajl pall prednaznachen dlya poiska ukazannyh fajlov, ob- rabotki ih komandoj UNIX pr i sborki vseh rezul'tatov v odin fajl. Posle togo kak vse ishodnye fajly budut obrabotany komandoj pr, vam budet zadan vopros o tom, hotite li vy postavit' vyvodnoj fajl v oche- red' na pechat' k printeru. Rezul'tiruyushchij fajl sohranyaetsya v kataloge /tmp, gde ego mozhno ispol'zovat' dlya drugih celej ili udalit'. Opciyami pall yavlyayutsya -t i -d. Opciya -t ispol'zuetsya po umolchaniyu i net neobhodimosti ee ukazyvat'. Ona prednaznachena dlya dokumentacii i ukazana v komandnoj stroke, chtoby bolee yasno pokazat' dejstvie, koto- roe budet vypolneno. Esli vybrana tekstovaya opciya, ishchutsya vse fajly v drevovidnoj strukture i zatem otbirayutsya tol'ko tekstovye fajly. Esli ukazana op- ciya razrabotki -d (development), to ishchutsya tol'ko fajly, svyazannye s razrabotkoj programm. Zatem eti fajly otfil'trovyvayutsya s cel'yu polu- cheniya tekstovyh fajlov. Schitaetsya, chto k razrabotke programm otnosyatsya fajly, imena kotoryh imeyut vid *.c dlya ishodnyh fajlov na yazyke Si, *.h dlya vklyuchaemyh fajlov zagolovkov, *.mk dlya fajlov postroeniya prog- ramm (makefiles) i *.s dlya ishodnyh fajlov na assemblere. Esli trebu- yutsya kakie-libo drugie shablony, to takie simvoly mogut byt' legko po- meshcheny v tekst programmy. Prezhde chem nachnet vypolnyat'sya poisk fajlov, na ekran vyvoditsya imya vremennogo fajla, chtoby vy znali, kak obratit'sya k nemu posle za- versheniya vypolneniya komandy. Vse rezul'taty, poluchennye posle obrabot- ki fajlov, napravlyayutsya v etot odin fajl. Komandnyj fajl pall takzhe vyvodit na ekran soobshcheniya, kogda on obrabatyvaet fajly. Vyvod fajlov vypolnyaetsya v real'nom vremeni po mere obrabotki fajlov. Raspechatka proizvoditsya pri pomoshchi obychnoj komandy UNIX'a file. Po raspechatke vy mozhete sudit' o tom, fajly kakogo tipa obrabatyvayutsya v dannyj moment. Esli kakoj-libo norovistyj fajl proskol'znet, to vy znaete, gde on razmeshchen i kakogo on tipa. |to delaet otladku gorazdo bolee prostoj. Dlya fajlov vypolnyaetsya obrabotka, kotoraya yavlyaetsya dejstviem po umolchaniyu komandy pr. Ona razbivaet fajl na stranicy i stavit zagolo- vok v nachale kazhdoj stranicy. Zagolovok soderzhit datu, imya fajla i no- mer stranicy. Net nikakogo inogo sposoba peredat' zagolovok komandnomu fajlu pall vo vremya ego raboty, poskol'ku on predpolagaet, chto vy ho- tite znat' imya kazhdogo fajla takim, kak ono est' na diske. Izmenenie stroki zagolovka vyzvalo by tol'ko nepriyatnosti i dopolnitel'nuyu rabo- tu. Sposob vyzova pall vliyaet na format imeni fajla v zagolovke. Esli vy vyzvali pall, ispol'zuya absolyutnoe imya kataloga, to v raspechatke ispol'zuyutsya polnye marshrutnye imena. Esli vy vyzvali pall s otnosi- tel'nymi marshrutnymi imenami, to oni i ispol'zuyutsya pri vyvode na pe- chat'. Vnutri pall ispol'zuetsya komanda find sistemy UNIX. Komanda find ispol'zuet dannye iz komandnoj stroki, t.e. te, kotorye vvel pol'zova- tel'. Vyvodimyj zagolovok izmenyaetsya v zavisimosti ot togo, chto ukaza- no v komandnoj stroke, kotoruyu ispol'zuet find. Esli vy vyzyvaete pall, ispol'zuya sleduyushchuyu komandnuyu stroku, to zagolovok soderzhit pol- noe marshrutnoe imya: ------------------------------------------- | | $ pall /usr/include | | May 5 10:39 1986 /usr/include/a.out.h Page 1 | . | . | . | May 5 10:39 1986 /usr/include/ar.h Page 1 | . | . | . Esli vy vyzyvaete pall s pomoshch'yu otnositel'noj notacii, to imena fajlov takzhe yavlyayutsya otnositel'nymi, chto ne ochen' horosho. Esli u vas est' neskol'ko katalogov, v kotoryh imeyutsya odinakovye imena fajlov, to vy ne smozhete byt' uvereny, chto smotrite na pravil'nuyu raspechatku. Vot kak eto mozhet vyglyadet': --------------------- | | $ cd /usr/include | $ pall . | | May 5 10:39 1986 ./a.out.h Page 1 | . | . | . May 5 10:39 1986 ./ar.h Page 1 . . .

    PRIMERY

1. $ pall /usr/include Vyvodit VSE fajly zagolovkov. Syuda vklyuchayutsya fajly zagolovkov v podkataloge sys i vo vseh drugih katalogah, kotorye mogut raspola- gat'sya nizhe kataloga /usr/include. |to i est' prichina, po kotoroj byl napisan komandnyj fajl pall. On sozdaet odin ogromnyj listing vseh fajlov zagolovkov v otsortirovannom poryadke s pechat'yu v zagolovke stranic polnogo imeni. 2. $ pall $HOME/src Obhodit vse katalogi, nahodyashchiesya nizhe kataloga ishodnyh tekstov, i raspechatyvaet vse fajly.

    POYASNENIYA

V samom nachale proizvoditsya proverka na nalichie oshibok v komand- noj stroke. Esli v nej net argumentov ili ih bol'she dvuh, vyvoditsya soobshchenie ob oshibke, sintaksicheskaya podskazka i programma zavershaetsya s neudachnym statusom vozvrata. V stroke 12 inicializiruetsya peremennaya NAME. |to dejstvie vypol- nyaetsya po umolchaniyu, poetomu dannaya stroka daet vozmozhnost' ne ukazy- vat' opciyu v komandnoj stroke. Operator if v stroke 13 oznachaet: "Esli pervym simvolom pervogo argumenta yavlyaetsya defis", to nuzhno proverit', kakaya eto opciya. Esli ustanovlena opciya -t, to peremennaya NAME inicializiruetsya nulevym znacheniem, chto sovpadaet s dejstviem po umolchaniyu, poetomu na samom dele nichego ne menyaetsya. Zatem eta opciya udalyaetsya iz komandnoj stroki. Esli ustanovlena opciya -d, to peremennaya NAME inicializiruetsya dlya poiska simvol'noj stroki, sootvetstvuyushchej imenam fajlov programm- noj razrabotki. Obratite vnimanie, chto dvojnye kavychki vnutri operato- ra ekranirovany, t.e. vperedi nih stoyat simvoly naklonnoj cherty. Ko- mandnyj interpretator shell vosprinimaet kavychki vokrug stroki poiska na pervoj faze sintaksicheskogo razbora bez otmeny prisvoeniya, tem sa- mym ostavlyaya dvojnye kavychki posleduyushchej komande find. Esli opciej yavlyaetsya chto-libo drugoe, vyvoditsya soobshchenie ob oshibke i programma zavershaetsya. V stroke 27 vyvoditsya soobshchenie o tom, kakoj fajl soderzhit re- zul'taty raboty. Sam etot operator ne sozdaet fajl. On tol'ko pechataet imya fajla, kotoryj budet sozdan pozzhe. Stroki 29-43 - eto glavnyj cikl vsej programmy. Operator find dolzhen byt' povtorno proanalizirovan komandoj eval, poskol'ku peremen- naya NAME soderzhit nuzhnye nam dannye. Esli by ne bylo komandy eval, to podstanovka simvol'nyh strok vypolnyalas' by nepravil'no. Obratite vni- manie, chto peremennoj NAME ne trebuyutsya kavychki v stroke 24. Oni uzhe est' v peremennoj NAME, tak kak byli obrabotany komandoj eval. Operator find nahodit tol'ko fajly tipa f, ili obychnye fajly, t.e. ne katalogi i ne simvol'nye ili blochnye ustrojstva. Zdes' pod "obychnymi fajlami" ponimaetsya, chto oni eshche mogut byt' fajlami dannyh ili ispolnyaemymi. Esli znachenie peremennoj NAME ravno nulyu, ono ne vliyaet na komandnuyu stroku. Esli NAME soderzhit simvoly fajlov prog- rammnoj razrabotki, to oni stanovyatsya chast'yu komandy find pri vypolne- nii komandy eval. |to nakladyvaet ogranicheniya na shablon poiska komandy find. Kogda fajly najdeny, ih imena vyvodyatsya v standartnyj vyvod. Standartnyj vyvod po konvejeru peredaetsya komande sort, raspolagayushchej imena fajlov po poryadku. |to sil'no pomogaet pri sortirovke gory vy- vodnoj informacii. CHtenie kipy raspechatok tolshchinoj v odin fut mozhet svesti s uma kogo ugodno. Otsortirovannye imena po konvejeru peredayutsya v cikl while, koto- ryj chitaet imena fajlov po odnomu. Obratite vnimanie, chto standartnyj vyvod dlya vsego cikla while pereadresovyvaetsya vo vremennyj fajl, chto oblegchaet sborku vseh vyhodnyh rezul'tatov v odnom meste vmesto pere- adresacii kazhdogo vyzova komandy v fajl. Dlya kazhdogo podhodyashchego fajla vypolnyaetsya proverka v strokah 31-36. Proverka nachinaetsya s zapuska komandy file. Vyhod file po kon- vejeru peredaetsya komande egrep, kotoraya ishchet tip fajla, sootvetstvuyu- shchij naboru neskol'kih vyrazhenij. Esli kakoe-libo vyrazhenie podhodit, to nam ne nuzhno obrabatyvat' etot fajl. |to ne tekstovyj fajl, i ego nel'zya vyvesti na printer. Vo mnogih sluchayah fajly dannyh soderzhat bol'shoe kolichestvo simvolov progona formata, kotorye vytalkivayut stra- nicu posle kazhdoj pary simvolov. Esli vy ne budete nahodit'sya ryadom s printerom, kogda pechatayutsya takie fajly, to vy mozhete poluchit' listing, zanimayushchij polovinu yashchika bumagi, zatrativ celyj les na ne- nuzhnuyu rabotu. Nam ne nuzhen vyhod komandy egrep, a tol'ko ee status vozvrata. Esli egrep obnaruzhivaet odno iz ukazannyh ej vyrazhenij, ona zaversha- etsya so statusom uspeha, ili 0. Tem samym proverka if vklyuchaet vypol- nenie operatora then, kotoryj v dannom sluchae vyvodit nas iz konstruk- cii if-then-else i prodolzhaet cikl while, propuskaya takim obrazom fajl. Esli zhe egrep ne obnaruzhila ni odnu iz ukazannyh simvol'nyh strok, to vypolnenie prodolzhaetsya s operatora else, kotoryj vypolnyaet eshche odnu komandu file i pereadresovyvaet ee vyvod na ustrojstvo s ime- nem /dev/tty. |to universal'noe imya ustrojstva, kotoroe garantiruet vam vyvod na ekran vashego terminala. UNIX obespechivaet, chto ukazanie /dev/tty obhodit lyubye komandy pereadresacii vyvoda, dejstvuyushchie v dannyj moment. Poskol'ku standartnyj vyvod uzhe pereadresovan dlya vsego cikla while, to nam nuzhno popast' na ustrojstvo /dev/tty, chtoby vyvod shel na ekran terminala, a ne v fajl pechati. Otobrazhenie na terminal imeni obrabatyvaemogo fajla pozvolyaet pol'zovatelyu znat', kakoj fajl budet dobavlen k raspechatke. Esli fajl udovletvoryaet nashim kriteriyam, on obrabatyvaetsya koman- doj pr. Rezul'tat napravlyaetsya v standartnyj vyvod, kotoryj peread- resovan ciklom while tak, chtoby rezul'tat chetko popadal v odin fajl. Otmetim, chto nam nuzhno postavit' simvol dobavleniya v fajl vyvoda (>>). V protivnom sluchae my poluchim zapis' na mesto sushchestvuyushchego fajla pe- chati, a znachit v fajle pechati budet nahodit'sya tol'ko poslednij obra- botannyj fajl. Posle togo kak vse fajly obrabotany, zadaetsya vopros o tom, hoti- te li vy vyvesti rezul'tiruyushchij fajl na pechat'. Predlagaetsya otvetit' na etot vopros "da" (yes) ili "net" (no), odnako v programme proverya- etsya tol'ko polozhitel'nyj otvet (yes). |to znachit, chto nazhatie lyuboj klavishi traktuetsya kak otvet "no", krome klavishi "y", oznachayushchej "da". Otvet pol'zovatelya chitaetsya s klaviatury, i proveryaetsya, yavlyaetsya li on simvolom "y". Esli da, to fajl stavitsya v ochered' na pechat'. Esli net, dal'nejshaya proverka ne proizvoditsya i komandnyj fajl zavershaetsya. Otmetim, chto zapros o vyvode na pechat' postupil v standartnyj vy- vod. Pereadresaciya vyvoda dejstvovala tol'ko vo vremya raboty cikla while, a zatem prekratilas'. Tak bylo sdelano potomu, chto cikl while byl fakticheski eshche odnim porozhdennym shell-processom (subshell) i pe- readresaciya dejstvovala tol'ko v etom te vnimanie, chto marshrutnaya- ustanovite znacheniya peremennyh vne cikla, a zatem izmenite ih vnutri cikla. Posle zaversheniya cikla peremennye po-prezhnemu imeyut svoi pervo- nachal'nye znacheniya, a ne izmenennye v cikle znacheniya. Izmenennye zna- cheniya kasalis' peremennyh porozhdennogo interpretatora shell, kotorye ischezli, kogda porozhdennyj shell zavershilsya. Peremennye interpretatora shell mogut peredavat' znacheniya tol'ko vniz, porozhdennym processam, no processy-potomki ne mogut peredavat' znacheniya peremennyh vverh, rodi- tel'skomu processu. Obychno peredacha znachenij peremennyh podderzhivaetsya pri pomoshchi kakogo-libo fajla, v kotorom hranyatsya dannye dlya obmena mezhdu roditel'skim processom i processom-potomkom.

    UPRAVLENIE VYVODNYMI FAJLAMI BOLXSHIH RAZMEROV

Kak my uzhe otmechali, obshchij razmer vyvodnogo fajla ogranichen. Na- pomnim, chto komanda find prohodit vse derevo katalogov vniz do konca po vsem podderev'yam, nachinaya s kataloga, imya kotorogo ukazano v ko- mandnoj stroke. Esli vy nahodites' na vershine ochen' glubokogo dereva, to obrabatyvat'sya mogut bukval'no sotni fajlov. Poskol'ku vy ograniche- ny maksimal'nym razmerom vyvodnogo fajla, vy mozhete obrabotat' tol'ko ogranichennoe chislo fajlov. Konechno, kolichestvo fajlov, kotoroe vy mo- zhete obrabotat', zavisit takzhe ot togo, naskol'ko veliki vhodnye faj- ly. Esli vyvodnoj fajl dostigaet svoego maksimuma, vse dobavlyaemye posle etogo dannye teryayutsya. Poterya dannyh ves'ma boleznenna, i obychno trebuetsya nekotoroe vremya, chtoby ee obnaruzhit'. V medlenno rabotayushchej sisteme popytka obrabotat' bol'shoe derevo, naprimer vse ishodnye teksty sistemy UNIX, mozhet zanyat' celyj chas i dazhe bol'she, prezhde chem vyhodnoj fajl zapolnitsya. |to oznachaet, chto vy dolzhny nahodit'sya ryadom i sledit' za tem, kogda fajl perepolnitsya. Esli on vse-taki perepol- nilsya, vy dolzhny vse vybrosit' i nachat' snachala. |to takzhe oznachaet, chto vy dolzhny perejti vniz po derevu. |to mozhet byt' problemoj v sba- lansirovannyh derev'yah. Naprimer, rassmotrim katalog /usr/lib. |tot katalog soderzhit mno- go fajlov na pervom urovne i mnogo katalogov pervogo urovnya. Esli by my ne obrabotali vse fajly kataloga /usr/lib za odnu popytku, my dolzh- ny byli by pojti vniz po podkatalogam kataloga /usr/lib. Popytki de- lat' eto vruchnuyu i zapuskat' pall v kazhdom podkataloge zanyali by mnogo vremeni i mogli by privesti k oshibkam s vashej storony. Krome togo, pall dopuskaet ukazanie tol'ko odnogo imeni kataloga, chto privedet k polucheniyu bol'shogo kolichestva raspechatok i k putanice pri ih sortirov- ke. CHto zhe delat'? Radikal'nym resheniem yavlyaetsya uvelichenie znacheniya ulimit. Vy mozhete sdelat' eto libo s pomoshch'yu programmy na yazyke Si, ispol'zuyushchej sistemnyj vyzov ulimit, libo komandoj shell'a ulimit. Tehnika vypolneniya takoj raboty predstavlena v glave 7.

    VOZMOZHNYE MODIFIKACII

Vozmozhno, vy zahotite dobavit' svoi sobstvennye shtrihi v nekoto- ryh mestah komandnogo fajla. Pervym mestom yavlyaetsya to, gde ukazyva- yutsya simvoly poiska fajlov programmnoj razrabotki. Simvoly, ispol'zo- vannye nami - eto naibolee upotrebimye suffiksy v UNIX. Esli vy ispol'zuete ne Si i assembler, a drugie yazyki, to vy mozhete dobavit' sootvetstvuyushchie simvoly. Sleduyushchim mestom, gde mogut byt' sdelany dopolneniya, yavlyayutsya op- cii, kotorye mozhet ponimat' pall. Vam mogut ponadobit'sya fajly s opre- delennymi imenami ili opredelennymi tipami, naprimer, fajly nroff. |ti opcii mogut byt' legko dobavleny v operator case, chto uluchshit komandu. Poslednim mestom vozmozhnyh izmenenij yavlyaetsya tip fajlov, kotorye nuzhno propuskat'. Simvol'naya stroka dlya komandy egrep pokryvaet bol'- shinstvo vazhnyh netekstovyh tipov fajlov. V vashej sisteme mogut byt' kakie-to osobye tipy ili zhe imena mogut byt' drugimi. Esli vam neobho- dimo dopolnit' stroku, sdelajte eto. Komanda egrep mozhet obrabotat' dovol'no mnogo informacii. YA ne znayu ee ogranichenij. Vozmozhno, vy ob- naruzhite ih, prosmatrivaya ishodnyj tekst utility egrep. Esli polucha- etsya slishkom dlinnaya stroka i ne pomeshchaetsya na ekrane, nichego strashno- go. Perenos na sleduyushchie stroki ekrana ne opasen, poka obshchee kolichest- vo simvolov ne prevysit 255. Opasno tol'ko ukazyvat' pereadresaciyu simvol'noj stroki if na nulevoe ustrojstvo v sleduyushchej posle komandy egrep stroke. Kazhetsya, chto vse rabotaet pravil'no, no eto ne tak. Pe- readresaciya dolzhna ukazyvat'sya v toj zhe stroke, gde stoit komanda egrep. V dannoj glave sdelano ochen' mnogo. Naibolee vazhno to, chto polu- cheno mnozhestvo novyh idej, kotorye mozhno ispol'zovat' pri ekspluatacii programmnoj sredy i prosmotre fajlov lyubogo tipa. V sleduyushchej glave my uglubimsya v rutinnuyu rabotu po ezhednevnomu soprovozhdeniyu fajlov i ispol'zuem izuchennye sredstva, chtoby oni oblegchili nashu zhizn'.

    * GLAVA 3. Podderzhka fajlovoj sistemy *

SODERZHANIE VVEDENIE 3.1. SOPROVOZHDENIE FAJLOV 3.1.1. Operacii soprovozhdeniya 3.1.2. Sredstva peresylki fajlov 3.1.3. Sredstva kopirovaniya 3.1.4. Sredstva proverki operacii kopirovaniya 3.2. PERESYLKA FAJLOV 3.2.1. cptdir - kopirovanie dereva kataloga 3.2.2. can - udalenie fajlov v "musornuyu korzinu" 3.2.3. dosflp - kopirovanie fajlov s gibkogo diska formata MS-DOS s ispol'zovaniem simvolov shablona v imenah fajlov 3.3. SREDSTVA POLUCHENIYA REZERVNYH KOPIJ 3.3.1. autobkp - avtomaticheski narashchivamyj fajl rezervnoj kopii 3.3.2. cpiobr - kopirovanie i vosstanovlenie fajlov v vide potoka dannyh 3.4. SREDSTVA PROVERKI OPERACIJ KOPIROVANIYA 3.4.1. dsum - kontrol'nye summy dvuh katologov 3.4.2. log - menyu dostupa k fajlam protokola kopirovaniya

    VVEDENIE

Dazhe "nebol'shaya" sistema UNIX s malym chislom pol'zovatelej porozh- daet sotni fajlov v hode obychnoj raboty. V processe programmirovaniya vy mozhete sozdavat' mnozhestvo fajlov dlya razlichnyh versij vashih programm. Vedenie pochty i zapis' teksta pri pomoshchi redaktora vi sposobstvuet to- mu, chto nakaplivaetsya eshche bol'she fajlov. Takie utility, kak uucp, lp i drugie dobavlyayut eshche bol'she fajlov. Esli u vas sistema UNIX ustanovlena na mikro-|VM, to vash zhestkij disk nachinaet perepolnyat'sya. V bol'shih mnogopol'zovatel'skih sistemah diskovaya pamyat' redko schitaetsya proble- moj, no v dejstvitel'nosti vsegda kazhetsya, budto fajly stremyatsya rasshi- rit'sya do zapolneniya vsej dostupnoj diskovoj pamyati. Poetomu kazhdyj pol'zovatel' dolzhen nesti otvetstvennost' za rashod diskovogo prost- ranstva. (Esli vy platite za diskovuyu pamyat', to u vas takzhe mogut byt' finansovye stimuly.) Odnako, to, chto vy hotite sohranit', vy hotite SOHRANITX. Imenno zdes' nachinaetsya rabota po sozdaniyu rezervnyh kopij.

    3.1. SOPROVOZHDENIE FAJLOV

V predydushchej glave my razrabotali nekotorye sredstva poiska i otobrazheniya informacii, pomogayushchie nam podderzhivat' zhiznennyj put' vseh nashih fajlov. Teper' my sobiraemsya obratit'sya k vazhnejshim rutinnym ra- botam, kotorye pozvolyat izbezhat' haosa i katastrofy. Soprovozhdenie fajlov oznachaet izbavlenie ot fajlov, kotorye nam bol'she ne nuzhny i v to zhe vremya sistematicheskoe kopirovanie teh fajlov, kotorye my hotim sohranit'. Dlya etogo trebuetsya vozmozhnost' ispol'zova- niya raznorodnyh dostupnyh nositelej dannyh. Soprovozhdenie fajlov podra- zumevaet takzhe ryad sistematicheskih, povtoryayushchihsya zadach, a eto oznacha- et, chto my mozhem sozdat' sredstva sistemy UNIX dlya avtomatizacii etogo processa.

    3.1.1. OPERACII SOPROVOZHDENIYA

Soprovozhdenie fajlov vklyuchaet dva vida operacij: sozdanie rezerv- nyh kopij (kopirovanie) i udalenie "musora". Kopirovanie - eto dan' uvazheniya, kotoruyu my platim za hrupkost' fizicheskih dannyh v ruki Merfi i drugih bogov entropii. Horoshee sredstvo kopirovaniya yavlyaetsya bystrym, gibkim, prostym v ispol'zovanii i stimuliruet pol'zovatelej chasto kopirovat' samye vazhnye fajly. V posleduyushchem tekste budut predstavleny razlichnye metody kopirovaniya, prigodnye dlya raznyh konfiguracij sistemy i tipov nositelej. Imeetsya dva vida rezervnyh kopij: "myagkie" i "tverdye". "Myagkie" rezervnye kopii - eto kopii v drugom fajle ili kataloge v toj zhe ili v drugoj fajlovoj sisteme (t.e. razdele) na tom zhe ili drugom zhestkom diske. Takogo roda kopirovanie sdelat' legko i ono predohranyaet ot na- nosimogo samomu sebe ushcherba, takogo kak udalenie fajla po nevnimatel'- nosti. CHashche vsego dlya takogo tipa kopirovaniya ispol'zuetsya nashe sredstvo cptdir. Osnovnoj nedostatok myagkogo kopirovaniya zaklyuchaetsya v tom, chto vy po-prezhnemu uyazvimy dlya takih vozdejstvij, kotorye vliyayut na vash fizicheskij nositel' (obychno zhestkij disk) tak, chto i original i kopiya okazyvayutsya razrushennymi. "Tverdaya" kopiya - eto kopiya na drugom ustrojstve ili dazhe v drugoj sisteme UNIX. Sredstva, predstavlennye nizhe v dannoj glave, upravlyayut takogo roda kopirovaniem i dayut vam vozmozhnost' vypolnyat' kopirovanie takogo tipa i s takoj periodichnost'yu, kotorye sootvetstvuyut ob容mu va- shej vychislitel'noj sistemy, urovnyu ee aktivnosti i vazhnosti hranimyh dannyh. Tverdoe kopirovanie vsegda neskol'ko utomitel'no, potomu chto diski ili lenty dolzhny byt' smontirovany (ili dolzhna byt' ustanovlena svyaz' s drugoj sistemoj), a eta operaciya trebuet mnogo vremeni. Preimushchestvo, estestvenno, zaklyuchaetsya v tom, chto vy bol'she ne zavisite ot celost- nosti kakogo-libo odnogo ustrojstva. Avtomatiziruya nashu proceduru kopirovaniya, my staraemsya sdelat' ego kak mozhno menee boleznennym. Delaya nashi sredstva kopirovaniya v kakoj-to stepeni razumnymi, my mozhem vybrat' tol'ko fajly, kotorye nuzhdayutsya v kopirovanii, i tem samym sohranit' vremya i pamyat'. Nailuchshij sposob obespechit', chtoby kopirovanie vypolnyalos' regulyarno - minimizirovat' vremya i trebuemye dlya etogo usiliya. Nakonec, sozdanie procedur dlya pro- verki pravil'nosti kopij dast vam spokojstvie duha. "Udalenie musora" mozhno avtomatizirovat' putem ukazaniya i podgo- tovki k udaleniyu fajlov, kotorye, veroyatno, budut vremennymi, libo ka- kih-to drugih fajlov, kotorye sozdany (no ne obyazatel'no razrusheny) pri kompilyacii, vypolnenii konvejerov ili drugimi operaciyami. Vy takzhe mo- zhete ukazyvat' fajly, specifichnye dlya vashih rabot kak ne podlezhashchie udaleniyu.

    3.1.2. SREDSTVA PERESYLKI FAJLOV

Pervaya gruppa sredstv - eto prostye universal'nye perenoschiki faj- lov. Programma cptdir mozhet kopirovat' katalog (i lyubye podchinennye ka- talogi, lezhashchie nizhe v dereve) v katalog-priemnik. Katalog-priemnik - eto obychno katalog, naznachennyj v kachestve rezervnoj kopii dlya nekoto- rogo proekta. Programma can beret na sebya neobhodimuyu rutinnuyu rabotu - ubiraet "musor". |ta programma pozvolyaet vam vybrat' tipy vremennyh fajlov, ko- torye dolzhny periodicheski udalyat'sya. Napravlyaya ih v "musornyj" katalog, can predostavlyaet vam vozmozhnost' prosmotret' vse, chto bylo udaleno, i vosstanovit' to, chto vy na samom dele hotite sohranit'. Programma dosflp dopuskaet primenenie simvolov-shablonov v imenah fajlov, ispol'zuemyh pri kopirovanii otobrannyh fajlov s disket formata MS-DOS v XENIX. |to uproshchaet operaciyu kopirovaniya i umen'shaet chislo na- zhatij na klavishi.

    3.1.3. SREDSTVA KOPIROVANIYA

Dalee predstavlyaetsya "rabochaya loshadka" - sredstva kopirovaniya. Autobkp ispol'zuet spisok marshrutnyh imen, chtoby opredelit', kakie chasti fajlovoj sistemy dolzhny byt' provereny. Zatem eta programma kopi- ruet iz vybrannyh oblastej te fajly, kotorye byli dobavleny ili izmene- ny v poslednie 24 chasa. Cpiobr predostavlyaet interaktivnoe dopolnenie k komande cpio sistemy UNIX. Ona pozvolyaet vam skopirovat' fajly s zhestkogo diska na gibkij i, esli neobhodimo, vosstanovit' ih s gibkogo diska na zhestkij.

    3.1.4. SREDSTVA PROVERKI OPERACIJ KOPIROVANIYA

Vypolnenie kopirovaniya ne izbavit vas ot volnenij, poka vy ne bu- dete znat', chto vy skopirovali vse, chto hoteli, i chto kopirovanie prosh- lo korrektno. Programma dsum ispol'zuet kontrol'nuyu summu dlya proverki togo, chto ishodnyj katalog i katalog-kopiya soderzhat odni i te zhe fajly. Programma log otobrazhaet registracionnyj fajl, chtoby pokazat', kakoe avtomaticheskoe kopirovanie vypolnyalos' v chetyre chasa utra, kogda vy (nadeemsya) spali. Pri sozdanii etih sredstv my prosmotrim nekotorye vazhnye komandy sistemy UNIX i obnaruzhim novye sposoby ih ispol'zovaniya. Kogda vy pro- rabotaete vsyu dannuyu glavu, vy budete znat', kak rabotat' "s mel'chajshi- mi chasticami" pri ispol'zovanii fajlovoj sistemy UNIX. Vy smozhete avto- matizirovat' inuyu bol'shuyu oblast' vashih komp'yuternyh budnej. Vy dolzhny sumet' sozdat' pol'zovatel'skie utility kopirovaniya i verifikacii, udovletvoryayushchie vashim nuzhdam. Vy smozhete perevesti vashu sistemu v rezhim raboty, obespechivayushchij ej samostoyatel'noe vyzhivanie. (My ostavlyaem fi- losofam opredelyat', dast li eto vashemu komp'yuteru primitivnuyu formu zhizni!) Mezhdu prochim, mnogie sredstva v dannoj glave pol'zuyutsya preimu- shchestvami rekursivnyh metodov obhoda dereva, kotorye my razrabotali v predydushchej glave. Vy mozhete prosmotret' tot material, esli u vas ime- yutsya zatrudneniya v ponimanii togo, chto predstavleno zdes'.

    3.2. PERESYLKA FAJLOV

3.2.1. cptdir - kopirovanie dereva kataloga IMYA: cptdir cptdir Kopiruet derevo kataloga v drugoe mesto FUNKCIYA Kopiruet derevo fajlovoj sistemy, koren' kotorogo raspolozhen v ka- taloge, v drugoj katalog sistemy. Net ogranichenij na kakoj-libo speci- ficheskij katalog ili zhestkij disk. FORMAT cptdir [-s] katalog-istochnik katalog-priemnik PRIMER VYZOVA cptdir $HOME /bkp Kopiruet kazhdyj fajl iz $HOME v katalog /bkp. KOMANDNYJ FAJL cptdir 1 : 2 # &(#) cptdir v.1.0 Copy a directory tree Autor: Russ Sage 4 if [ $# -lt 2 -o $# -gt 3 ] 5 then echo "cptdir: argument error" >&2 6 echo "usage: cptdir [-s] srcdir desdir" >&2 7 echo " -s silent mode" >&2 8 exit 1 9 fi 11 if [ "$1" ="-s" ] 12 then OPT="-pd" 13 shift 14 else OPT="-pdv" 15 fi 17 SRC=$1 18 DEST=$2 19 umask 0 21 if [ -d $DEST ] 22 then echo "\"$DEST\" already exist. Remove it? (y/n): \c" 23 read CMD 24 if [ "$CMD" = "y" ] 25 then rm -rf $DEST 26 mkdir $DEST 27 fi 28 else mkdir $DEST 29 fi 31 if [ "`echo $DEST|cut -c1`" = "/" ] 32 then cd $SRC 33 find . -print | sort | cpio $OPT $DEST 34 else PWD=`pwd` 35 cd $SRC 36 find . -print | sort | cpio $OPT $PWD/$DEST 37 fi

    PEREMENNYE SREDY

CMD Komanda, poluchennaya ot pol'zovatelya DEST Katalog-priemnik, v kotoryj nuzhno kopirovat' OPT Opcii, kotorye peredayutsya utilite cpio PWD Tekushchij rabochij katalog SRC Katalog-istochnik, iz kotorogo nuzhno kopirovat' Opisanie Zachem nam nuzhen cptdir? My uzhe otmechali neobhodimost' v dopolnitel'nyh komandah, kotorye rekursivno obhodyat drevovidnuyu strukturu fajlovoj sistemy UNIX. V ran- nih versiyah UNIX edinstvennaya komanda tar mogla upravlyat' dvizheniem po derevu. V bolee novyh versiyah sistemy imeetsya opciya -r v komande cp, kotoraya delaet cp rekursivnoj (eta vozmozhnost' realizovana tol'ko v poslednej versii System V) i komanda cpio. Poslednyaya yavlyaetsya mnogoce- levoj komandoj kopirovaniya, kotoraya mozhet imet' delo kak s potokovym formatom, tak i s formatom fajlovoj sistemy. Problema pri ispol'zovanii dazhe takih uluchshennyh standartnyh ko- mand sistemy UNIX sostoit v tom, chto vam neobhodimo ukazat' mnozhestvo detalej i ubedit'sya v tom, chto vy pravil'no ispol'zuete sintaksis. Oshibki mogut privesti k potere vremeni i dazhe huzhe togo, k neozhidannym pobochnym effektam. S nekotorymi iz etih effektov svyazany izmeneniya prav dostupa i vladel'ca, poryadok raspredeleniya indeksnyh deskriptorov faj- lov (inode), razmeshcheniya fajlov-priemnikov i rezul'tiruyushchie polnye ime- na. Ochen' mnogo neobhodimo zapomnit' i zanovo vyzyvat' kazhdyj raz pri kopirovanii. Poskol'ku takoe kopirovanie delaetsya ne chasto, tyazhelo za- pomnit' vse eti detali. My razreshaem etu problemu, avtomatiziruya detali processa i v to zhe vremya predostavlyaya pol'zovatelyu gibkost' i upravle- nie rezul'tatami. My sozdaem instrumenty dlya upravleniya fajlami, koto- rye yavlyayutsya horoshimi dopolnitel'nymi sredstvami k osnovnym komandam sistemy UNIX. CHto delaet cptdir? Procedura cptdir kopiruet katalog (i vse derevo pod nim, esli ono sushchestvuet) v drugoj katalog sistemy. Poskol'ku katalogi predusmatriva- yut logicheskij dostup i ne yavlyayutsya apparatno-zavisimymi (v otlichie ot imen ustrojstv), to vy mozhete legko kopirovat' fajly v drugoe mesto na tom zhe diske ili kopirovat' ih na drugoj disk polnost'yu bez special'no- go sintaksisa ili opcij. Vy mozhete ukazat', hotite li vy, chtoby na ekran vyvodilis' imena kopiruemyh fajlov. Esli vy ne hotite etogo, ispol'zujte opciyu -s ("silent" - molchalivyj). Po umolchaniyu ispol'zuetsya rezhim "verbose" (mnogoslovnyj), kotoryj otobrazhaet imena po mere kopirovaniya fajlov. Zamet'te, chto eto kopirovanie, a ne peremeshchenie fajlov. Nedostatok kopirovaniya v otlichie ot peremeshcheniya zaklyuchaetsya v tom, chto esli priem- nikom yavlyaetsya katalog na tom zhe diske, to vam trebuetsya dopolnitel'noe mesto na diske dlya razmeshcheniya vtorogo obraza. Vam takzhe neobhodimo imet' dostatochno opisatelej fajlov (inodes) dlya sohraneniya vseh fajlov. V protivnom sluchae vy mozhete lishit'sya shansa sbrosit' v "musornuyu korzi- nu" vashi rabochie fajly. V komandnoj stroke dopustimo ukazanie kataloga-istochnika i imya ka- taloga-priemnika. Edinstvennyj klyuch, dopustimyj v komandnoj stroke - eto "-s". Lyuboj drugoj klyuch privodit k zaversheniyu komandy, ne vyzyvaya nikakih razrushenij. Vy, konechno, mozhete dobavit' programmnyj kod s cel'yu proverki opcii i vydachi soobshcheniya o dopustimyh klyuchah, esli uka- zano nechto otlichnoe ot -s. Esli vy delaete eshche kakuyu-libo proverku na nalichie oshibok sverh togo, chto trebuetsya dlya predotvrashcheniya razrusheniya dannyh ili sistemy, to eto delo lichnogo vkusa. Minimizaciya proverok na nalichie oshibok daet bolee kompaktnye i bystrye scenarii, podhodyashchie dlya opytnyh pol'zovatelej. Esli ukazannyj katalog-priemnik ne sushchestvuet, to on sozdaetsya. Esli katalog-priemnik uzhe sushchestvuet, vydaetsya soobshchenie ob etom i vam zadaetsya vopros o tom, hotite li vy ochistit' ego. Esli vy otvetite "yes", katalog unichtozhaetsya i sozdaetsya snova pustym. Esli vy otvetite "no", katalog ostaetsya takim, kakoj est' i kopiruemye fajly prosto do- bavlyayutsya k uzhe sushchestvuyushchim v nalichii. Pri etom mozhet vozniknut' neko- toraya putanica, osobenno esli nekotorye fajly s takimi imenami uzhe su- shchestvuyut v kataloge-priemnike. V bol'shinstve sluchaev, odnako, u pol'zo- vatelej ne poyavlyaetsya zhelaniya dobavlyat' svoyu kopiyu v sushchestvuyushchij kata- log. Tem ne menee katalog-priemnik dolzhen byt' sozdan, poskol'ku neob- hodimo ego nalichie, chtoby komanda cpio rabotala pravil'no. Esli zhe ego net, cpio ne vypolnitsya i vydast soobshchenie ob oshibke. Procedura cptdir nachinaet kopirovanie putem prohozhdeniya po katalo- gu-istochniku i formirovaniya spiska fajlov, nahodyashchihsya v nem, rekursiv- no obhodya derevo sverhu vniz. V rezul'tate mozhet poluchit'sya, chto skopi- ruetsya bol'she, chem vy planirovali, poetomu vam neobhodimo znat' razmer fajlovoj struktury, kotoruyu vy hotite skopirovat'. Zatem fajly kopiru- yutsya v katalog-priemnik. Ishodnye fajly nikak ne modificiruyutsya i ne izmenyayutsya (za isklyucheniem togo, chto data poslednego dostupa mozhet byt' modificirovana). Kogda idet kopirovanie, na ekran vydaetsya soobshchenie ot cpio, koto- roe pokazyvaet polnyj marshrut k fajlam-priemnikam. |tot marshrut dolzhen sootvetstvovat' marshrutu, ukazannomu v komandnoj stroke, v protivnom sluchae chto-to ne tak. Primery 1. $ cd /mnt $ cptdir /bin . Perejti na drugoj disk (obychno smontirovannyj v kataloge /mnt) i kopirovat' vse fajly iz kataloga /bin v tekushchij katalog. Obratite vni- manie, chto rezul'tiruyushchimi fajlami budut /mnt/*, chto mozhet ne sovpadat' s vashim zhelaniem. 2. $ cd /bin $ cptdir . /mnt/bin To zhe, chto i v predydushchej komande, no obratite vnimanie, chto tochka izmenila svoyu poziciyu. Komanda ukazyvaet kopirovanie vseh fajlov teku- shchego kataloga v katalog /mnt/bin. Poluchayutsya fajly /mnt/bin/*, chto vyg- lyadit bolee rezonnym. 3. $ cptdir /bin /mnt To zhe, chto i v primere 1. 4. $ cptdir /bin /mnt/bin To zhe, chto i v primere 2. Poyasneniya V strokah 4-9 proizvoditsya proverka argumentov komandnoj stroki. Esli ukazano men'she dvuh argumentov, etogo nedostatochno. Kak minimum dolzhny byt' ukazany imena kataloga-istochnika i kataloga-priemnika. Bo- lee treh argumentov slishkom mnogo. Samoe bol'shee, tam dolzhny byt' opciya -s, katalog-istochnik i katalog-priemnik. V strokah 11-15 ustanavlivayutsya klyuchi komandy cpio. Po umolchaniyu eto pdv, chto oznachaet "pass" (peredacha) dlya kopirovaniya v formate faj- lovoj sistemy (v otlichie ot neobrabotannogo potoka dannyh), "directory" (katalog) dlya sozdaniya kataloga pri neobhodimosti i "verbose" (mno- goslovnyj) dlya vydachi imen fajlov po mere ih kopirovaniya. Esli pervym pozicionnym parametrom yavlyaetsya klyuch -s, kotoryj ukazyvaet zapusk cptdir v molchalivom rezhime, klyuchi komandy cpio ne soderzhat klyucha vydachi soobshchenij i, takim obrazom imena fajlov ne vydayutsya na ekran. Stroki 17,18 i 19 ustanavlivayut katalogi "otkuda" i "kuda" i usta- navlivayut peremennuyu umask v 0. Peremennaya umask opredelyaet podrazume- vaemye prava dostupa dlya vseh fajlov, sozdannyh nashim komandnym pro- cessorom. My izmenyaem umask dlya garantii togo, chto vse fajly kopiruyutsya v derevo-priemnik i ni odin iz nih ne budet zablokirovan iz-za otsutstviya prav chteniya ili zapisi. Pobochnym effektom yavlyaetsya to, chto vse katalogi imeyut prava dostupa vida rwxrwxrwx, a vse fajly - vida rw-rw-rw-, chto mozhet potrebovat' izmenenij dlya obespecheniya vashej bezo- pasnosti. Izmenenie umask imeet dejstvie tol'ko na vremya raboty proce- dury. Kogda cptdir zavershaetsya, umask vashego vyzyvayushchego komandnogo processora ostaetsya neizmennym. Stroki 21-29 vypolnyayut proverku kataloga-priemnika. Esli on uzhe sushchestvuet, vas zaprashivayut, nuzhno li ego udalit' i zanovo sozdat'. Esli on ne sushchestvuet, on sozdaetsya dlya raboty cpio. Stroki 31-36 vypolnyayut neposredstvenno kopirovanie. Prezhde chem ob座asnit', chto zdes' delaetsya, davajte sperva posmotrim, kak rabotaet cpio. Poskol'ku operator find generiruet spisok fajlov, nam neobhodimo predstavlyat', kak ego vyhod mozhet vliyat' na vypolnenie cpio. Esli my ukazali "find . -print", to polnye imena fajlov budut imet' tochku vperedi, naprimer: ./dir ./dir/file1 ./dir/file2 |to otnositel'naya notaciya, kotoraya ochen' polezna, kogda vy ne ho- tite, chtoby vashi fajly peredavalis' soglasno absolyutnym marshrutnym ime- nam, no hotim sohranit' ih vzaimosvyaz' drug s drugom. Esli na nih ssy- lat'sya otnositel'no tochki, to mesto, kuda oni budut pomeshcheny, mozhet byt', gde ugodno. Odnako, esli my skazhem "find /dir -print", spisok bu- det vyglyadet' tak: /dir /dir/file1 /dir/file2 V oboih sluchayah my ssylaemsya na nash tekushchij katalog, no primenenie zapisi vida /dir zastavlyaet polnoe imya nachinat'sya s "/" i ne dopuskaet ispol'zovanie otnositel'noj notacii. Peredacha takoj zhe informacii ko- mande cpio mozhet radikal'no izmenit' mesto razmeshcheniya vashih fajlov. Naprimer, esli ya skazal "cd /src; find . -print | cpio -pdv /dest", re- zul'tiruyushchij spisok budet takim: /dest/./dir /dest/./dir/file1 /dest/./dir/file2 gde na pervom meste stoit, veroyatno, to, chto vy hoteli. Odnako, esli ya skazal "find /src -print | cpio -pdv /dest", rezul'tiruyushchie marshrutnye imena budut takimi: /dest/src/dir /dest/src/dir/file1 /dest/src/dir/file2 chto ne ochen' horosho, poskol'ku eto sozdaet uroven' kataloga, v ko- torom net neobhodimosti. Zamet'te, chto imya kataloga "src" bylo perehva- cheno pri raspechatke. |to proizoshlo potomu, chto ego vydal find, a cpio schitaet, chto src bylo chast'yu imeni kataloga-priemnika. Povsemestnoe ispol'zovanie otnositel'noj notacii mozhet privesti nas k potere uzhe imeyushchejsya informacii. Naprimer, esli by ya skazal "cd /nowhere; find /src ....", katalog-priemnik poluchil by nevernoe imya. My dolzhny umet' ispol'zovat' etot tip notacii i ne popadat' v lovushki sin- taksisa. |to i est' to, chto delaet cptdir. V stroke 31 proizvoditsya proverka na to, yavlyaetsya li pervyj simvol v marshrutnom imeni celevogo kataloga simvolom "kosaya cherta" ("/"). Esli da, to my tochno znaem, chto imya kataloga-priemnika vyrazheno v vide abso- lyutnogo marshrutnogo imeni, poetomu my mozhem smenit' katalogi bez poteri informacii o nashem tekushchem kataloge. V strokah 32-33 my perehodim v ka- talog-istochnik i kopiruem fajly. No esli pervyj simvol kataloga-priemnika NE yavlyaetsya naklonnoj chertoj, ispol'zuemaya notaciya yavlyaetsya otnositel'noj. |to znachit, chto esli my smenim katalog, my poteryaem informaciyu o tom, gde my nahodi- lis', kogda byl zapushchen komandnyj fajl. CHtoby izbezhat' etogo, my polu- chaem v stroke 34 polnoe imya tekushchego kataloga putem perehvata vyvoda komandy pwd i prisvoeniya etogo znacheniya peremennoj takim obrazom, chto pozzhe my smozhem ee vosstanovit'. Zatem my perehodim v katalog-istochnik i kopiruem fajly, ispol'zuya prefiks absolyutnogo marshrutnogo imeni ot komandy pwd i otnositel'nyj suffiks togo mesta, gde my nahodimsya. Prichinoj togo, chto my tak postupaem, yavlyaetsya ispol'zovanie ot- nositel'noj (tochechnoj) notacii v operatore find. Kak mozhno bylo videt' v predydushchem opisanii, otkaz ot ispol'zovaniya tochechnoj notacii mozhet privesti k putanice v marshrutnyh imenah kataloga-priemnika. Dlya togo chtoby vsegda ispol'zovat' tochku v operatore find, nam neobhodimo ube- dit'sya, kuda my sobiraemsya peresylat' fajly. Eshche raz napomnim, chto ko- manda cd dejstvuet tol'ko dlya dannogo komandnogo processora "nizkogo" urovnya, poetomu ona ne vliyaet na tot komandnyj processor, kotoryj za- pustil komandnyj fajl. Voobshche, komandnyj fajl dolzhen ostavit' pol'zova- telej v teh zhe usloviyah, v kotoryh oni nahodilis' pered ego zapuskom, za isklyucheniem vypolneniya neobhodimyh rabot, pri kotoryh ne proizvo- ditsya smena tekushchego kataloga. Kogda cptdir zavershaetsya, upravlenie vozvrashchaetsya vyzyvayushchemu ko- mandnomu processoru, kotoryj po-prezhnemu vedet svoj sobstvennyj tekushchij katalog. Napomnim, chto vsegda, kogda vy perehodite na bolee nizkij uro- ven' komandnogo processora, eksportiruemye peremennye peredayutsya vniz, no NICHEGO ne peredaetsya naverh.

    VOZMOZHNYE MODIFIKACII KOMANDNOGO FAJLA

V nyneshnej realizacii nikakie dopolnitel'nye klyuchi ne dopuskaetsya peredacha nikakih dopolnitel'nyh klyuchej komande cpio. CHto sluchitsya, esli vy zahoteli zamenit' kopirovanie fajlov, gde eto vozmozhno, sozdaniem ssylok (klyuch -l) ili ne menyat' vremya poslednego dostupa k ishodnomu fajlu pri ego kopirovanii (opciya -a)? Takie vozmozhnosti byli by nedo- pustimy. Mozhno legko dobavit' vozmozhnost' peredachi dopolnitel'nyh argumen- tov. Oni dolzhny byt' opoznany kak argumenty, sohraneny i zatem vybrany iz komandnoj stroki. Dlya etogo potrebuetsya takoj cikl: for ARG in $* do if [ "`echo $ARG|cut -c1`" = "-" ] then CPIOARG="CPIOARG $ARG" shift fi done Zatem peremennaya CPIOARG mozhet byt' peredana komande cpio. Eshche odna oblast', gde mogut byt' proizvedeny izmeneniya - eto up- ravlenie pravami dostupa k fajlam. Kak ob座asnyalos' ranee, znachenie 0 dlya umask delaet vse prava takimi, chto oni razreshayut zapis'. Esli eto vam ne podhodit, operator find mozhet byt' izmenen tak, chto budet proiz- vodit'sya vyborochnoe kopirovanie (i izmenenie prav dostupa). Predpolozhim, naprimer, vy imeete katalog s dvumya fajlami. Esli vy- polnilsya operator "find /dir -print", spisok fajlov budet takim: /dir /dir/file1 /dir/file2 Obratite vnimanie, chto imya kataloga poyavlyaetsya pervym. Problema voznikaet, esli imya kataloga ne prinadlezhit vam ili vy ne imeete prava zapisi. Proishodit sleduyushchee: imya kataloga kopiruetsya pervym, ustanav- livayutsya prava dostupa (blokiruya vas) i posle etogo file1 i file2 ne mogut byt' skopirovany v katalog dir. V cptdir my primenyaem reshenie iz- menit' umask tak, chtoby vy vsegda imeli prava zapisi. |to svoego roda kludzh, no on rabotaet. Drugoj put' - eto izmenit' operator find. Vypolnenie operatora "find /dir -depth -print" sgeneriruet takoj spisok fajlov: /dir/file1 /dir/file2 /dir Obratite vnimanie, chto imya kataloga stoit POSLEDNIM! |to pravil'- no. Klyuch -depth perevorachivaet spisok fajlov tak, chto imya kataloga pe- chataetsya poslednim. CHto eto daet? Fokus v tom, chto snachala kopiruyutsya file1 i file2, a zatem ustanavlivayutsya prava dostupa dannogo kataloga. Vy mozhete za- pisat' fajly v katalog, dlya kotorogo vy ne imeete prava zapisi. Blago- darya tomu, chto fajly kopiruyutsya pervymi, vy mozhete ne bespokoit'sya o tom, kakogo roda prava dostupa imeet etot katalog. K sozhaleniyu, klyuch -depth komandy find podderzhivaetsya ne vsemi versiyami sistemy UNIX. 3.2.2. can - udalenie fajlov v "musornuyu korzinu" ---------------------------------------------------------------------- Imya: can ______________________________________________________________________ can Upravlenie "musornoj korzinoj" fajlov

    NAZNACHENIE

Peremeshchaet fajly v "musornuyu korzinu", simuliruya ih udalenie. |to dopuskaet vosstanovlenie fajlov posle ih kazhushchegosya udaleniya. Format vyzova can [-l] [-r] file [file ...] Primer vyzova can junk Posylaet fajl junk v "musornuyu korzinu" Ishodnyj kod dlya can 1 : 2 # @(#) can v1.0 Maintain file trash can Author: Russ Sage 4 CAN=$HOME/.trashcan 6 if [ ! -d $CAN ] 7 then mkdir $CAN 8 fi 10 if [ "`echo \"$1\"|cut -c1`" = "-" ] 11 then case $1 in 12 -l) echo "$CAN:" 13 ls -al $CAN 14 exit 0;; 15 -r) echo "removing $CAN/*:" 16 rm -rf $CAN/* 17 exit 0;; 18 -z|-?) echo "usage can [-l] [-r] file [file ...]" >&2 19 exit 0;; 20 esac 21 fi 23 mv $@ $CAN Peremennye sredy vypolneniya CAN Polozhenie kataloga "musornoj korziny" HOME Polozhenie vashego registracionnogo kataloga Opisanie Zachem nam nuzhen can? Po bol'shomu schetu sistema UNIX, pri vsem ee velikolepii, yavlyaetsya prosto strukturoj dlya nakopleniya i manipulirovaniya dannymi v fajlah. Kak my otmechali ran'she, eta sistema vklyuchaet sotni fajlov. Nekotorye fajly vy zhelaete hranit' neopredelenno dolgo, v to vremya kak drugie otsluzhili svoe i sozdayut besporyadok na diske. K neschast'yu, legko vyb- rosit' to, chto v dejstvitel'nosti vy hoteli sohranit'. Komandu rm so- vershenno ne ukrashaet to, chto ona yavlyaetsya pech'yu dlya szhiganiya musora: bros'te chto-nibud' v nee i ono propadet (esli tol'ko vy ne imeete ko- pii, a vosstanovlenie kopii - eto trudoemkaya rabota). Vot neskol'ko klassicheskih primerov nevernogo primeneniya komandy rm: rm * /tmp <-- Udalit' vse fajly v kataloge /tmp My hoteli skazat' rm /tmp/*, a na samom dele proizoshlo snachala udalenie vseh fajlov v tekushchem kataloge, a zatem popytka udalit' /tmp. Poslednee budet bezuspeshnym, poskol'ku tmp - eto katalog. V rezul'tate my udalili vse, chto hoteli sohranit', i sohranili vse, chto hoteli uda- lit'! |tot sintaksis pohozh na drugie operatory UNIX, vrode "grep * file": protivnaya oshibka. rm -rf / tmp <-- Udalit' katalog tmp so vsemi fajlami My hoteli skazat' rm -rf /tmp, no nechayanno vstavili probel v ko- mandu. Na samom dele udalyatsya VSE fajly vo vsej sisteme (esli my dadim komande vypolnyat'sya dostatochno dolgo), potomu chto my skazali UNIX uda- lit' kornevoj katalog i vseh ego potomkov! Vy dolzhny byt' vnimatel'ny s komandoj rm. Esli pokazhetsya, chto chto-to ne tak, udalite etu komandu. Ona mozhet pogubit' vas. Odna takaya oshibka mozhet isportit' vam celyj den'. Posle togo, kak eto sluchitsya, vy stanete ostorozhnym na nekotoroe vremya, potom vnimanie oslabnet. Esli vy ne budete bditel'nym, oshibki vernutsya, chtoby presle- dovat' vas. Dlya nas "musornaya korzina" bolee zhelatel'na, chem pech' dlya szhiganiya "musora". Ispol'zuya etot put', vy mozhete vernut'sya i vosstanovit' to, chto vy vybrosili po oshibke. Vy takzhe hoteli by kontrolirovat', kogda poyavitsya musorosborshchik, zahvatit i okonchatel'no udalit "musor". Vy mo- zhete periodicheski prosmatrivat' soderzhimoe "musornoj korziny", a zatem ochishchat' korzinu, kogda vy uvereny, chto vy ne hotite nichego v nej sohra- nyat'. Nel'zya dopuskat', chtoby korzina byla slishkom zapolnena, potomu chto ona zanimaet diskovoe prostranstvo. CHto delaet can? Komandnyj fajl can prednaznachen dlya upravleniya "musornoj korzinoj" vashih fajlov. Ispol'zuya utilitu, vy mozhete svesti k minimumu sluchajnye poteri vo vremya raboty i dazhe vposledstvii vosstanavlivat' fajly pri neobhodimosti. Can ne tol'ko pomeshchaet vashi fajly v "musornuyu korzinu", no i poka- zyvaet vam, chto v nej v nastoyashchee vremya nahoditsya i ochishchaet ee, kogda vy etogo hotite. Can raspoznaet tol'ko klyuchi -l i -r. Klyuch -l pokazyvaet, chto naho- ditsya v "musornoj korzine", a -r udalyaet vse ee soderzhimoe. Zapomnite, chto esli vy chto-to udalili iz "musornoj korziny", vy ne smozhete ego vosstanovit'. Process pomeshcheniya fajlov v "musornuyu korzinu" vypolnyaetsya komandoj mv. Klyuchi, prednaznachennye dlya can, dolzhny byt' pervym argumentam v ko- mandnoj stroke. Esli vy zhelaete peredat' klyuchi komande mv, to ih mozhno pomestit' v lyubom meste komandnoj stroki. Edinstvennye klyuchi, dayushchie sintaksicheskuyu podskazku, - eto -z i -?. Ih prednaznachenie - byt' fla- gami tol'ko dlya obrabotki oshibok. Blagodarya nalichiyu special'nyh flagov obrabotki oshibok, vydayushchih spravochnuyu (help) informaciyu, klyuchi komandy mv, kak i klyuchi can, mozhno pomeshchat' pervymi v komandnoj stroke, ne oka- zyvaya vliyaniya na can. Esli vy sozdaete vashi komandnye fajly tak, chtoby eti klyuchi vsegda vydavali informaciyu ob ispol'zovanii (t.e. nikogda ne byli "nastoyashchimi" klyuchami), to vy imeete horoshij sposob polucheniya pomo- shchi po sintaksisu. Mnogie (no, uvy, ne vse) standartnye komandy UNIX da- yut po klyucham -z ili -? podskazku ob ispol'zovanii i eto polezno pomnit' vsyakij raz, kogda vy popali v tupik. Esli can ne poluchaet nikakih klyuchej, dejstvie po umolchaniyu zaklyu- chaetsya v peresylke vseh ukazannyh fajlov v "musornuyu korzinu", razme- shchennuyu v vashem registracionnom kataloge pod imenem $HOME/.trashcan. Esli etot katalog otsutstvuet, on avtomaticheski sozdaetsya pri pervom vypolnenii komandnogo fajla can. |to pozvolyaet vam zapuskat' komandu, ne ukazyvaya special'nogo polozheniya "korziny". Esli vy primenyaete klyuch -r, fajly v "musornoj korzine" budut udaleny, a sama ona net. Primery 1. $ can *.c Peremeshchaet vse fajly, kotorye okanchivayutsya na .c, v "musornuyu kor- zinu". 2. $ can -l Vydaet spisok vseh fajlov, razmeshchennyh sejchas v "musornoj korzi- ne". 3. $ can -r Udalyaet vse fajly iz "musornoj korziny". 4. $ can -q * Peredaet klyuch -q komande mv. Poskol'ku eto nedopustimyj klyuch ko- mandy mv, ona vydaet soobshchenie ob oshibke i zavershaetsya. Poyasneniya Stroka 4 ustanavlivaet mesto "musornoj korziny" tak, chtoby ona razmeshchalas' v vashem registracionnom kataloge pod imenem .trashcan. Za- met'te, chto ee imenovanie, nachinaya s tochki, delaet ee neraspechatyvae- mym, ili skrytym fajlom. Edinstvennyj sposob uvidet' takie fajly - ispol'zovat' klyuch -a v komande ls. Stroki 6-8 proveryayut, opredelen li sejchas katalog "musornoj korzi- ny". Esli net, on sozdaetsya. Obratite vnimanie, chto poskol'ku ego soz- daete vy, on imeet takie prava dostupa na chtenie i zapis', kak v vashem registracionnom kataloge. Stroki 10-21 proveryayut, nachinaetsya li pervyj pozicionnyj parametr s chertochki (-). Esli takoj parametr obnaruzhen, proveryaetsya, yavlyaetsya li on klyuchom komandnogo fajla can (-l, -r, -z ili -?). Obratite vnimanie, chto dlya togo, chtoby dlya ispol'zovaniya dvojnyh kavychek vnutri dvojnyh kavychek (stroka 10), vy dolzhny ekranirovat' kavychki. Simvol obratnoj kosoj cherty (\) ispol'zovan imenno dlya etoj celi. Esli ukazan klyuch -l, vydaetsya napominanie ob imeni kataloga "musornoj korziny", komanda ls vyvodit spisok fajlov v "musornoj korzi- ne" i procedura can zavershaetsya, poskol'ku trebovalos' tol'ko vyvesti spisok. Esli ukazan klyuch -r, vydaetsya soobshchenie ob imeni kataloga ochishchae- moj "musornoj korziny" i fajly v nej udalyayutsya komandoj rm. |to razru- shitel'naya veshch' i udalyaet vashi fajly navsegda. Posle udaleniya can zaver- shaet rabotu. Vy mozhete dopolnit' programmu procedury tak, chtoby davat' podtverzhdenie pered vypolneniem komandy, esli eto pozvolit vam chuvstvo- vat' sebya bolee spokojno. Esli ukazan klyuch -z ili -?, vydaetsya podskazka ob ispol'zovanii i can zavershaetsya. |to ne sovsem horosho, no my ne mozhem ispol'zovat' sim- vol *, sootvetstvuyushchij lyubomu drugomu klyuchu, poskol'ku klyuch mozhet byt' prednaznachen dlya komandy mv, a ne dlya can. Blagodarya ispol'zovaniyu vse- go dvuh argumentov dlya obrabotki oshibok, my mozhem razreshit' peredachu vseh ostal'nyh argumentov. Esli klyuch ne yavlyaetsya odnim iz klyuchej can, ili odnim iz ukazannyh klyuchej obrabotki oshibok, to on peredaetsya koman- de mv. Esli klyuch nedopustim dlya etoj komandy, komanda mv vydaet svoe soobshchenie ob oshibke i zavershaet rabotu. Vy mozhete, estestvenno, modifi- cirovat' komandnyj fajl tak, chtoby on proveryal dopustimost' klyuchej ko- mandy mv na "vneshnem" urovne. Togda on mozhet vydat' soobshchenie ob oshibke i zavershit'sya, esli ukazannyj klyuch nedopustim ni dlya can, ni dlya mv. Vopros v tom, stoit li platit' za bolee polnyj kontrol' nad obrabotkoj oshibok cenoj razbuhaniya programmy i vremenem ispolneniya. Stroka 23 vypolnyaet sobstvenno peremeshchenie fajlov v "musornuyu kor- zinu". Zamet'te, chto eto vypolnyaetsya tol'ko esli ne ukazany nikakie klyuchi can, poskol'ku eto povedenie can, prinyatoe po umolchaniyu. Zdes' ispol'zuetsya parametr $@. Putem vklyucheniya vseh parametrov v komandnuyu stroku, lyubye klyuchi, prednaznachennye komande mv, peredayutsya ej. Takim sposobom my mozhem izmenit' put', kotorym fajly posylayutsya v "musornuyu korzinu". 3.2.3. dosflp - kopirovanie fajlov s gibkogo diska formata MS-DOS s ispol'zovaniem simvolov shablona v imenah fajlov ------------------------------------------------------------------- Imya: dosflp _____________________________________________________________________ dosflp Kopirovanie fajlov s gibkogo diska formata DOS s ispol'zovaniem simvolov shablona v imenah fajlov

    NAZNACHENIE

Kopiruet fajly s gibkogo diska v formate DOS (v XENIX) na zhestkij disk. Obespechivaet vozmozhnost' ispol'zovaniya zapisi s pomoshch'yu simvo- lov-shablonov dlya imen fajlov na gibkom diske, gde takaya zapis' obychno nedopustima.

    FORMAT VYZOVA

dosflp [-a] [-c] [-dDRIV] [-eEXP][-h] [-l] [-r] [-sDIR] gde -a oznachaet kopirovanie fajlov, sootvetstvuyushchih *.asm -c oznachaet kopirovanie fajlov, sootvetstvuyushchih *.c -d vybiraet imya ustrojstva DRIV iz nabora A,B,X,Y (po umolchaniyu A) -e ispol'zuet vyrazhenie EXP, chtoby primenit' k fajlam grep -h kopiruet fajly, sootvetstvuyushchie *.h -l tol'ko vydaet spisok fajlov -r udalyaet fajly vmesto ih kopirovaniya -s ukazyvaet podkatalog DIR na gibkom diske formata DOS Primer vyzova dosflp Kopirovanie vseh fajlov s ustrojstva A: v tekushchij katalog Ishodnyj kod dlya dosflp 1 : 2 # @(#) dosflp v1.0 Wildcard copies from DOS floppy Author: Russ Sage 4 EXP=.\* 5 DRIVE="A:" 6 OP="c" 8 if [ "$#" -gt 0 ] 9 then for ARG in $@ 10 do 11 case "$ARG" in 12 -a) EXP='.*\.asm$';; 13 -c) EXP='.*\.c$';; 14 -d*) DRIVE="`echo $ARG | cut -c3-`:";; 15 -e*) EXP='`echo $ARG | cut -c3-`';; 16 -h) EXP='.*\.h$';; 17 -l) OP="l";; 18 -r) OP="r";; 19 -s*) DRIVE="$DRIVE`echo \"$ARG" | cut -c3- `/";" 20 *) echo "dosflp: arg error" 21 echo "usage: dosflp [-a] [-c] [-d] [-e] [-h] [-l] [-r] [-s]" 22 exit 1;; 23 esac 24 done 25 fi 27 case $OP in 28 c) echo "\nCopying files from $DRIVE to `pwd`";; 29 l) echo "\nListing files on $DRIVE" 30 dosdir $DRIVE | more 31 exit;; 32 r) echo "This option removes all the data on the floppy." 33 echo -n "Do you want to do this (y/n): " 34 read RSP 35 if [ "$RSP" = "y" ] 36 then echo "\nRemoving files on $DRIVE" 37 else exit 38 fi;; 39 esac 41 dosls $DRIVE | tr "[A-Z]" "[a-z]" > /tmp/doslist 43 for FILE in `grep "$EXP" /tmp/doslist` 44 do 45 echo $FILE 46 case $OP in 47 c) doscp $DRIVE$FILE .;; 48 r) dosrm $DRIVE$FILE;; 49 esac 50 done 52 rm /tmp/doslist Peremennye sredy vypolneniya ARG Hranit argumenty komandnoj stroki DRIVE Ustrojstvo s gibkim diskom formata DOS EXP Vyrazhenie, imitiruyushchee dejstvie simvola-shablona FILE Hranit imya fajla, nad kotorym proizvoditsya dejstvie OP Klyuch, opredelyayushchij neobhodimoe dejstvie Opisanie Zachem nam nuzhen dosflp? |to komanda tol'ko dlya sistemy XENIX. Operacionnaya sistema XENIX, yavlyayas' produkciej firmy Microsoft, imeet sredstva dlya obshcheniya s fajlo- voj sistemoj MS-DOS. Dlya oznakomleniya s osnovami sovmestnogo ispol'zo- vaniya DOS i XENIX davajte rassmotrim osnovnye parametry. Kazhdyj zhestkij disk mozhet imet' maksimum chetyre razdela. |to ogra- nichenie MS DOS, kotoroe pereneseno v mir XENIX. Nichego plohogo v etom net, poka my ne nachinaem rabotat' s zhestkim diskom bol'shoj emkosti. Dlya 70-megabajtnogo diska, naprimer, vy mozhete sozdat' chetyre rav- nyh razdela, kazhdyj iz kotoryh soderzhit priblizitel'no 17 Mbajt. Vy mo- zhete sozdat' men'shij razdel, no togda drugoj razdel dolzhen byt' bol'she. V zavisimosti ot togo, kakaya chast' vashih programm i dannyh dolzhna byt' ispol'zovana v osnovnom MS-DOS i kakaya - XENIX, mozhet byt' ispol'zovana razlichnaya konfiguraciya. Bol'shim preimushchestvom sistemy XENIX/DOS yavlyaetsya to, chto XENIX mo- zhet razmeshchat'sya v odnom razdele, a DOS v drugom. Kak eto sdelat'? Nuzhno zapustit' programmu "fdisk" v kazhdoj operacionnoj sisteme. |to znachit, chto XENIX mozhet obshchat'sya s razdelom DOS, poluchaya polnoe imya ustrojstva, ukazyvayushchee na drugoj razdel. Drajver, kotoryj chitaet razdel DOS, dol- zhen znat', kak vyglyadit DOS (t.e. znat' fajlovuyu sistemu DOS). Esli vy- polnit' takuyu operaciyu, mozhno poluchat' spiski fajlov i kopirovat' ih tuda i obratno. K sozhaleniyu, DOS ne imeet vozmozhnosti chteniya razdelov XENIX. Pri rabote s gibkim diskom vy imeete delo tol'ko s odnim razdelom. |to snova ogranichenie DOS. Nekotorye sistemy UNIX, v otlichie ot DOS, pozvolyayut imet' stol'ko razdelov na zhestkom ili gibkom diske, skol'ko vy hotite, v otlichie ot DOS. Po opredeleniyu, gibkij disk DOS sformati- rovan v sisteme DOS, kotoraya vypolnyaet formatirovanie nizkogo urovnya i pomeshchaet fajlovuyu sistemu DOS na gibkij disk. V sisteme XENIX gibkij disk mozhet byt' libo v formate fajlovoj sistemy, libo nestrukturirovannym ustrojstvom posledovatel'nogo dostupa podobno magnitnoj lente. Dlya procedury dosflp my ispol'zuem tol'ko gib- kie diski v formate DOS. Teper' k delu. Predpolozhim, vy imeete sistemu DOS i fajly, nahodya- shchiesya na diske DOS, vy mozhete chitat' i pisat' fajly na gibkij disk iz XENIX. No sushchestvuyut nekotorye ogranicheniya na vypolnenie operacii kopi- rovaniya, kotorye ne slishkom udobny pol'zovatelyu. Naprimer, vy mozhete skazat' "doscp *.c a:". V rezul'tate vse fajly tekushchego kataloga koto- rye okanchivayutsya na .c, budut skopirovany na gibkij disk formata DOS na ustrojstve a:. Pobochnyj effekt vypolneniya doscp zaklyuchaetsya v tom, chto vse simvoly perevoda stroki (ili progona stroki) prevrashchayutsya v simvol vozvrat karetki/perevod stroki, poskol'ku DOS obrabatyvaet konec stroki inache, chem XENIX. Takim zhe obrazom, kogda vy kopiruete s gibkogo diska formata DOS v XENIX, lishnie simvoly vozvrata karetki ubirayutsya. CHto vy ne mozhete sdelat', tak eto skazat' "doscp a:*.c". Komanda doscp ne dopuskaet ukazaniya vida *.c pri kopirovanii s gibkogo diska. |to proishodit potomu, chto komandnyj processor rasprostranyaet metasim- voly (*,?,[]) i ne mozhet neposredstvenno chitat' razdel DOS. Poetomu vy ne mozhete ispol'zovat' simvoly pri kopirovanii s gibkogo diska DOS. Otmetim, chto mozhet nablyudat'sya gorazdo bol'she pobochnyh effektov, kogda vy imeete delo s gibkimi diskami DOS. Vo-pervyh, dlina imeni faj- la ogranichena. DOS dopuskaet do vos'mi simvolov imeni fajla plyus tri simvola rasshireniya. V rezul'tate posle kopirovaniya vseh vashih fajlov XENIX na gibkij disk mnogie iz nih mogut imet' ne te imena, kotorye oni imeli v XENIX. |to sushchee stradanie, kogda vy pytaetes' sdelat' kopiyu na gibkie diski DOS, potomu chto vy bol'she ne imeete uverennosti, kak obra- shchat'sya k fajlam, kogda vy kopiruete ih obratno s gibkogo diska. Krome togo, poskol'ku rasshirenie imeni fajla v DOS imeet tol'ko tri simvola, fajl s imenem "spreadsheet.finance" mozhet okazat'sya na gibkom diske DOS s imenem "spreadsh.fin" i raspoznavanie ego mozhet predstavlyat' oprede- lennye trudnosti. No eto eshche ne vse. Kogda fajl kopiruetsya iz XENIX v DOS, VSE imena v DOS zapisyvayutsya zaglavnymi bukvami. Esli u vas est' fajly s imenami, v kotoryh smeshany verhnij i nizhnij registry, to vy neskol'ko poteryaete ponyatnost' imen. Esli vy ispol'zuete v imenah simvoly verhnego registra pri kopirovanii fajlov obratno v XENIX, oni ne perevodyatsya na nizhnij registr. V rezul'tate vse imena vashih fajlov okazyvayutsya zapisannymi simvolami verhnego registra v XENIX, chto ne ochen' udobno. V chem my nuzhdaemsya, tak eto v takom sredstve, kotoromu my mozhem ukazyvat', kakie fajly kopirovat' s gibkogo diska na zhestkij disk, i kotoroe kopiruet ih s sohraneniem registra v imeni fajla. Vse eto dela- et procedura dosflp. CHto delaet dosflp? Dosflp pytaetsya isklyuchit' vse negativnye aspekty kopirovaniya faj- lov XENIX/DOS. |to vysokoe trebovanie, no ono dostizhimo. Vkratce podhod dosflp sleduyushchij: poluchit' spisok imen fajlov s gibkogo diska, pere- vesti imena v nizhnij registr, vybrat' iz polnogo spiska imena teh faj- lov, kotorye sootvetstvuyut vashim trebovaniyam, i zatem kopirovat' fajly odin za drugim v tekushchij katalog XENIX. Dlya togo, chtoby sdelat' eto, trebuetsya gorazdo bol'she komand XENIX vida dosxx, a takzhe razlichnyh drugih komand XENIX. V dopolnenie k kopirovaniyu, dosflp takzhe vydaet spisok fajlov, ko- torye imeyutsya na gibkom diske DOS, i udalyaet fajly s gibkogo diska. |ti funkcii legko realizovat', potomu chto kak tol'ko odin raz procedura dostupa napisana, dobavit' novye komandy dlya vypolneniya operacij nad fajlami dovol'no prosto. Obychno my hotim upravlyat' fajlami opredelennogo tipa kak gruppoj. Syuda otnosyatsya assemblernye ishodnye fajly, ishodnye fajly na yazyke C i fajly-zagolovki na yazyke C. Poetomu, chtoby snyat' s vas obyazannosti po vvodu universal'nyh simvolov dlya etih tipov fajlov, my pryamo ukazyvaem ih v kachestve opcij komandy dosflp. Naprimer, klyuch -a kopiruet tol'ko fajly, kotorye okanchivayutsya na .asm, poetomu net neobhodimosti pomnit' vid vyrazheniya dlya kopirovaniya etih fajlov. Analogichno, klyuch -c kopiruet vse fajly, okanchivayushchiesya na .c, i klyuch -h kopiruet fajly, okanchivayushchi- esya na .h. Kak my uvidim pozzhe, pryamoe ukazanie, o kotorom my govorim zdes', yavlyaeetsya vyrazheniem dlya komandy grep. Ispol'zovanie vseh vozmozhnostej komandy grep dostigaetsya pri ukazanii obrazcov imen fajlov. Ispol'zujte klyuch -d dlya ukazaniya, s kakogo gibkogo diska proizvo- ditsya kopirovanie. Po umolchaniyu eto ustrojstvo a: ili A:. Ne imeet zna- cheniya, na kakom registre vy ukazhete imya ustrojstva. Dlya uverennosti prover'te fajl /etc/default/msdos. |tot fajl soderzhit sootvetstviya mezh- du simvolom ustrojstva i marshrutnym imenem XENIX. Naprimer, fajl mozhet vyglyadet' tak: A=/dev/fd048ds9 B=/dev/fd148ds9 C=/dev/hd0d D=/dev/hd1d X=/dev/fd096ds15 Y=/dev/fd196ds15 Kak vy vidite, marshrutnye imena - eto obychnye imena ustrojstv i nichego bol'she. V kachestve osnovnogo sredstva vypolneniya raboty dosflp ispol'zuet komandu doscp. |to utilita sposobna ponimat' format fajlovoj sistemy DOS. Dosflp peredaet ej oboznachenie ustrojstva i drugie opcii posredstvom peremennyh komandnogo processora. Naprimer, klyuch "-dB:" me- nyaet ustrojstvo na B vmesto prinyatogo po umolchaniyu ustrojstva A. Esli vyrazheniya pryamogo ukazaniya tipa fajlov ne sootvetstvuyut tomu, chto vam nuzhno, vy mozhete opredelit' svoi sobstvennye vyrazheniya so- postavleniya, ispol'zuya klyuch -e. Napomnim, chto vyrazhenie dolzhno soot- vetstvovat' sintaksisu komandy grep. Esli vy hotite osvezhit' svoyu pa- myat', posmotrite grep(1) v rukovodstve po AT&T UNIX ili grep(C) v ruko- vodstve po XENIX. Dlya polucheniya polnoj informacii o sintaksise posmot- rite ed(1). |tot sintaksis yavlyaetsya osnovoj bol'shinstva komand, rabota- yushchih s regulyarnymi vyrazheniyami, takih kak sed i grep. Naprimer, esli vy ispol'zuete vyrazhenie "*test*", vyrazhenie dlya grep dolzhno imet' vid ".*test.*". Ego mozhno slegka izmenit' v zavisi- mosti ot togo, chto vy zhelaete imet' s kazhdoj storony cepochki test. V dannom sluchae sintaksis ukazyvaet vse simvoly (.*), za kotorymi sleduet cepochka t-e-s-t, a zatem lyubaya cepochka simvolov (.*). V etom sluchae klyuch imel by vid "-e.\*test.\*". |to kazhetsya nemnogo strannym, no eto sootvetstvuet sintaksisu. (Dvojnye kavychki ne yavlyayutsya chast'yu komandy.) Simvol obratnoj kosoj cherty (\) ispol'zuetsya dlya ekranirovaniya zvezdoch- ka. Esli vy ne ekraniruete ee, komandnyj processor sootneset ee s ime- nami vseh fajlov vashego tekushchego kataloga, chego vy ne zhelaete. |krani- rovanie ee pozvolit, chtoby nuzhnyj simvol byl peredan dosflp, dlya ispol'zovaniya ee v grep-posledovatel'nosti. Klyuch -h - eto eshche odin iz klyuchej pryamogo ukazaniya. Davajte vkratce rassmotrim ego sintaksis vnutri dosflp. |to ".*\.h$", i on ukazyvaet lyuboj simvol, za kotorym stoit odno ili neskol'ko vhozhdenij lyubogo sim- vola (.*), literal'naya tochka (.\), simvola h i vsled za nim konec stro- ki (h$). Vy mogli by ukazat' to zhe samoe, ispol'zuya klyuch -e, no -h de- laet eto gorazdo legche. Klyuch -l izmenyaet osnovnoe dejstvie komandy dosflp. Vmesto kopiro- vaniya fajlov on vydaet spisok fajlov. |to delaetsya putem vypolneniya razlichnyh komand vida dosxx, v dannom sluchae dosdir. Klyuch vydachi spiska polezen v dosflp, potomu chto vy mozhete poluchit' spisok kak informaciyu k resheniyu o tom, chto delat' dal'she, i vam net neobhodimosti pomnit' ko- mandu dosdir. Klyuch -r takzhe izmenyaet osnovnuyu operaciyu komandy dosflp. V etom sluchae fajly udalyayutsya, a ne kopiruyutsya. Esli vy ukazali etot klyuch, vy- daetsya soobshchenie, kotoroe prosit vas podtverdit', chto vy hotite udalit' ukazannye fajly. Vy mozhete prosto otvetit' "n", i zapretit' udalenie, esli vy vveli etot opciyu sluchajno. Napomnim, chto udalennye fajly ili fajly, vklyuchennye v spisok (v sluchae klyucha -l), vybrany vyrazheniem grep, kotoroe zhestko zaprogrammirovano ili ukazano pol'zovatelem. Po umolchaniyu vybirayutsya VSE fajly. Dlya klyucha -r eto sootvetstvuet tomu, chto skazat' "rm *". Poslednij klyuch, -s, obespechivaet vozmozhnost' dostupa k fajlam, ko- torye razmeshcheny vnutri podkataloga na gibkom diske DOS. Esli vy obrashcha- etes' tol'ko k imeni ustrojstva, po umolchaniyu klyuch -s otnositsya k kata- logu samogo verhnego urovnya na gibkom diske. Esli nuzhnyj vam fajl naho- ditsya v podkataloge, vy dolzhny ispol'zovat' opredelennuyu notaciyu, chtoby popast' v nego. Odno iz razlichij mezhdu XENIX i DOS zaklyuchaetsya v simvo- le, ispol'zuemom dlya razdeleniya elementov marshrutnogo imeni. XENIX ispol'zuet obychnuyu zapis' v stile UNIX - /x/y/z. V DOS primenyaetsya sim- vol "obratnaya kosaya cherta", t.e. \x\y\z. No esli vy hotite ispol'zovat' komandy XENIX na gibkom diske DOS, vy dolzhny primenyat' obychnuyu zapis' XENIX, a:/x/y/z. |to ne sovsem ponyatno, no pravil'no. Po umolchaniyu, dosflp kopiruet fajly s gibkogo diska v vash tekushchij katalog na zhestkom diske. Esli vy izmenite operaciyu na vydachu spiska ili udalenie, eta operaciya budet proizvedena na gibkom diske. Primery 1. $ dosflp -dB: -c -l Vydaet spisok vseh fajlov vida *.c na gibkom diske DOS, razmeshchen- nom v ustrojstve B. V etom sluchae ne proishodit perehod vniz v podkata- logi, a vklyuchayutsya lish' fajly, razmeshchennye na verhnem urovne katalogov. 2. $ cd /destdir $ dosflp -ssrc -e.\*src.\* Perehod v katalog, kuda budut pomeshcheny fajly. Kopiruyutsya fajly s gibkogo diska DOS (ustrojstvo A, podkatalog src), v tekushchij katalog. Fajly dlya kopirovaniya ukazany kak *src*. V zapisi UNIX eto vyglyadelo by tak: "cp A:/src/*src* .". 3. $ dosflp -r -stmp Udalyaet vse fajly, razmeshchennye v podkataloge tmp na gibkom diske DOS (ustrojstvo A). Obratite vnimanie, chto sam katalog ne udalyaetsya. V zapisi UNIX eto vyglyadelo by tak: "rm A:/tmp/*". 4. $ sh -x `path dosflp` -dB: Zapuskaet proceduru dosflp v otladochnom rezhime vypolneniya. Edinstvennoe ogranichenie pri takom vyzove komandnogo processora zaklyu- chaetsya v tom, chto fajl dannyh, kotoryj vy posylaete emu (v dannom slu- chae dosflp), dolzhen imet' polnoe marshrutnoe imya. Poskol'ku komandnyj processor NE vypolnyaet poisk marshrutnogo imeni fajla, nam neobhodimo sperva najti marshrutnoe imya dosflp, zatem peredat' ego komandnomu pro- cessoru, zapushchennomu v otladochnom rezhime vypolneniya, a takzhe peredat' procedure dosflp argument v komandnoj stroke. Zamet'te, chto vyzov dosflp takim putem ne menyaet znachenie peremennoj $#, kotoroe tol'ko raspoznaet klyuch -dB: kak argument. Poyasneniya Stroki 4-6 vypolnyayut inicializaciyu po umolchaniyu putem sohraneniya znachenij v sootvetstvuyushchih peremennyh komandnogo processora. Po umolcha- niyu simvol-shablon stavitsya v sootvetstvie vsem fajlam, ukazannym vyra- zheniem dlya komandy grep .\*. Obratnaya kosaya cherta trebuetsya dlya ekrani- rovaniya zvezdochki, poetomu ona ne perehvatyvaetsya komandnym processo- rom. Ustrojstvo po umolchaniyu - A:. Operaciya po umolchaniyu - kopirovat' fajly, chto ukazano znacheniem "c" dlya peremennoj opcii. V strokah 8-25 ustanavlivayutsya znacheniya klyuchej i proizvoditsya pro- verka na nalichie oshibok. Esli komandnaya stroka imeet nekotorye argumen- ty ($# -gt 0), my perebiraem kazhdyj argument i proveryaem ego. Esli naj- den dopustimyj klyuch, peremennye ustanavlivayutsya soglasno klyuchu. Esli obnaruzhen nedopustimyj klyuch, vydaetsya soobshchenie ob oshibke i programma zavershaetsya s plohim statusom vozvrata. Imeetsya dva vazhnyh tipa klyuchej. Klyuchi, kotorye vypolnyayut pryamoe ukazanie tipa fajla, prosto ustanavlivayut peremennuyu EXP v sootvetstvii s klyuchom. Analogichno, klyuchi, kotorye opredelyayut, kakoj vid raboty budet vypolnyat'sya proceduroj, prosto ustanavlivayut sootvetstvuyushchuyu peremennuyu OP. Drugie klyuchi dolzhny obrabatyvat'sya putem izvlecheniya odnogo ili neskol'kih simvolov iz komandnoj stroki, kotorye sleduyut za flagom klyu- cha, eho-otobrazheniya i konvejernoj peresylki tekushchego argumenta ARG ko- mande cut dlya izvlecheniya simvola (simvolov), nachinayushchihsya s tret'ego simvola argumenta, zatem prisvoeniya rezul'tata etoj operacii soot- vetstvuyushchej peremennoj. Iz vsego sdelannogo sleduet vyvod, chto probely mezhdu klyuchami i simvolami, kotorye stoyat za nimi, ne dopuskayutsya. Naprimer, klyuch -d dolzhen poluchit' imya ustrojstva. Po sintaksisu dolzhno byt' -dB:, no ne -d B:, potomu chto B: interpretirovalos' by kak drugoj argument ARG v cikle for, a eto vse isportit. V strokah 27-39 operaciya, kotoraya dolzhna byt' vypolnena, opredelya- etsya pri pomoshchi sleduyushchego operatora case. Esli dolzhno byt' vypolneno kopirovanie, vydaetsya soobshchenie "copying" i vypolnyaetsya to, chto sleduet za operatorom case. Esli dolzhen byt' vydan spisok fajlov, vydaetsya soobshchenie ob ustrojstve, soderzhimoe kotorogo dolzhno raspechatat'sya, za- tem vydaetsya spisok fajlov putem vypolneniya komandy dosdir i konvejer- noj peresylki rezul'tata komande more, posle chego dosflp zavershaetsya. Esli fajly dolzhny byt' udaleny, pol'zovatelyu vydaetsya zapros na podtverzhdenie udaleniya. Esli otvet "yes", vydaetsya soobshchenie, s kakogo ustrojstva fajly budut udaleny. Esli otvet "no", dosflp zavershaetsya. Ostatok komandnogo fajla imeet delo s mehanizmom kopirovaniya. Stroka 41 - eto pervyj shag v navedenii mosta nad propast'yu mezhdu dvumya tipami nositelej. Komanda dosls ispol'zovana dlya polucheniya polnogo spiska fajlov s gibkogo diska. Pered tem kak my peredadim etot spisok vo vremennyj fajl, my propustim ego cherez komandu tr (translate), koto- raya preobrazuet vse simvoly na nizhnij registr, chtoby pri kopirovanii fajlov ih imena byli v nizhnem registre. V rezul'tate kopii budut pome- shcheny na disk XENIX s imenami fajlov v nizhnem registre. Esli u vas est' fajly s imenami v verhnem registre ili v smesi registrov, vy dolzhny vruchnuyu ispravit' ih posle kopirovaniya. Stroki 43-50 vypolnyayut samo kopirovanie. Cikl for zapuskaetsya dlya dostupa k kazhdomu fajlu individual'no. |to trebovanie komand vida dosxx. Vy dolzhny poluchat' dostup k odnomu fajlu odin raz, poskol'ku etot uroven' ne obladaet vozmozhnost'yu ukazaniya simvola-shablona. Imena fajlov, kotorye ispol'zuet cikl for, opredeleny putem ispol'zovaniya ko- mandy grep dlya vybora imen sootvetstvenno vyrazheniyu, ustanovlennomu ra- nee. Imya kazhdogo vybrannogo fajla snachala otobrazhaetsya, tak chto pol'zo- vatel' mozhet videt', vypolnyaetsya li komanda tak, kak ozhidalos'. V etom meste my mozhem sdelat' odnu iz dvuh veshchej: ili kopirovat' fajly, ili udalit' ih. |ta operaciya opredelyaetsya operatorom case v strokah 46-49. Esli operaciya - kopirovanie fajlov, fajly kopiruyutsya iz kombinacii ust- rojstvo-fajl v tekushchij katalog. Obratite vnimanie, chto v peremennuyu DRIVE vklyuchaetsya podkatalog, esli on byl ukazan v komandnoj stroke. |to ob座asnyaet nalichie simvola "/" v konce prisvoeniya znacheniya peremennoj DRIVE v stroke 16. Polnoe vyrazhenie dolzhno byt' takim: B:/subdir/file. Esli operaciya - udalenie fajlov, kombinaciya ustrojstvo/fajl udalyaetsya vypolneniem komandy dosrm. Poputno zametim, chto marshrutnoe imya est' nechto gibkoe (ili nebrezhnoe, v zavisimosti ot togo, kak vy smotrite na nego) v tom smysle, chto vy mozhete skazat' A:/subdir ili A:subdir. Oba varianta pravil'ny. Posle togo kak vse fajly budut obrabotany, vremen- nyj fajl udalyaetsya.

    VOZMOZHNYE MODIFIKACII KOMANDNOGO FAJLA

Odno iz mest, gde vy mozhete nastraivat' dosflp, eto regulyarnye vy- razheniya. Uzhe vklyucheny vyrazheniya dlya .asm, .c i .h, no vy mozhete izme- nit' eto ili dobavit' bol'she klyuchej dlya lyuboj posledovatel'nosti, koto- ruyu vy chasto ispol'zuete. 3.3. Sredstva polucheniya rezervnyh kopij 3.3.1. autobkp - avtomaticheeski narashchivamyj fajl rezervnoj kopii --------------------------------------------------------------------- Imya: autobkp _____________________________________________________________________ autobkp Avtomaticheski narashchivaemyj fajl rezervnoj kopii

    NAZNACHENIE

Proizvodit poisk po derevu fajlov, kotorye izmenyalis' za poslednie 24 chasa, i peresylaet ih v druguyu sistemu (posredstvom uucp) ili pere- meshchaet ih v druguyu oblast' zhestkogo diska.

    FORMAT VYZOVA

autobkp [-c] [>logfile] -c kopiruet fajly v drugoe mesto diska vmesto ispol'zovaniya uucp Primer vyzova autobkp < filelist >> bkplog Kopiruet vse fajly, ukazannye v filelist, i zapisyvaet imena fajlov v fajl s imenem bkplog Komandnyj fajl autobkp 1 : 2 # @(#) autobkp v1.0 Automatic file backup Author: Russ Sage 4 if [ $# -gt 1 ] 5 then echo "autobkp: argument error" >&2 6 echo "usage: autobkp [-c] [>logfile]" >&2 7 exit 8 fi 10 if [ "$1" = "-c" ] 11 then COPY=on 12 else COPY=off 13 fi 15 echo "\nBACKUP DATE `date '+%a %m/%d/%y %H:%M:%S'`" 16 echo "-----------------------------------------" 18 SYSTEM='' # destination system uucp node name 19 : ${SYSTEM:=`uuname -l`} 21 echo "Sourse system:\t\t`uuname -l`\nDestination system:\t$SYSTEM" 23 while read SRCDIR DESTDIR FILES 24 do 25 if [ ! -d $SRCDIR ] 26 then echo "autobkp: $SRCDIR is not a directory" 27 continue 28 fi 30 cd $SRCDIR 31 echo "\nFinding files in: $SRCDIR" 33 for FILE in `find . -type f -ctime 0 -name "$FILES" -print` 34 do 35 case $COPY in 36 off) uucp $FILE $SYSTEM!$DESTDIR;; 37 on) cp $FILE $DESTDIR;; 38 esac 39 echo " Transferred $FILE to $DESTDIR" 40 done 41 done Peremennye sredy vypolneniya COPY Flag, opredelyayushchij, ispol'zuetsya komanda uucp ili cp FILE Imya kazhdogo fajla, najdennogo v ishodnom spiske marshrutov FILES Simvol-shablon, ukazyvayushchij, kakie fajly opredeleny PATH1 Imya marshruta-istochnika PATH2 Imya marshruta-priemnika SYSTEM Imya sistemy-priemnika dlya uucp Opisanie Zachem nam nuzhen autobkp? Kak my zametili, fajly v UNIX plodyatsya kak kroliki. CHem bol'she fajlov my sozdaem, tem sil'nee zhelanie sohranyat' ih uporyadochennymi. Do- vol'no legko stat' lenivym ili poluchit' lozhnoe predstavlenie o bezo- pasnosti i prenebrech' regulyarnym kopirovaniem. Vy mozhete podhodit' k kopirovaniyu fajlov neskol'kimi putyami. Nai- bolee populyarnoj strategiej yavlyaetsya vypolnenie narashchivaemogo kopirova- niya, kogda vsya sistema kopiruetsya s nekotoroj nachal'noj daty (i inogda povtorno s regulyarnymi intervalami, no ne chasto). Pri korotkih interva- lah (obychno ezhednevno) fajlovaya sistema proveryaetsya na nalichie fajlov, kotorye byli modificirovany ili dobavleny za poslednie 24 chasa. Takie fajly kopiruyutsya, poetomu kopiya v celom podderzhivaetsya takoj, kakoj yav- lyaetsya sistema v nastoyashchee vremya. Gde razmeshchat' kopiruemye fajly - eto eshche odin interesnyj vopros, zavisyashchij ot konfiguracii vashej sistemy, kolichestva dostupnogo prost- ranstva i vazhnosti dannyh. Davajte rassmotrim nekotorye vozmozhnosti. Avtonomnaya mikro- ili supermikrosistema mozhet imet' vsego odin zhestkij disk. Esli disk soderzhit dostatochno mesta dlya razmeshcheniya drugo- go razdela, vy mozhete kopirovat' v etot razdel. Razdel mozhet takzhe ispol'zovat'sya kak nestrukturirovannoe ustrojstvo v otlichie ot fajlovoj sistemy i rassmatrivat'sya kak magnitnaya lenta ili gibkij disk. Sredi drugih vozmozhnostej hraneniya informacii mogut byt' vtoroj zhestkij disk, kassetnaya lenta ili ustrojstvo kopirovaniya na lentu. Esli vam nedostup- na ni odna iz etih vozmozhnostej, vy vsegda mozhete kopirovat' na gibkie diski. |to utomitel'naya ruchnaya rabota, no ona mozhet byt' vypolnena pri pomoshchi komand tar ili cpio. Esli vy takzhe imeete dostup k drugoj, bol'shej sisteme, takoj kak obshchij glavnyj komp'yuter, vy mozhete kopirovat' fajly, posylaya ih v etu sistemu posredstvom komandy uucp. Dazhe esli vy imeete dostatochno mesta v vashej sobstvennoj sisteme dlya sohraneniya vashih kopij, u vas mozhet byt' ochen' sil'noe zhelanie poslat' kopii vseh vazhnyh fajlov v glavnuyu mashinu, potomu chto eto dast vam vynosnuyu kopiyu za predelami vashego mesta raspolozheniya. Pozhary, navodneniya i dr yutsya. Nam neobhodim mehanizm, kotoryj obychno zapuskaetsya avtomaticheski (po komande cron ili s pomoshch'yu procedury at, opisannoj v glave 5). Sna- chala on obnaruzhivaet vse fajly, kotorye byli izmeneny v poslednie 24 chasa (nadeemsya, chto vy uzhe imeete pervonachal'nuyu kopiyu vsego). On nachi- naet iskat' fajly iz ukazannyh katalogov i kopirovat' podhodyashchie fajly v ukazannye katalogi-priemniki. On kopiruet fajly, ispol'zuya utility, kotorye nailuchshim obrazom sootvetstvuyut ispol'zuemoj vami konfiguracii. Vse eti veshchi vypolnyayutsya nashim komandnym fajlom autobkp. CHto delaet autobkp? Vy perechislyaete marshruty i autobkp nahodit fajly po etim marshrutam i kopiruet ih v to mesto, kotoroe vy ukazali. Vy mozhete ukazyvat' imena fajlov po obrazcam, takim kak *.c, *.h ili kakim-libo eshche. S pomoshch'yu autobkp vy mozhete kopirovat' vazhnye fajly bez kopirovaniya vseh fajlov. Inogda eto udobno - propuskat' fajly pri kopirovanii. Tipichnye fajly, kotorye vy, vozmozhno, ne hotite kopirovat', - eto ochen' bol'shie fajly (ne yavlyayushchiesya vazhnymi, kak fajl core i fajly dannyh), vremennye fajly (kak *.o, kotorye vnov' sozdayutsya pri kazhdoj novoj kompilyacii) i ispol- nyaemye fajly, esli u vas est' ishodnye programmy na yazyke Si i vy mozhe- te ih skompilirovat' dlya polucheniya novyh ispolnyaemyh fajlov. Propuskaya eti fajly, vy mozhete umen'shit' razmer vashih kopij na megabajty. Po umolchaniyu kopirovanie proizvoditsya komandoj uucp, kotoraya pred- polagaet, chto u vas podchinennaya sistema po otnosheniyu k glavnoj mashine i kopiruet vashi fajly v bol'shuyu sistemu. Esli vy hotite kopirovat' vashi fajly v drugoe mesto zhestkogo diska ili na drugoj zhestkij disk, ispol'- zujte klyuch -c dlya kopirovaniya komandoj cp vmesto ispol'zovaniya komandy uucp. Vo vremya processa kopirovaniya na standartnyj vyvod vyvodyatsya soob- shcheniya o sostoyanii del. |to pozvolyaet legko sobrat' vse soobshcheniya putem pereadresacii stdout na vremya kopirovaniya. Esli vy vypolnyaete autobkp vruchnuyu, soobshcheniya vyvodyatsya na ekran. Pervoe soobshchenie - eto zagolo- vok, kotoryj pechataet den', datu i vremya. |to vyglyadit tak: -------------------------- | BACKUP DATE Fri 05/23/86 17:33:35 | Vtoroe soobshchenie opredelyaet sistemu-istochnik i sistemu-priemnik. Ono poyavlyaetsya nizhe. V nashem primere sistema-istochnik - russ, a siste- ma-priemnik - vax. -------------------------- | Source system: russ | Destination system: vax Pri kazhdom vhode v sistemu-istochnik vydaetsya sleduyushchee soobshchenie: ----------------------------- | Finding files in: src_dir | gde vyrazhenie src_dir - eto mesto, otkuda fajly budut peredany v cikl kopirovaniya. Obratite vnimanie, chto pervoe imya dolzhno byt' imenem kataloga, potomu chto autobkp nachinaet imenno s etogo mesta poisk faj- lov. Esli pervoe imya ne yavlyaetsya katalogom, programma pechataet soobshche- nie ob oshibke i prodolzhaet rabotu so sleduyushchim naborom istochnik/priem- nik dlya kopirovaniya. Dlya kazhdogo najdennogo fajla pechataetsya sleduyushchee soobshchenie posle zaversheniya kopirovaniya: ------------------------------ | Transferred file to dest_dir | kotoroe ukazyvaet, chto fajl file byl skopirovan v katalog-priemnik s imenem dest_dir. Fajl so spiskom marshrutov CHtoby sdelat' interfejs nastol'ko gibkim, naskol'ko eto vozmozhno, autobkp chitaet standartnyj vvod. Perenaznachaya stdin, vy mozhete podder- zhivat' raznye spiski fajlov, kotorye neobhodimo kopirovat' i pereklyu- chat' ih v komandnoj stroke. Vy mozhete imet' odin spisok marshrutov dlya sistemnyh fajlov, drugoj dlya ishodnyh fajlov, tretij dlya lichnyh fajlov, chetvertyj dlya fajlov s gotovym produktom i tak dalee. Dlya kazhdoj iz etih grupp fajlov sozdaetsya spisok marshrutov i peredaetsya v kachestve vhoda dlya autobkp. Vhodnye dannye chitayutsya kak tri polya: FROM, TO i TYPE. Pole FROM - eto katalog-istochnik. Poisk fajlov nachinaetsya s etogo mesta. Napomnim, chto autobkp prohodit vniz do konca dereva fajlov, na- chinaya s ukazannogo kataloga. Pole TO - eto katalog-priemnik, kuda vse fajly, najdennye dlya dan- noj zapisi v fajle so spiskom marshrutov, pomeshchayutsya na mashine-priemnike ili v razdele-priemnike. Pole TYPE - eto opisatel'-shablon, kotoryj soobshchaet autobkp, kakie fajly iskat'. Ego znachenie mozhet byt' *, *.c, *src*, i tak dalee. Kak my uvidim pozzhe, etot opisatel' peredaetsya komande find Unix, kotoraya fakticheski i vypolnyaet poisk fajlov. Vy mozhete ispol'zovat' lyuboe vyra- zhenie v pole TYPE, esli ono sootvetstvuet sintaksisu find. Itak: vse fajly, kotorye byli izmeneny v poslednie 24 chasa, obna- ruzhivayutsya v spiske FROM s pomoshch'yu opisatelya TYPE i kopiruyutsya v ob- last' TO. Nizhe privoditsya tipichnyj fajl so spiskom marshrutov. On ukazyvaet neskol'ko katalogov, v kotoryh proizvoditsya poisk fajlov. Obratite vni- manie, chto eti katalogi nahodyatsya pod registracionnym katalogom: esli vy hotite skopirovat' VESX registracionnyj katalog polnost'yu, vy mozhete ukazat' etot katalog, no zdes' my hotim vybrat' tol'ko ukazannye kata- logi. /usr/russ/bin /pack1/russ/.bkp/bin * /usr/russ/doc /pack1/russ/.bkp/doc * /usr/russ/src /pack1/russ/.bkp/src *.c /usr/product1 /pack1/russ/.bkp/product1 *.[ch] |ti stroki kopiruyut katalogi bin, doc i src na lokal'noj mashine avtora. V sluchae kataloga src my ukazali, chto kopirovat' nuzhno tol'ko ishodnye fajly na yazyke Si. Budet takzhe skopirovana nekotoraya poleznaya informaciya iz drugogo mesta etoj zhe sistemy. Budut skopirovany tol'ko fajly s rasshireniem *.c i *.h. Mesto naznacheniya (pryamo ukazannoe v komandnom fajle avtomatichesko- go kopirovaniya) - drugaya sistema UNIX. Mesto naznacheniya - nekotoryj smontirovannyj disk, registracionnyj katalog, podkatalog kopij (bkp). Ispol'zovanie cron Teper', kogda procedura autobkp znaet, chto iskat', davajte skazhem ej, kogda iskat'. Cron, vechnyj rezidentnyj hranitel' vremeni, mozhet legko vypolnit' etu rabotu. Vhodnye dannye dlya cron obychno ustanavliva- yutsya sistemnym administratorom (ili kem-libo, kto imeet prava zapisi v /usr/lib/crontab), tak chto vy dolzhny poprosit' administratora ustano- vit' dlya vas vhod v fajl dannyh cron. Dlya polucheniya dopolnitel'noj in- formacii o vhodnyh dannyh cron, prochtite cron(1M) v Rukovodstve admi- nistratora. Korotko govorya, polyami v fajle /usr/lib/crontab yavlyayutsya minuta, chas, den' mesyaca, mesyac i den' nedeli. Ispol'zuya *, my mozhem ustanovit' prinuditel'no mnogie iz etih polej vo vse vozmozhnye znache- niya. Vhodnye dannye dlya cron, kopiruyushchie moj registracionnyj katalog v 4.00 utra kazhdyj den' kazhdoj nedeli kazhdogo mesyaca goda, vyglyadyat tak: 0 4 * * * /usr/russ/bin/autobkp.cron Obratite vnimanie, chto vhod v cron vyzyvaet upravlyayushchuyu proceduru vmesto togo, chtoby neposredstvenno ispol'zovat' autobkp. Imeetsya neskol'ko vazhnyh prichin, chtoby napisat' proceduru na baze utility autobkp. Vo-pervyh, cron ne pechataet diagnosticheskuyu informaciyu na vash terminal, poetomu esli chto-nibud' idet ne tak, vy nikogda ob etom ne uznaete. Vo-vtoryh, proshche podderzhivat' usechennuyu versiyu autobkp, a zvu- kovye preduprezhdeniya dobavlyat' v upravlyayushchuyu proceduru. Vy mozhete sde- lat' sobstvennye modifikacii upravlyayushchej programmy i ne bespokoit'sya ob otsutstvii soobshchenij ot samoj utility. Upravlyayushchuyu programmu mozhno nastol'ko uslozhnit', naskol'ko vy zhelaete. Predstavlennaya zdes' vpolne rabotosposobna, no legko mozhet byt' dopolnena. # Cron-driven autobkp driver echo "backed up: `date`" > /dev/tty00 /usr/bin/autobkp < /usr/russ/bin/autobkpath >> /usr/russ/bin/autobkp.log |tot drajver vydaet soobshchenie na terminal, zapuskaet autobkp, ispol'zuet dlya vvoda fajl so spiskom marshrutov v kataloge bin i pomeshcha- et vse vyvodnye soobshcheniya v fajl protokola. Otmetim, chto imya terminala dano kak absolyutnoe (tty00). |to pravil'no tol'ko v tom sluchae, kogda v vashej sisteme imeetsya takoj terminal. Ispol'zovanie etogo imeni termi- nala pozvolyaet soobshcheniyu poyavit'sya na ekrane dazhe esli nikto na nem ne zaregistrirovan. |to horosho, potomu chto pervoe, chto vy smozhete uvidet' utrom na vashem ekrane - eto soobshchenie. Esli u vas net ukazannogo termi- nala, vy mozhete sdelat' chto-to drugoe, naprimer, peredachu samomu sebe pochtovogo soobshcheniya. Primery 1. $ autobkp Zapuskaet programmu bez peredachi ej fajla so spiskom marshrutov i bez fajla protokola. Poskol'ku polya FROM, TO, TYPE ishchutsya v standartnom vvode, vvedite ih vruchnuyu. Kogda vy nazhmete vozvrat karetki, autobkp vypolnit ukazannye dejstviya, napechataet informaciyu na ekran terminala i budet ozhidat' dal'nejshego vvoda. Dlya zaversheniya vypolneniya komandnogo fajla vvedite ^d (v rezul'tate operator read vernetsya s nenulevym sta- tusom). 2. $ autobkp < pathlist Poluchaet vse vhodnye dannye iz fajla so spiskom marshrutov, no pe- chataet vsyu protokol'nuyu informaciyu na ekran terminala. Autobkp zaversha- etsya, kogda prochitaet vse dannye v fajle pathlist. 3. $ autobkp >> logfile Kak i v pervom sluchae, spiski marshrutov dolzhny byt' vvedeny s kla- viatury. Vse vyhodnye dannye vyvodyatsya v fajl protokola, a ne na ekran. Dlya zaversheniya autobkp vvedite ^d. 4. $ autobkp -c < pathlist >> logfile Kopiruet fajly iz odnoj oblasti zhestkogo diska v druguyu (oprede- lennuyu katalogom-priemnikom v fajle pathlist). Beret vse vhodnye dannye iz fajla pathlist i vyvodit vse vyhodnye dannye v fajl logfile. Poyasneniya Stroki 4-8 vypolnyayut proverku na nalichie oshibok. Autobkp mozhet byt' vyzvan libo bez ukazaniya opcij, libo s odnoj opciej (-c, pri ispol'zovanii cp). Vspomnite, chto perenaznachenie vvoda-vyvoda NE prini- maetsya vo vnimanie pri rassmotrenii argumentov, potomu chto komandnyj processor interpretiruet simvoly perenaznacheniya i to, chto sleduet za nimi, do vyzova komandy. Takim obrazom, esli kolichestvo pozicionnyh pa- rametrov bol'she odnogo (#1 -gt 1), poluchaem oshibochnoe uslovie. Zatem vydaetsya soobshchenie ob oshibke i sintaksicheskaya podskazka i programma za- vershaetsya. V strokah 10-13 proveryaetsya ispol'zovanie klyucha -c. Obratite vni- manie, chto my ne proveryaem, raven li parametr $# edinice i ne pytaemsya vydelit' pervyj simvol, chtoby posmotret', raven li on "-". |to potomu, chto takaya proverka privedet k oshibke, esli ne ukazan nikakoj klyuch (chto yavlyaetsya vernym sintaksisom, kak ukazyvalos' ranee). Esli my skazali if [ $1 = -c ] i ne ukazali klyuchej, to komanda proverki ne srabotaet i budet vy- dano soobshchenie o tom, chto "no argument in the statement" ("v operatore net argumentov"). No esli my vypolnim ekranirovanie, naprimer, tak: if [ "$1" = "-c" ] to kavychki dopuskayut nulevoe znachenie argumenta, tak chto proverka pravil'no ocenit nedostayushchee znachenie $1 kak "raven li nul' -c?" |to dast rezul'tat "lozh'", poetomu vse horosho. Poputno davajte vnimatel'no rassmotrim rabotu komandy proverki. Vy mozhete vypolnit' proverku znacheniya dvumya sposobami. Pervyj - sravnenie strok, a vtoroj - chislovoe sravnenie. Peremennye komandnogo processora VSEGDA hranyatsya v vide strok. Vy mozhete, tem ne menee, zastavit' siste- mu rassmatrivat' eti posledovatel'nosti kak chisla i interpretirovat' ih znacheniya kak chislovye, podobno operatoru number = val(STRING$) yazyka Bejsik. Vy mozhete skazat' sisteme, chtoby ona izmenila svoj sposob rassmotreniya simvol'nyh strok putem izmeneniya sintaksisa operacii srav- neniya. Dlya simvol'nyh strok sravnenie vyglyadit tak: str1 = str2 a chislovoe sravnenie vyglyadit tak: num1 -eq num2 -lt -gt Sver'te eto s rukovodstvom. Esli vy popytaetes' smeshat' simvol'noe sravnenie s chislovym, sravnenie ne budet rabotat'. U menya zabralo mnogo mesyacev programmirovanie na komandnom processore, poka nakonec ya zame- til eto neznachitel'noe razlichie. Esli ne rassmatrivat' podrobno chto-li- bo podobnoe, to takie tehnicheskie oshibki kazhutsya neulovimymi, no mozhno najti ob座asneniya, pochemu chto-nibud' rabotaet ne tak. Vernemsya k vozmozhnosti proverki koda. Esli byl peredan klyuch -c, peremennaya COPY ustanavlivaetsya, chto znachit "Da, my sobiraemsya kopiro- vat' komandoj cp, a ne ispol'zovat' uucp". Esli klyuch -c ne ispol'zu- etsya, peremennaya COPY ne ustanavlivaetsya. V strokah 15-16 pechataetsya zagolovochnoe soobshchenie o tom, chto budet vypolnyat'sya kopirovanie. Obratite vnimanie, chto my spryatali komandu date sistemy UNIX vnutri operatora echo, sokrativ chislo perehvachennyh dannyh, kotorye my dolzhny imet', chtoby poluchit' datu neposredstvenno. Prosledite za kavychkami v etom operatore. Vneshnie kavychki yavlyayutsya dvojnymi dlya togo, chtoby upakovat' ves' argument dlya operatora echo. Znaki udareniya (`) obramlyayut komandu date tak, chto ona yavlyaetsya "vypol- nyaemoj vnutri" i ee vyhodnoe soobshchenie perehvatyvaetsya dlya nashih nuzhd. Odinarnye kavychki vnutri komandy date ispol'zuyutsya dlya peredachi forma- ta, kotoryj izmenyaet vneshnij vid znachenij tak, chtoby zagolovok vyglyadel bolee krasivo. V konce operatora echo kavychki sleduyut odna za drugoj. |to ne predstavlyaet problemy, poskol'ku vo vlozhennosti net nikakoj dvusmyslennosti. Vy dolzhny pomnit', chto nuzhno sledit' za situaciej, kogda vy i komandnyj processor mozhete rashodit'sya vo mneniyah, t. e., kogda vy dolzhny obrashchat'sya k zapisi vida "\". V stroke 18 peremennoj SYSTEM prisvaivaetsya imya udalennoj sistemy, v kotoruyu vy budete kopirovat' komandoj uucp. Zdes' ona ravna nulyu, chto pozzhe vyzovet vypolnenie drugoj operacii dlya obespecheniya funkcionirova- niya po umolchaniyu. Esli zhe vy hotite vsegda kopirovat' na vpolne oprede- lennuyu sistemu, modificirujte etu stroku, chtoby naznachit' imya etoj sistemy. Esli ostavit' stroku 18 tak, chtoby ona naznachala nol', stroka 14 pojmaet eto znachenie i prisvoit peremennoj SYSTEM imya vashej tekushchej sistemy. Drugimi slovami, esli vy ostavite stroku 18 tak, kak ona est', i vyzovete autobkp bez klyucha -c, vy budete kopirovat' komandoj uucp sa- mi na sebya, chto vpolne dopustimo. Odnako, iz soobrazhenij effektivnosti vy, veroyatno hoteli by vypolnit' autobkp -c dlya polucheniya lokal'noj ko- pii. Stroka 19 illyustriruet koncepciyu, chasto ispol'zuemuyu pri program- mirovanii na komandnom yazyke. Davajte vkratce rassmotrim ee. Pervyj simvol - eto ":". V dannom sluchae my interesuemsya, chto pro- ishodit pri proverke, a ne vozvrashchaemym znacheniem, poetomu my zastavili holostuyu komandu ("ne delat' nichego") poluchat' rezul'tat kak argument. Tekst, sleduyushchij za dvoetochiem, interpretiruetsya tak: "Esli peremennaya SYSTEM ne ustanovlena ili ustanovlena v nol', prisvoit' ej znachenie, kotoroe sleduet za nej". V dannom sluchae znachenie - eto vyhod komandy uuname -l. |ta komanda ustanavlivaet, chto sistema-priemnik yavlyaetsya toj zhe sistemoj, chto i ishodnaya, esli sistema-priemnik ne byla pryamo ukaza- na ranee. My ispol'zuem uuname -l, a ne standartnoe vyrazhenie uname -n po prichine sovmestimosti. Uname -n pravil'no poluchaet imya uzla iz struktu- ry uts yadra operacionnoj sistemy, no ne vse sistemy XENIX ispol'zuyut element uzla v vide struktury uts yadra sistemy. Vmesto etogo oni posy- layut imya v fajl /etc/systemid, kotoryj sootvetstvuet mikroseti (micnet), razrabotannoj dlya XENIX firmoj Microsoft. Komanda uuname -l - eto lokal'noe imya (ili ishodnaya mashina) dlya sistemy uucp. |ta komanda vozvrashchaet pravil'noe znachenie i v UNIX, i v XENIX. Imeet smysl ispol'- zovat' to, chto vsegda rabotaet! Stroka 21 pechataet imya ishodnoj sistemy i sistemy-priemnika. |to soobshchenie dobavlyaet informaciyu v zapis' o tom, chto sobiraetsya delat' autobkp, poetomu vy mozhete videt' po vyhodnym dannym, kak vy ustanovili dannyj komandnyj fajl. Snova my spryatali komandu uuname vnutri operato- ra echo. U nas net neobhodimosti sohranyat' imya ishodnoj sistemy, poskol'ku ono nam vsegda dostupno pri pomoshchi komandy uuname. Poskol'ku my vsego dva raza ispol'zuem eto imya, to reshili ne ispol'zovat' dlya ne- go kakuyu-libo peremennuyu. Stroki 23-41 - eto polnyj cikl, kotoryj upravlyaet avtomaticheskim kopirovaniem. Upravlyayushchim ciklom yavlyaetsya operator while, kotoryj chita- et znacheniya iz standartnogo vvoda. Zamet'te, chto vy mozhete schitat' neskol'ko znachenij v operatore read. |to udobno, esli vy hotite chitat' bolee odnogo znacheniya, no ne dolzhny vydelyat' kazhduyu porciyu vhodnyh dan- nyh dlya togo, chtoby opredelit', yavlyaetsya eto pervym, vtorym ili tret'im elementom dannyh. My chitaem ih vse srazu i oni prisvaivayutsya ukazannym peremennym. Poskol'ku vypolnyaetsya chtenie standartnogo vvoda, my mozhem perenapravit' stdin pri vyzove autobkp i operator read nikogda ne uzna- et, chem oni otlichayutsya. Esli my ne perenaznachaem vhodnye dannye, my dolzhny vvodit' ih s klaviatury. Cikl zavershaetsya pri chtenii konca fajla - v dannom sluchae konec fajla so spiskom marshrutov ili simvola control-d (^d) s klaviatury. Poetomu upravlyayushchij cikl rabotaet tak: "poka eshche est' dannye dlya chteniya, chitat' ih, obrabatyvat', zatem chitat' sleduyushchie." Stroki 25-28 proveryayut, yavlyaetsya li katalog-istochnik dejstvitel'no katalogom. Esli net, vydaetsya soobshchenie ob oshibke i operator continue privodit k sleduyushchej iteracii cikla while. V stroke 30 proizvoditsya smena kataloga na katalog-istochnik. Vot pochemu vyhodnye dannye komandy find yavlyayutsya otnositel'nymi k tochke (.). Esli by my ne vypolnili komandu cd, to polnoe imya stalo by abso- lyutnym, chto moglo by otrazit'sya na sisteme-priemnike. Togda marshrut, nachinayushchijsya s kataloga-priemnika, imel by vniz ot sebya lishnij absolyut- nyj put'. Stroka 31 pechataet katalog, v kotorom ishchutsya ishodnye fajly. Horo- sho imet' ih v fajle protokola, poskol'ku vam legche budet chitat' i sle- dit', gde v dannyj moment rabotaet autobkp. Stroki 33-40 vypolnyayut neposredstvenno kopirovanie fajlov. Zdes' ciklom yavlyaetsya cikl for, kotoryj chitaet imena fajlov iz vyhoda komandy find. Zamet'te, chto eto avtomaticheski ogranichivaet obshchee chislo fajlov, kotorye mozhet obrabatyvat' cikl. |tot fakt ranee byl ob座asnen v etoj knige, no davajte rassmotrim ego eshche raz. Esli find vydaet spisok, sostoyashchij iz soten fajlov, to spisok slov operatora for perepolnyaetsya i narushaet rabotu vashego komandnogo processora (ili po krajnej mere ko- mandy find). Zdes' prinyato dopushchenie, chto vy ne hotite imet' tak mnogo fajlov v ishodnom kataloge. Vy mozhete izbezhat' etogo, razbivaya ishodnyj katalog na bolee melkie chasti i peresylaya ih v fajl pathlist. Esli vy hotite sozdat' dejstvitel'no horoshij cikl, izmenite ego, naprimer, tak: find . -type f -ctime 0 -name "$FILES" -print | while read FILE Blagodarya ispol'zovaniyu takogo cikla, chislo imen fajlov teper' mozhno izmenit' ot vhodnyh ogranichenij dlya komandnogo processora do raz- merov kanala sistemy (kotoryj ochen' bol'shoj, prakticheski neogranichen- nyj). Izmenenie etoj odnoj stroki ne okazyvaet vliyaniya na drugie chasti cikla. Davajte rassmotrim detal'no komandu find. Vo-pervyh, my ukazali ej poisk fajlov v tekushchem kataloge (.). |to delaet vse polnye imena ot- nositel'nymi po otnosheniyu k tochke. Zatem my skazali komande find najti vse fajly tipa f, chto oznachaet obychnye fajly, a ne katalogi ili fajly ustrojstv. My ne hotim kopirovat' takie fajly. Dal'she my govorim ej najti fajly, kotorye byli izmeneny. Pod "izmeneniem" my podrazumevaem dostup ili modifikaciyu. (Posmotrite v opisanii stat(2), kakie komandy izmenyayut dostup, izmenyayut i modificiruyut vremya. Govorya "delat' poisk dlya nahozhdeniya "ctime 0"", my imeem v vidu vse fajly, izmenennye za poslednie 24 chasa. Ob座asneniya, kotorye dokumentaciya po find daet po po- vodu etih chisel, dovol'no neponyatny, poetomu otnesites' k nim s nedove- riem.) Zatem my govorim komande find "najti tol'ko te fajly, kotorye opredeleny putem sootvetstviya ih imen marshrutnym imenam, ukazannym v peremennoj $FILES, znachenie kotoroj my chitaem". V etom meste my mozhem otfil'trovat' fajly, kotorye nam ne nuzhny (kak ob座asnyalos' predvari- tel'no) ili vybrat' fajly, kotorye nam nuzhny. V konce my govorim koman- de find "napechatat' imena vseh fajlov, kotorye sootvetstvuyut pere- chislennym kriteriyam". Zatem imena fajlov peredayutsya v cikl for. Drugimi slovami, vyhodnye dannye komandy find stanovyatsya argumentom dlya ohvaty- vayushchego cikla for. V strokah 35-38 operator case opredelyaet, kakogo roda kopirovanie my sobiraemsya delat', i zapuskaet komandy kopirovaniya. Esli peremennaya COPY ne ustanovlena, my kopiruem fajly komandoj uucp. Obratite vnima- nie, chto mestom naznacheniya yavlyaetsya SYSTEM. Esli my ostavili SYSTEM v nule v stroke 18, to SYSTEM - eto nasha sobstvennaya sistema i my kopiru- em komandoj uucp fajly k sebe. Esli COPY ustanovlena, to nezavisimo ot znacheniya SYSTEM my kopiruem (no ne komandoj uucp) fajly v drugoj kata- log tekushchej sistemy. |tot katalog mozhet byt' na tom zhe zhestkom diske ili v drugoj smontirovannoj fajlovoj sisteme. Posle togo, kak fajl sko- pirovan, vydaetsya soobshchenie, kotoroe govorit o tom, kakoj fajl i kuda byl peredan. Udobno imet' v fajle protokola etu informaciyu, poskol'ku my imeem vozmozhnost' prosledit', kuda byli pereslany vashi skopirovannye fajly. Cikl find vypolnyaetsya do teh por, poka ne skopiruyutsya vse fajly v tekushchem segmente dereva. Napomnim, chto komanda find rekursivnaya, poeto- mu ubedites', chto vy ukazyvali ne bol'she derev'ev, chem vy hoteli. Esli vy ukazali "kopirovat', nachinaya s kornya (/)", to mozhet byt' peredan kazhdyj fajl, imeyushchijsya v sisteme. Kogda cikl for vypolnilsya, vneshnij cikl while idet k sleduyushchej iteracii. Kogda vse vhodnye dannye obrabo- tany, programma zavershaetsya. Nekotorye osobennosti uucp Kogda ispol'zuetsya uucp, v marshrute priemnika dolzhen byt' ustanov- len bit razresheniya vypolneniya ("x") dlya gruppy "others" (ostal'nye) dlya vseh promezhutochnyh katalogov, vedushchih k fajlu. |to budet vyglyadet' tak: --------x Samyj poslednij katalog dolzhen imet' prava dostupa vida "wx", chto- by uucp mogla pisat' fajl v katalog. Posle etogo vladel'cem fajla schi- taetsya uucp. Esli sobstvennikom fajla hotite byt' vy, skopirujte ego (ispol'zuya cp, a ne mv) s drugim imenem i on budet vashej sobstven- nost'yu. Esli vy pereimenuete ego komandoj mv, vy tol'ko izmenite imya, svyazannoe s tem zhe indeksnym opisatelem fajla (inode). No esli vy sko- piruete ego komandoj cp, vy sozdadite novyj otmechennyj opisatel' fajla. |tot novyj opisatel' fajla (sozdannyj vami) imeet vashi identifikator pol'zovatelya (uid) i identifikator gruppy (gid), poetomu vy vladeete im. Esli vy nahodites' v korne sistemy i kopiruete fajl (ispol'zuya cp, a ne mv) poverh drugogo sushchestvuyushchego fajla, informaciya v opisatele fajla ne izmenyaetsya, a menyayutsya tol'ko dannye, dostup k kotorym ukazyvaet opisatel' fajla. Kogda uucp ustanavlivaet predshestvuyushchie prava dostupa k fajlu na vseh promezhutochnyh katalogah takimi, chto vse imeyut pravo zapisi, poslednij katalog NE budet imet' zashchity. Predostavlenie lyubomu pol'zo- vatelyu prava zapisi oznachaet, chto kto ugodno mozhet udalit' ili izmenit' fajly v etom kataloge. Ne kazhdyj hochet davat' vsem eto pravo. Esli zhe vy kopiruete fajly v obychnuyu oblast' komandy uucp obshchego dostupa (/usr/spool/uucppublic/$LOGNAME), to vy dolzhny vnimatel'no sledit' za nimi. Mnogie sistemy imeyut zapuskaemye s pomoshch'yu cron programmy, proiz- vodyashchie v dannom kataloge poisk fajlov, k kotorym ne bylo dostupa v te- chenie opredelennogo kolichestva dnej, i udalyayut takie fajly - eto vredit vashim kopiyam. Esli period hraneniya bol'she, chem promezhutok mezhdu vashim kopirovaniem, u vas mozhet byt' vse v poryadke. Kak i mnogoe drugoe, eto zavisit ot vashih obstoyatel'stv i trebovanij bezopasnosti. Usovershenstvovaniya V originale fajl so spiskom marshrutov imeet argument TYPE v konce argumenta FROM, naprimer /usr/russ/bin/*. |to predstavlyaet problemu (krome togo, chto pokazyvaet, chto vash avtor eshche ne yavlyaetsya masterom!), potomu chto kogda simvol * budet vydelen, on budet rasshiren v imena vseh fajlov vmesto togo, chtoby traktovat'sya kak literal'nyj simvol. Prostoe reshenie - ispol'zovat' otdel'nye polya, chto i bylo sdelano. Masterskim resheniem yavlyaetsya ekranirovat' metasimvol dlya sohraneniya ego kak lite- ral'nogo simvola. Kak tol'ko simvol * budet vydelen iz marshrutnogo ime- ni, simvol \ predstavit ego v vide * vmesto togo, chtoby dat' ego na rasshirenie. Naprimer, mozhno napisat' tak: TYPE=`basename \"$FROM"` Zdes' simvol * prisvaivaetsya peremennoj TYPE, vmesto togo, chtoby prisvoit' TYPE spisok vseh fajlov, kotorye sootvetstvuyut metasimvolu. Zatem, kogda budet vyzvana komanda find, peremennaya TYPE dolzhna byt' ekranirovana tak, chtoby metasimvol interpretirovalsya ne komandnym pro- cessorom, a samoj komandoj find. 3.3.2. cpiobr - kopirovanie i vosstanovlenie fajlov v vide potoka dannyh ------------------------------------------------------------------- Imya: cpiobr ____________________________________________________________________ cpiobr Kopirovanie i vosstanovlenie v vide potoka dannyh komandoj cpio

    NAZNACHENIE

Obespechivaet interfejs v vide menyu s komandoj cpio i udobstva pri kopirovanii i vosstanovlenii fajlov. Vyhodnye dannye na nositel' kopi- ruyutsya v vide potoka dannyh.

    FORMAT VYZOVA

cpiobr Primer vyzova cpiobr Vyzyvaet glavnoe menyu dlya kopirovaniya, vosstanovleniya ili vydachi spiska fajlov Komandnyj fajl cpiobr 1 : 2 # @(#) cpiobr v1.0 Cpio stream backup and restore Author: Russ Sage 4 if [ "$#" -gt "0" ] 5 then echo "cpiobr: too many arguments" 6 exit 7 fi 9 while : 10 do 11 c 12 set `date` 13 echo " 15 $1, $2 $3 $4 17 Cpiobr Backup & Restore 18 ----------------------- 19 Backup to removable media 20 Restore from removable media 21 List files on media 22 Long list files on media 23 to exit 25 Press b,r,f,l or : \c" 27 read CMD 28 if [ "$CMD" = "" ] 29 then break 30 fi 32 ABORT=off 34 while : 35 do 36 echo " 38 Enter media type: 39 Raw System V floppy drive (/dev/rfp021) 40 Raw XENIX floppy drive (/dev/rfd0) 41 Tape drive (/dev/rmt0) 42 Any device (/dev/???) 43 to exit 45 Press s,x,t,a, or : \c" 47 read MEDIA 48 case $MEDIA in 49 s|S) DEV=/dev/rfp021 50 break;; 51 x|X) DEV=/dev/rfd0 52 break;; 53 t|T) DEV=/dev/rmt0 54 break;; 55 a|A) echo "enter full pathname (or <> to exit): \c" 56 read DEV 57 if [ "$DEV" = "" ] 58 then continue 59 else break 60 fi;; 61 "") ABORT=on 62 break;; 63 *) echo "cpiobr: invalid command \"$MEDIA\"";; 64 esac 65 done # while get media 67 if [ "$ABORT" = "on" ] 68 then continue 69 fi 71 case $CMD in 72 b|B) echo "\nEnter the source directory name: \c" 73 read SRC 74 cd $SRC 75 echo "\nPlace floppy in drive and hit ...\c" 76 read CMD 77 find . -print | sort | cpio -ocBv > $DEV 78 echo "\nhit \c" 79 read CMD 80 ;; 81 r|R) echo "\nEnter the destination directory name: \c" 82 read DEST 83 cd $DEST 84 echo "\nPlace floppy in drive and hit ...\c" 85 read CMD 86 cpio -icBvdmu < $DEV 87 echo "\nhit \c" 88 read CMD 89 ;; 90 f|F) cpio -icBt < $DEV 91 echo "\nhit \c" 92 read CMD 93 ;; 94 l|L) cpio -icBtv < $DEV 95 echo "\nhit \c" 96 read CMD 97 ;; 98 *) echo "cpiobr: invalid command \"$CMD\"" 99 ;; 100 esac 101 done Peremennye sredy vypolneniya ABORT Flag, opredelyayushchij, delat' li avarijnoe prekrashchenie CMD Komanda, poluchaemaya ot pol'zovatelya DEST Katalog-priemnik pri vosstanovlenii DEV Marshrutnoe imya ustrojstva nositelya MEDIA Hranit tip ustrojstva, kotoroe budet ispol'zovat'sya SRC Katalog-istochnik pri kopirovanii Opisanie Zachem nam nuzhen cpiobr? My uzhe poluchili predstavlenie ob udobstve i upravlenii kopirovani- em s pomoshch'yu komandy autobkp, no my eshche ne imeli dela s nestrukturiro- vannymi ustrojstvami. |to takie ustrojstva, kotorye ne soderzhat fajlo- vuyu sistemu, a prosto imeyut dannye, kotorye zapisany na nih v vide po- toka dannyh. V takom kachestve ispol'zuyutsya magnitnye lenty i inogda gibkie diski. Kak ukazyvalos' ranee, u vas mozhet otsutstvovat' diskovoe prostranstvo ili razmeshchennaya v drugom meste sistema dlya kopirovaniya v formate fajlovoj sistemy. Vmesto etogo vam mozhet potrebovat'sya ispol'- zovat' komplekt gibkih diskov ili magnitnuyu lentu. Dazhe esli u vas ime- yutsya drugie vozmozhnosti dlya kopirovaniya, mozhet nastupit' vremya, kogda kopiya na magnitnoj lente ili gibkih diskah mozhet byt' opravdana kak do- polnitel'naya mera predostorozhnosti, poskol'ku vposledstvii vy mozhete vosstanovit' lentu ili gibkie diski v drugom meste. Problema zaklyuchaetsya v tom, chto imeetsya shirokij nabor versij sin- taksisa komandy cpio dlya takogo kopirovaniya, kotorye zavisyat ot formata i ispol'zuemogo ustrojstva. Esli vy pereklyuchaete ustrojstva, vy dolzhny zapomnit' (ili dolzhny posmotret') sootvetstvuyushchij sintaksis. Odnim iz reshenij yavlyaetsya pryamoe ukazanie razlichnyh variacij komandy cpio v tekste programmy i vyzov ih v otvet na menyu, kotoroe prosto sprashivaet pol'zovatelya, kakogo tipa nositel' dolzhen byt' ispol'zovan. |to nash podhod pri napisanii cpiobr. Drugoe preimushchestvo sistemy menyu zaklyucha- etsya v tom, chto vy mozhete prisposobit' rutinnuyu rabotu po vypolneniyu takogo roda kopirovaniya dlya neopytnogo operatora ili kancelyarskogo ra- botnika, kotorym trebuetsya znat' tol'ko lish', kak montirovat' magnitnuyu lentu ili drugoj nositel' i otvechat' na voprosy menyu. CHto delaet cpiobr? Cpiobr - eto upravlyaemaya s pomoshch'yu menyu interaktivnaya utilita ko- pirovaniya i vosstanovleniya. Na samom dele eto interfejs s komandoj cpio sistemy UNIX. Funkcii, predostavlyaemye menyu, vklyuchayut kopirovanie faj- lov s zhestkogo diska na gibkij disk, vosstanovlenie fajlov s gibkogo diska na zhestkij disk, vydachu spiska imen fajlov, hranimyh na gibkom diske i vydachu spiska fajlov s neobyazatel'noj dopolnitel'noj informaci- ej (podobno ls -l). Gibkij disk zdes' yavlyaetsya pervichnym ustrojstvom naznacheniya, no mogut ispol'zovat'sya i drugie nositeli, takie kak mag- nitnaya lenta bol'shoj emkosti ili kassetnaya magnitnaya lenta (streamer). Posle vybora tipa operacii, kotoraya dolzhna byt' vypolnena, nuzhno vybrat' tip ispol'zuemogo ustrojstva. Utilita Cpiobr mozhet byt' ispol'- zovana na ustrojstvah sistemy UNIX firmy AT&T (/dev/fp021), ustrojstvah sistemy XENIX firmy IBM (/dev/fd0), strimernoj lente (/dev/rmt0) ili lyubom drugom ustrojstve po vashemu zhelaniyu (/dev/???). Obychno imya ust- rojstva opredelyaet tip ispol'zuemogo nositelya. Poskol'ku eta utilita prednaznachena dlya vseh mashin UNIX, nekotorye iz variantov mogut otsutstvovat' v vashej mashine, poetomu vy imeete pravo vybrat' lyuboe imya ustrojstva, kotoroe vam neobhodimo. Kak tol'ko imya ustrojstva vybrano i, esli vy vypolnyaete kopirova- nie ili vosstanovlenie, vam zadaetsya vopros, chto yavlyaetsya katalo- gom-istochnikom ili katalogom-priemnikom. Ukazhite imena katalogov, nachi- naya s vashego tekushchego kataloga ili absolyutnoe polnoe imya, nachinaya s kornya (/.), posle chego cpiobr perehodit v etot katalog i zatem ispol'- zuet otnositel'nye polnye imena s etogo mesta. Tem samym isklyuchayutsya lyubye problemy, svyazannye s tem, chto absolyutnoe polnoe imya stanovitsya chast'yu samoj kopii. Esli vy daete otnositel'noe polnoe imya, ubedites' v tom, chto ono nachinaetsya ot vashego tekushchego kataloga, chtoby cpiobr nachal rabotat' s nuzhnogo mesta v dereve fajlov. Kogda fajly kopiruyutsya na zhelaemyj nositel', marshrutnoe imya, pere- dannoe cpio, nachinaetsya s "/.". |to oznachaet, chto nikakogo prefiksa imeni kataloga na gibkom diske net. Poetomu pri vosstanovlenii fajlov obyazatel'no nuzhno dat' polnoe marshrutnoe imya. Vse fajly, postupayushchie s gibkogo diska, budut pomeshcheny pryamo v katalog-priemnik, kotoryj vy uka- zali cpiobr. Primery (Zdes' privodyatsya otvety na zaprosy glavnogo menyu, podmenyu i do- polnitel'naya informaciya, poyavlyayushchiesya v takom poryadke.) 1. b x $HOME Kopiruet fajly na gibkij disk sistemy XENIX, nachinaya s kataloga $HOME. 2. r a /dev/rmt0 $HOME Vosstanavlivaet fajly s ustrojstva, vybrannogo mnoj (/dev/rmt0, magnitnaya lenta), i pomeshchaet fajly v moj registracionnyj katalog. 3. l s Vydaet v shirokom formate informaciyu obo vseh fajlah, razmeshchennyh na gibkih diskah sistemy UNIX mashiny tipa PC. Poyasneniya V strokah 4-7 proizvoditsya proverka na nalichie oshibok uslovij vy- polneniya. Edinstvennaya oshibka uslovij vypolneniya - eto kogda vy ukazali kakie-libo argumenty cpiobr. Poskol'ku eto upravlyaemaya s pomoshch'yu menyu utilita, nikakih argumentov peredavat' ne nuzhno. Dlya togo, chtoby poluchit' obshchee predstavlenie o tom, kak eta utili- ta rabotaet, davajte podumaem nad tem, chto neobhodimo sdelat'. Vo-per- vyh, my dolzhny opredelit', kakoe dejstvie dolzhno byt' vypolneno. Polu- chiv etu informaciyu, nam neobhodimo uznat', kakoe ustrojstvo dolzhno ispol'zovat'sya. CHto, esli pol'zovatel' vvedet nevernyj vybor? Nam neob- hodimo ozhidat' v cikle do teh por, poka ne budet vvedeno pravil'noe znachenie. Posle polucheniya etih dvuh porcij informacii, nam nuzhno opredelit', gde iskat' ili kuda pomeshchat' fajly. Posle etogo my mozhem vypolnyat' cpio. Dlya vypolneniya etogo scenariya nam nuzhno vsego dva cikla: po odnomu dlya kazhdoj stadii vvoda. V dannom sluchae my ispol'zuem dva cikla tipa "vechnyj cikl while". Dlya vyhoda iz ciklov my ispol'zuem komandu komand- nogo processora break, kotoraya vyvodit nas iz tekushchego cikla. Nemnogo pozzhe my uvidim nalichie problemy pri takom podhode. Osnovnoj, samyj vneshnij upravlyayushchij cikl nachinaetsya so stroki 6 i zakanchivaetsya v poslednej stroke programmy - stroke 87. Cel'yu etogo vneshnego cikla yavlyaetsya upravlenie vypolneniem programmy v celom, polu- chenie opcij menyu ot pol'zovatelya i okonchatel'nyj vyhod, kogda pol'zova- tel' soobshchaet, chto on zakonchil rabotu. Konechno, vy mozhete po-prezhnemu vyjti iz programmy pri pomoshchi obychnogo simvola preryvaniya, no samo menyu imeet klyuch vyhoda (CR). Gorazdo luchshe predstavlyat' yavnyj klyuch, osobenno dlya neopytnyh pol'zovatelej. Nachinaya so stroki 11, my ustanavlivaem ekran dlya glavnogo menyu. Komandoj zdes' yavlyaetsya "c", chto budet poyasneno pozzhe v etoj knige. Ona sootvetstvuet "ochistke ekrana" i mozhet byt' zamenena standartnoj koman- doj ochistki sistemy UNIX, kotoruyu vy mozhete ispol'zovat' v etom meste, esli hotite. Stroka 12 ustanavlivaet v pozicionnye parametry vyhodnye dannye komandy date sistemy UNIX. Takoj sintaksis dostatochno redko vstrecha- etsya, no tem ne menee ochen' polezen. Esli by my ne hoteli delat' eto takim obrazom, my by dolzhny byli perehvatit' vse vyhodnye dannye koman- dy date v odnoj peremennoj, zatem razdelit' ih na melkie porcii i po- mestit' kazhduyu porciyu v otdel'nuyu peremennuyu. |to potrebovalo by namno- go bol'she komand i peremennyh v programme. Ispol'zuya nash sintaksis, my zastavlyaem pervyj pozicionnyj parametr byt' pervym polem vyhodnyh dan- nyh komandy date, vtoroj pozicionnyj parametr byt' vtorym polem i tak dalee. Dlya polucheniya lyubogo ukazannogo polya my ispol'zuem zapis' vida $n, gde n est' nomer pozicionnogo parametra. Stroki 13-25 - eto odin ogromnyj operator echo, kotoryj pechataet glavnoe menyu. Vydacha vsego neobhodimogo odnim operatorom echo predpoch- titel'nee, poskol'ku eto minimiziruet nakladnye rashody, s kotorymi prihoditsya stalkivat'sya pri vypolnenii bol'shogo chisla operatorov. Takoj put' bystree. Esli by my ispol'zovali operator echo dlya kazhdoj stroki glavnogo menyu, to ono pechatalos' by ochen' medlenno i preryvisto. Koman- da UNIX cat takzhe mogla by byt' primenena dlya etogo sluchaya, ispol'zuya zdes' dokumenty (vstavlennyj tekst). V kachestve primera etogo mozhet sluzhit' sleduyushchee: cat <<-EOF Main Menu Information EOF Odnako glavnaya problema voznikaet, kogda vy pechataete priglashenie. Dlya togo, chtoby kursor ozhidal vvoda v konce stroki priglasheniya, neobho- dimo vydat' na terminal simvol "\c", a cat ne mozhet sdelat' etogo. Vy vyvodite na ekran menyu s pomoshch'yu cat, i echo pechataet priglashenie, ko- toroe napravlyaetsya na druguyu sdvinutuyu stroku polnost'yu zapolnennogo ekrana. Postoyanstvo i skorost' - vot chego my dobivaemsya. Obuchenie takim tryukam eshche bol'she pomozhet vam pri napisanii programm bol'shogo razmera, kotorye ispol'zuyut mnozhestvo menyu i drugie tekstovye vyvody na ekran. Ispol'zovanie operatora echo v takom vide imeet nekotorye ne- dostatki, no oni sovershenno trivial'nye. Vo-pervyh, telo operatora echo dolzhno soderzhat' vse, chto vy hotite vyvesti na ekran, i eto trebuet absolyutnogo pozicionirovaniya vnutri operatora echo dlya polucheniya simvo- lov probela v nuzhnyh mestah. Obychno pri takom pozicionirovanii imeetsya sdvig strok v tekste programmy, poetomu vizual'no v tom meste komandno- go fajla, gde vyvoditsya menyu, poyavlyaetsya etot sdvig, no posle menyu stroki snova idut rovno. |to mozhet nemnogo smushchat' pri chtenii teksta programmy. Drugoj nesushchestvennoj detal'yu yavlyaetsya to, chto operator echo ne lyubit vyvodit' simvoly tabulyacii. Esli zhe vy vstavili simvol tabulyacii vnutri kavychek operatora echo, on obychno vyvoditsya kak probel. Dlya to- go, chtoby zastavit' echo vyvodit' simvoly tabulyacii, vy dolzhny skazat' eto operatoru echo na ego sobstvennom yazyke s pomoshch'yu simvolov "\t" ili \\t, esli bez kavychek. Poetomu menyu v cpiobr zapolneno simvolami probe- la. |to takzhe pozvolyaet legko sdvigat' menyu vlevo i vpravo pri pomoshchi nebol'shogo kolichestva probelov dlya sootvetstvuyushchego pozicionirovaniya na ekrane. Odnim iz spornyh voprosov yavlyaetsya mesto, gde menyu dolzhny poya- vit'sya na ekrane. Global'noe vyravnivanie po levomu krayu vyglyadit uzhasno, no centrirovanie narushaetsya pri vydache na ekran kakogo-libo soobshcheniya (naprimer, ot cpio). V dannom sluchae sdelano vyravnivanie ne po centru, a po levomu krayu. Neplohim kompromissom mozhet byt' otstup na tri-pyat' pozicij ot levogo kraya. Kak i v bol'shinstve sluchaev, kogda de- lo idet ob estetike, vy mozhete s etim ne soglasit'sya. Vernemsya k nashemu menyu. Dlya togo, chtoby sdelat' menyu na ekrane i bolee estetichnym, i informativnym, na ekran vyvodyatsya data i vremya. (Zamet'te, chto glavnoe menyu ochishchaetsya kazhdyj raz pered ego ispol'zova- niem.) Primer vida ekrana priveden nizhe. --------------------------------------- | Sreda, maj 28 13:18:49 | | Cpio - Sohranenie/vosstanovlenie fajlov | --------------------- | Kopirovanie dannyh | Vosstanovlenie dannyh | Spisok fajlov na nositele | Polnyj spisok fajlov na nositele | dlya vyhoda | | Nazhmite b,r,f,l, ili : V levom verhnem uglu raspolozhen den' nedeli, mesyac, den' mesyaca. |to polya 1, 2 i 3 komandy date. V pravom verhnem uglu raspolozheno teku- shchee vremya. |to pole 4 komandy date. Vse eti dannye privodyatsya dlya togo, chtoby menyu na ekrane smotrelos' krasivo, bylo ravnomerno zapolneno i informativno. Posle togo, kak menyu vydano na ekran, stroka 27 chitaet komandu pol'zovatelya. Zametim, chto odin iz klyuchej vyzyvaet zavershenie program- my, esli byl nazhat tol'ko vozvrat karetki. Kakim obrazom my proveryaem eto? My zaklyuchaem v kavychki vhodnuyu peremennuyu takim obrazom, chto pro- verka raspoznaet nulevoe znachenie (sm. stroki 28-30). Esli byl vveden nol', my vyhodim iz tekushchego cikla while. Tem samym my popadaem v konec programmy, kotoraya posle etogo zavershaet vypolnenie. Esli vhodnoe zna- chenie ne bylo ravno nulyu, my prodolzhaem i vypolnyaem v sleduyushchej komande proverku na nalichie oshibki. V stroke 32 provoditsya inicializaciya peremennoj ABORT putem sbrasyvaniya ee. |to budet detal'no poyasneno pozzhe. A sejchas my tol'ko skazhem, chto eta peremennaya sushchestvuet, poskol'ku imeetsya konflikt mezhdu tem, kak vypolnyaetsya komanda break, i strukturoj dannoj programmy (t.e. polnost'yu upravlyaemoj s pomoshch'yu menyu utility). V strokah 34-65 razmestilsya vlozhennyj cikl while, kotoryj obraba- tyvaet podmenyu. Prichina, po kotoroj my ispol'zovali cikly tipa "vechnyj while" zaklyuchaetsya v tom, chto oni vypolnyayutsya, poka ne poluchat nuzhnoe vhodnoe znachenie. Kak tol'ko polucheny pravil'nye vhodnye dannye, my vy- hodim iz cikla. |to ochen' prostoj sposob obrabotki menyu. V strokah 36-45 my snova ispol'zuem operator echo dlya vydachi na ekran polnogo podmenyu. |to menyu zaprashivaet imya ustrojstva, kotoroe ispol'zuetsya v komandah kopirovaniya/vosstanovleniya. Stroka 47 chitaet vhodnye dannye ot pol'zovatelya v peremennuyu MEDIA. Znachenie peremennoj MEDIA zatem ocenivaetsya v operatore case. Obratite vnimanie, chto shablony sravneniya vklyuchayut simvoly i v verhnem, i v nizhnem registre. |to oblegchaet zhizn' pol'zovatelya i delaet nemnogo bolee logichnym programmirovanie, umen'shaya chislo proverok na oshibki, ko- toroe my dolzhny proizvesti. Takzhe zamet'te, chto kazhdyj obrazec zakanchi- vaetsya operatorom break. Kogda obnaruzheno dopustimoe vhodnoe znachenie, my zhelaem prodolzhat' vypolnenie posle konca operatora while, chto osu- shchestvlyaetsya operatorom break. Peremennaya DEV teper' ustanovlena kak marshrut k vybrannomu ustrojstvu. Klyuch "a" v strokah 55-60 trebuet dal'nejshej obrabotki. Pol'zova- tel' zaprashivaetsya ob imeni ustrojstva, kotoroe on vybral. Esli pol'zo- vatel' zabyl imya ili reshil ne ispol'zovat' etot klyuch, on mozhet vvesti vozvrat karetki, kotoryj raspoznaetsya kak nul' i privodit k vypolneniyu operatora continue. |to vyzyvaet vypolnenie sleduyushchej iteracii tekushchego cikla, kotoraya snova vyvodit podmenyu. Eshche odin vozvrat karetki posle etogo mozhet ispol'zovat'sya dlya vyhoda iz podmenyu i vozvrata v glavnoe menyu. V protivnom sluchae, esli pol'zovatel' vvel nenulevoe znachenie, vypolnyaetsya operator break, i cikl menyu zavershaetsya, imeya marshrut, uka- zannyj v peremennoj DEV. Esli pol'zovatel' vvel nevernoe znachenie, pechataetsya soobshchenie ob oshibke i podmenyu vyvoditsya snova. Zamet'te, chto vvod tol'ko vozvrata karetki v podmenyu ustanavlivaet peremennuyu ABORT v "on". Pochemu eto tak? Teper' my podoshli k toj chasti, gde yazyk komandnogo processora nep- rimenim dlya nashego sluchaya. Scenarij vyglyadit primerno tak. My nahodimsya v podmenyu. My reshaem, chto ne budem zdes' proizvodit' vybor, poetomu my hotim vyjti iz podmenyu i vernut'sya v glavnoe menyu (ili v predydushchee me- nyu). Esli my vyjdem iz cikla while podmenyu, my popadem vo vneshnij cikl while i prodolzhim obrabotku zaprosami o kataloge-istochnike i katalo- ge-priemnike. Esli my popytaemsya reshit' etu problemu putem ispol'zovaniya opera- tora "break 2", my vyjdem iz oboih ciklov while (popadaya v samyj niz programmy) i programma zavershitsya, nichego ne sdelav dlya nas. Snova ne to, chto my hotim. CHto my dejstvitel'no hotim, tak eto vyjti iz tekushchego (vnutrennego) cikla i prodolzhit' sleduyushchuyu iteraciyu vo vneshnem cikle dlya polucheniya glavnogo menyu. Net nikakoj vozmozhnosti skazat' komandnomu processoru ob etom, poetomu my sozdali peremennuyu v kachestve flaga dlya imitacii etogo dejstviya i nazvali ee ABORT. Esli my ustanavlivaem pere- mennuyu ABORT v sostoyanie "da", to my NE zhelaem prodolzhat' rabotu s ko- mandoj glavnogo menyu, a hotim prekratit' ee i vernut'sya v glavnoe menyu. Na samom dele eto oznachaet prodolzhit', poetomu v strokah 67-69 proverya- etsya imenno eto. Esli flag ABORT ustanovlen, podmenyu prinuditel'no za- vershaetsya i operator continue zastavlyaet snova pechatat' glavnoe menyu vmesto togo, chtoby pytat'sya vypolnit' kakuyu-to napolovinu opredelennuyu operaciyu kopirovaniya. V stroke 71 my poluchaem dlya proverki komandu glavnogo menyu i in- formaciyu, neobhodimuyu dlya ee obrabotki. CHetyr'mya osnovnymi komandami yavlyayutsya kopirovanie, vosstanovlenie, vydacha spiska fajlov i vydacha spiska fajlov s polnoj informaciej. Esli vvedena kakaya-to drugaya koman- da, vydaetsya soobshchenie ob oshibke i glavnoe menyu snova vyvoditsya na ek- ran. Edinstvennyj sposob vyhoda iz glavnogo menyu - eto nazhat' vozvrat karetki bez kakogo libo-teksta pered nim i stroka 28 pozvolit vyjti iz cikla. Komandy kopirovaniya i vosstanovleniya ispol'zuyut otnositel'noe ime- novanie. Snachala oni trebuyut ukazat' katalog, zatem perehodyat v etot katalog. Operator echo i "holostoe" chtenie peremennoj CMD prosyat pol'- zovatelya vstavit' disketu (ili smontirovat' magnitnuyu lentu ili eshche chto-nibud') i nazhat' vozvrat karetki, kogda vse gotovo. V sluchae kopirovaniya dlya poiska VSEH fajlov, razmeshchennyh v dereve fajlov, nachinaya s tekushchego kataloga, ispol'zuetsya komanda find. Opera- tor find vydaet otsortirovannyj spisok fajlov, poetomu fajly na nosite- le s kopiej otsortirovany. Zatem otsortirovannyj spisok fajlov pereda- etsya po kanalu komande cpio s opciyami -ocBv. |to oznachaet: "potokovyj vyvod, ispol'zovat' simvol'nye zagolovki, bloki razmerom po 5K, s vyda- chej soobshchenij". Pri etom pechatayutsya imena fajlov po mere togo, kak oni kopiruyutsya na nositel'. V sluchae operacii vosstanovleniya ispol'zuyutsya klyuchi -icBvdmu. |to znachit "potokovyj vvod, ispol'zovat' simvol'nye zagolovki, bloki po 5K, s vydachej soobshchenij dlya pechati imen fajlov po mere ih vosstanovleniya, sozdavat' katalogi pri neobhodimosti, fajly sohranyayut ishodnuyu datu mo- difikacii, i vse fajly bezuslovno kopiruyutsya". Esli dolzhen byt' vydan tol'ko spisok fajlov, to klyuchami budut ili -icBt dlya pechati tablicy skopirovannyh fajlov (eto sootvetstvuet zapisi komandy cpio "ls"), ili -icBtv dlya pechati tablicy fajlov s bolee pod- robnoj informaciej ("ls -l" v zapisi dlya cpio). V konce vypolneniya kazhdoj komandy glavnogo menyu vydaetsya soobshchenie hit (Nazhmite ) |to sdelano po toj prichine, chto kogda pechataetsya glavnoe menyu, ono ochishchaet ekran. Esli by vy hoteli poluchit' spisok fajlov, kak opisano vyshe, i ne zavershit' rabotu, to napechatalsya by spisok, vypolnenie dostiglo by vneshnego operatora "done", vneshnij cikl snova startoval by i ekran ochistilsya by pered novoj vydachej na nego glavnogo menyu. Uf, na- konec poyavilsya spisok, dazhe do togo kak |velin Vud s vysshim obrazovani- em smogla prochitat' eto! Dlya togo, chtoby zaderzhat' ochistku ekrana, my ozhidaem nazhatie na klavishu. CHto by ni bylo vvedeno, ono chitaetsya v pe- remennuyu i snova nikogda ne ispol'zuetsya. |to prosto holostaya peremen- naya. Zamechaniya po operacii kopirovaniya Vy mozhete proizvodit' kopirovanie fajlov mnogimi putyami, no davaj- te rassmotrim nekotorye otlichiya mezhdu komandami cpio i tar. Pervona- chal'no komandoj kopirovaniya v UNIX byla komanda tar. |ta utilita sozda- niya kopii na magnitnoj lente byla prednaznachena dlya vedeniya arhivov na magnitnoj lente i vypolneniya samogo kopirovaniya. Ona rabotaet, no imeet nekotorye osobennosti. Vo-pervyh, kazhdyj fajl, pomeshchaemyj na lentu (ili kakoj-libo nositel', kotoryj vy ispol'zuete), vyravnivaetsya na granicu kilobajta. |to oznachaet, chto esli vash fajl sostoit iz odnogo bajta, ko- manda tar vydelyaet minimum 1K vashemu fajlu, chto mozhet privesti k znachi- tel'noj rastrate prostranstva, esli u vas mnogo nebol'shih fajlov i vy kopiruete ih na magnitnuyu lentu. Odnako komanda tar imeet takzhe ryad neplohih aspektov. Naprimer, vy mozhete skazat' ej, kakoj mnozhitel' blokirovki vy ispol'zuete i naskol'ko velik obraz kopii, tak chto vy mozhete razbit' bol'shie kopiruemye potoki dannyh na mnogo melkih chastej (naprimer k=360 dlya gibkih diskov nizkoj plotnosti v sisteme XENIX). Odnim iz strannyh aspektov komandy tar yavlyaetsya to, chto kopiya yavlyaetsya odnim dlinnym i nepreryvnym potokom, a pri vosstanovlenii ispol'zuetsya unikal'nyj for- mat dlya kazhdogo nositelya. Naprimer, vy dolzhny, skazhem, skopirovat' 10M dannyh. Vam luchshe imet' dostatochno otformatirovannyh gibkih diskov i prigotovit' ih do togo, kak vy nachnete kopirovat' komandoj tar. Kogda disketa zapolnitsya, vy dolzhny prervat' vypolnenie komandy i zatem snova prodolzhit'. Primer takoj komandy mog by vyglyadet' tak: cd $HOME tar cvefbk /dev/fd048ds9 18 360 . Zdes' ukazano, chto trebuetsya skopirovat' VSE fajly (rekursivno ob- hodya derevo sverhu vniz) iz tekushchego kataloga (.) v fajl na ukazannom ustrojstve, so mnozhitelem blokirovki 18 K i razmerom obraza kopii 360 Kbajt. Odnim iz interesnyh aspektov zdes' yavlyaetsya to, chto kogda koman- da tar rekursivno prohodit vniz po derevu, ona poluchaet imena fajlov v poryadke raspolozheniya opisatel' fajla, chto obychno NE sovpadaet s otsor- tirovannym poryadkom. Vy NE MOZHETE poluchit' otsortirovannyj spisok faj- lov dlya kopirovaniya komandoj tar, esli tol'ko ne sdelaete eshche odnu toch- nuyu kopiyu vseh dannyh, kotorye vy hotite skopirovat' i ne razmestite opisatel' fajla v otsortirovannom poryadke. Kak eto sdelat'? Vot tak: cd $HOME find . -print | sort | cpio -pdv /bkpsort Pri etom poluchitsya novaya kopiya vseh vashih dannyh i imena fajlov razmestyatsya v otsortirovannom poryadke. Esli posle etogo vy perejdete v katalog /bkpsort i vypolnite komandu tar, fajly budut pereneseny na nositel' v otsortirovannom poryadke. Predpolozhim, chto dlya vypolneniya kopirovaniya trebuetsya 15 disket. Pri vosstanovlenii etogo polnogo nabora vy dolzhny vvodit' privedennuyu nizhe komandu 15 raz, poskol'ku na kazhdom iz gibkih diskov raspolagaetsya unikal'nyj obraz kopii. tar xvf /dev/fd048ds9 Takie povtornye vvody komandy razdrazhayut, no oni mogut oblegchit' zhizn', chto my vskore i uvidim. Komanda cpio yavlyaetsya sleduyushchim pokoleniem komand kopirovaniya. Ee obshchie funkcii podobny funkciyam komandy tar, no imeetsya neskol'ko vazhnyh otlichij. Vo-pervyh, vy dolzhny sgenerirovat' spisok fajlov dlya cpio, chto oznachaet ispol'zovanie komandy find dlya porozhdeniya spiska. Poskol'ku my mozhem konvejerom propustit' spisok, poluchennyj ot komandy find, cherez komandu sort, nam net neobhodimosti delat' eshche odnu kopiyu vseh nashih fajlov dlya polucheniya otsortirovannogo spiska. Dalee, komanda cpio ne vypolnyaet vyravnivanie granicu kilobajta. Ona pakuet vse dannye nepreryvno i imeet magicheskoe chislo v zagolovke dlya ukazaniya nachala kazhdogo novogo fajla. V komande cpio takzhe net uka- zaniya razmera obraza na nositele. Kak ona eto uznaet? Drajver ust- rojstva dolzhen opredelit' razmer i poslat' sootvetstvuyushchij signal ob- ratno komande cpio, kotoraya posle etogo priostanavlivaetsya i predlagaet vstavit' sleduyushchuyu disketu. |to vse prekrasno do teh por, poka vy ne popadaete v sistemu, v kotoroj drajvery uzhasny, kak v sisteme XENIX. Drajvery XENIX ne raspoznayut, kogda nuzhno ostanovit'sya i prodolzhayut vy- polnyat' rabotu i posle togo, kak dostignut konec gibkogo diska. Prog- ramma cpio dolzhna byla by vypolnyat'sya odinakovo na vseh sistemah, no ona ne rabotaet korrektno na mashinah s sistemoj XENIX. Odno sushchestvennoe razlichie mezhdu komandami cpio i tar zaklyuchaetsya v poluchayushchemsya obraze kopii. Poskol'ku cpio ne razlichaet granic mezhdu razlichnymi nositelyami (disketami), fajly poluchayutsya razorvannymi mezhdu dvumya gibkimi diskami. |to znachit, chto kogda vy pytaetes' kopirovat' s etih 15 disket, to oni yavlyayutsya ODNIM nepreryvnym potokom vhodnyh dan- nyh, tochno tak, kak i posledovatel'nyj potok vyhodnyh dannyh pri sozda- nii etoj kopii. CHto proizojdet, esli disketa nomer 2 povreditsya? VSE vashi fajly posle vtoroj diskety stali bespolezny. Vy prosto poteryali ves' vash obraz kopii. Poskol'ku tar kopiruet v vide otdel'nyh obrazov, kogda disketa nomer 2 poteryaetsya, vy vse ravno mozhete kopirovat' s disket 3-15 bez problem. Eshche odin prekrasnyj aspekt komandy cpio zaklyuchaetsya v tom, chto ona mozhet rabotat' kak v formate fajlovoj sistemy, tak i v potokovom forma- te. Format fajlovoj sistemy (opciya -p) obrashchaetsya k blochnym ust- rojstvam, takim kak zhestkij disk, a potokovyj format obrashchaetsya k nest- rukturirovannym ustrojstvam (opcii -i i -o), takim kak magnitnaya lenta ili gibkij disk s formatom nizkogo urovnya. Cpio - eto prekrasnaya utili- ta dlya ispol'zovaniya ee pri kopirovanii fajlovyh derev'ev sistemy na zhestkom diske. Kak zhe upravlyaetsya s etim sistema 4.2 BSD? V techenie mnogih let primenyalas' komanda tar dlya peresylki tuda i obratno, kak opisano na stranicah rukovodstva po tar(1). Ne samyj elegantnyj podhod, no rabo- tosposobnyj. Sejchas oni imeyut klyuch -r (dlya rekursivnogo obhoda dereva sverhu vniz) dlya obychnoj komandy cp. YA zhe po-prezhnemu schitayu, chto ko- manda cpio luchshe. 3.4. Sredstva proverki operacij kopirovaniya 3.4.1. dsum - kontrol'nye summy dvuh katologov ------------------------------------------------------------- Imya: dsum _____________________________________________________________ dsum Kontrol'naya summa dvuh katalogov

    NAZNACHENIE

Vydaet na ekran vyhodnye dannye komandy sum sistemy UNIX dlya dvuh kopij fajlov iz dvuh raznyh katalogov v odnoj stroke. |to pozvolyaet bystro vizual'no ocenit', odinakovo li soderzhanie fajlov i mozhet byt' ispol'zovano dlya proverki kopii.

    FORMAT VYZOVA

dsum [-c|-o] control_dir backup_dir Primer vyzova dsum $HOME/bin /mnt Prosmatrivaet, byli li kakie-libo fajly izmeneny pri kopirovanii iz moego registracionnogo kataloga na gibkij disk, smontirovannyj v ka- taloge /mnt. Komandnyj fajl dsum 1 : 2 # @(#) dsum v1.0 Dual directory sum Author: Russ Sage 4 if [ $# -lt 2 -o $# -gt 3 ] 5 then echo "dsum: invalid argument count" >&2 6 echo "usage: dsum [-c|-o] control_dir backup_dir" >&2 7 echo " -c = C source files, -o = object files" >&2 8 exit 1 9 fi 11 case $# in 12 2) FLIST=*;; 13 3) case $1 in 14 -c) FLIST=*.c;; 15 -o) FLIST=*.o;; 16 *) echo "dsum: invalid argument $1" >&2 17 echo "usage: dsum [-c|-o] control_dir bacup_dir" >&2 18 exit 1;; 19 esac 20 shift;; 21 esac 23 for FILE in $1/$FLIST 24 do 25 BASEF=`basename $FILE` 26 if [ `expr $BASEF : '.*'` -lt 7 ] 27 then echo "`$BASEF: \t'`sum $FILE | cut -d' ' -f1`\t\c" 28 else echo "$BASEF:\t`sum $FILE | cut -d' ' -f1`\t\c" 29 fi 30 sum $2/$BASEF | cut -d' ' -f1 31 done Peremennye sredy vypolneniya BASEF Soderzhit bazovoe imya fajla iz polnogo marshrutnogo imeni FILE Soderzhit imya kazhdogo proveryaemogo fajla FLIST Soderzhit ukazanie na tip proveryaemyh fajlov Opisanie Zachem nam nuzhen dsum? V srede razrabotki programm vsegda imeetsya massa fajlov. |ti fajly soderzhat vse: ishodnyj kod, peremeshchaemye moduli, ob容ktnyj kod, dannye, teksty. Drugim aspektom sredy razrabotki programm yavlyaetsya to, chto eti fajly obychno rassypany po mnogim razlichnym mashinam (ili gruppam mashin, mozhet byt' i takoj sluchaj). V etom sluchae vsegda kazhetsya, chto imeetsya ochen' mnogo peremeshchenij fajlov: eti fajly peredayutsya iz odnoj sistemy na druguyu, nekotorye modificiruyutsya, peresylayutsya obratno i tak dalee. Pohozhe na to, kak v armii royut yamy: vy delaete eto, potomu chto vam pri- kazano. Kogda vy peremeshchaete mnogo fajlov, to kakoj put' yavlyaetsya luchshim dlya togo, chtoby garantirovat' sebe (ili komu-libo eshche), chto vypolnennaya vami kopiya yavlyaetsya TOCHNO takoj, kak i original? Esli vy vnesli oshibku v pervonachal'nuyu kopiyu, zatem rasprostranili etu oshibku na mnogie kopii ili dazhe zapisali vmesto originala modificirovannuyu kopiyu, to vy mozhete nikogda ne vernut'sya v pervonachal'noe sostoyanie. Odnim iz sposobov slezheniya za kopiyami yavlyaetsya ispol'zovanie ko- mandy sum. |ta komanda chitaet dannye i vyvodit chislo, yavlyayushcheesya razno- vidnost'yu kontrol'noj summy. Drugimi utilitami UNIX, kotorye delayut chto-to podobnoe, yavlyayutsya cmp dlya sravneniya ob容ktnyh fajlov i diff dlya obnaruzheniya razlichij v tekstovyh fajlah. Avtor privyk dumat', chto sum budet soobshchat' ob otlichii dazhe v od- nom bite (svoego roda ciklicheskaya izbytochnaya proverka), no eto okaza- los' sovsem ne tak. Nedavno imelsya 35 Kbajtnyj fajl, soderzhashchij v vide dlinnogo formata spisok fajlov, kotorye dolzhny byli byt' skopirovany. V dejstvitel'nosti, tam byli dva fajla, odin iz kotoryh byl otsortirovan, a drugoj net. Oni byli odnogo razmera, i sum vydala odno i to zhe chislo dlya oboih fajlov. Kogda zhe cmp sravnila eti dva fajla, okazalos', chto 39-e bajty otlichayutsya. Kak my mozhem ob座asnit' tot fakt, chto sum rassmatrivala eti dva fajla kak sovershenno odinakovye? Vozmozhno, sum svernula eti dva fajla takim obrazom, chto kontrol'naya summa okazalas' odinakova, dazhe hotya odin iz fajlov byl otsortirovan, a drugoj net. |to znachit, chto sum na samom dele ne vypolnyaet kontrol'nuyu prover- ku kazhdogo bita. Tol'ko proverka algoritma raboty programmy v ishodnom module pozvolit ubedit'sya v etom. Konechno, v bol'shinstve sluchaev, esli fajl otlichaetsya ot originala, to eto ne yavlyaetsya prostoj perestanovkoj dannyh, tak chto sum vse-taki polezna. CHto delaet dsum? Dsum - eto utilita, kotoraya vypolnyaet proverku posle kopirovaniya. Ona predpolagaet, chto fajly skopirovany iz kataloga-istochnika v kata- log-priemnik. Katalog-istochnik nazvan upravlyayushchim katalogom, poskol'ku on sledit za tem, kakie fajly sravnivayutsya. Dlya kazhdogo fajla v uprav- lyayushchem kataloge pechataetsya ego imya vmeste so znacheniem ego kontrol'noj summy i so znacheniem kontrol'noj summy dlya skopirovannogo fajla v kata- loge-priemnike. Vsya eta informaciya vydaetsya v odnoj stroke. Pol'za ot polucheniya vsej informacii ot dsum v odnoj stroke zaklyu- chaetsya v tom, chto vizual'no dva fajla mogut byt' provereny ochen' legko. Vam net neobhodimosti smotret' v drugoe mesto dlya polucheniya neobhodimoj informacii. Al'ternativoj dlya dsum mozhet byt' vypolnenie kakogo-libo scenariya, podobnogo privodimomu nizhe. 1. Skopirujte vashi fajly v drugoj katalog. 2. Podschitajte kontrol'nuyu summu vseh fajlov iz upravlyayushchego kataloga i vyvedite rezul'tat v kakoj-libo fajl. 3. Podschitajte kontrol'nuyu summu vseh fajlov v kataloge, soderzhashchem kopiyu, i vyvedite rezul'tat v kakoj-libo fajl. 4. Sravnite eti dva fajla komandoj diff dlya togo, chtoby uvidet', ne otlichayutsya li kakie-libo kopii. |to ne daet vam dazhe horoshego vyvoda na ekran o tom, chto proisho- ditgi|to ne daet vam dazhe horoshego vyvoda na ekran o tom, chto proisho- Dsum ne prohodit vniz po derevu fajlov, potomu chto bol'shinstvo ko- pij yavlyayutsya kopiyami iz kataloga v katalog, a ne iz segmenta dereva v segment dereva. Iz-za togo, chto ona ne vypolnyaet takoj obhod, slozhnost' programmy sushchestvenno ponizhaetsya. Po umolchaniyu sravnivayutsya VSE fajly. |to predpolagaet, chto vy sko- pirovali vse fajly v katalog kopirovaniya. V nekotoryh sluchayah vy mozhete zahotet' kopirovat' tol'ko vybrannye fajly, takie kak *.c (vse vashi ishodnye fajly). V etom sluchae upravlyayushchij katalog soderzhit mnozhestvo fajlov, a katalog s kopiyami soderzhit tol'ko fajly s rasshireniem .c. Dlya podderzhki takih sluchaev v programmu vklyucheny klyuchi -c i -o. Klyuch -c ukazyvaet tol'ko fajly tipa *.c iz upravlyayushchego kataloga. V re- zul'tate proizvoditsya proverka tol'ko fajlov *.c v kataloge s kopiej. Klyuch -o vypolnyaet to zhe samoe dlya fajlov, sootvetstvuyushchih *.o. Primery 1. $ mount /dev/fd0 /mnt $ cp /usr/include/* /mnt $ dsum /usr/include /mnt Montiruet gibkij disk v katalog /mnt. Kopiruet vse fajly zagolov- kov v kataloge /usr/include na gibkij disk. Proveryaet kopii, ispol'zuya dsum dlya ishodnogo kataloga i dlya kataloga s kopiej. Primechanie: Ukazyvaya kopirovat' *, my voobshche ne popadem v katalog /usr/include/sys. 2. $ dsum . .. Ispol'zuya v kachestve upravlyayushchih fajlov fajly v tekushchem kataloge, sverit' kazhdyj fajl s odnoimennym fajlom v roditel'skom kataloge. Poyasneniya V strokah 4-9 proizvoditsya proverka na nalichie oshibok. Esli ukaza- no menee dvuh argumentov, znachit upravlyayushchij katalog i/ili katalog ko- pii ne ukazan i v rezul'tate obnaruzhivaetsya oshibka. Esli kolichestvo ar- gumentov prevyshaet tri, znachit, ukazano eshche chto-to krome klyucha -c i dvuh katalogov, chto takzhe yavlyaetsya oshibkoj. Vse ostal'noe (dva ili tri argumenta) rassmatrivaetsya kak dopustimoe znachenie. V strokah 11-21 proizvoditsya inicializaciya peremennoj FLIST. FLIST - eto upravlyayushchaya peremennaya, kotoraya opredelyaet imena fajlov, na koto- rye nado obratit' vnimanie. Esli v komandnoj stroke ukazany tol'ko ime- na katalogov ($# = 2), FLIST prisvaivaetsya znachenie po umolchaniyu * (vse fajly) v stroke 12. Znachenie * prisvaivaetsya peremenoj FLIST i ne trak- tuetsya v eto vremya kak metasimvol (eto osobennost' komandnogo processo- ra). Esli v komandnoj stroke ukazan klyuch ($# = 3), proizvoditsya prover- ka pervoj peremennoj i FLIST poluchaet sootvetstvuyushchee znachenie, *.c ili *.o. Esli ukazana ne takaya opciya, vyvoditsya soobshchenie ob oshibke i prog- ramma zavershaetsya. V strokah 23-31 vypolnyaetsya sama rabota. Zdes' vypolnyaetsya cikl for, kotoryj prohodit po spisku slov, sozdannomu upravlyayushchim katalogom v sootvetstvii so znacheniem peremennoj FLIST. V stroke 23 peremennaya FLIST rasshiryaetsya fakticheski s simvola * v imya kazhdogo fajla. Tem samym cikl for poluchaet dannye dlya ispol'zovaniya. Sledovatel'no, peremennaya FLIST yavlyaetsya polnym marshrutnym imenem kazhdogo fajla v upravlyayushchem ka- taloge. Stroka 25 razbiraet rasshirenie, sdelannoe v stroke 19. Peremennaya BASEF poluchaet bazovoe imya polnogo marshruta iz peremennoj FILE. Prichi- noj, po kotoroj my eto delaem, yavlyaetsya tot fakt, chto pozzhe pri ssylke na katalog kopii nam neobhodimo tol'ko imya fajla. (V sisteme UNIX ko- manda basename vozvrashchaet poslednij element v ukazannom marshrute, t.e. samo imya fajla, esli marshrut soderzhit promezhutochnye katalogi.) Stroki 26-29 vyvodyat pervuyu chast' vyhodnogo soobshcheniya. Operator if-then ispol'zovan potomu, chto nam nuzhno menyat' vyhodnoe soobshchenie v zavisimosti ot togo, skol'ko simvolov soderzhit imya fajla. Stroka 26 op- redelyaet dlinu imeni fajla, ispol'zuya komandu expr. Komanda expr mozhet byt' ispol'zovana dlya sravneniya dvuh strok i poluchaet kolichestvo sov- pavshih simvolov. Sravnenie imeni fajla so "vsemi simvolami" (*), takim obrazom vozvrashchaet dlinu stroki. (U vas mozhet vozniknut' zhelanie obra- tit'sya k expr(1), chtoby poluchit' informaciyu o drugih hitrostyah etoj mnogocelevoj komandy.) |to vozvrashchaemoe znachenie ispol'zuetsya v operatore test dlya opre- deleniya, soderzhit li imya fajla menee semi simvolov: vozmozhno vsego odin ili dva simvola. V poslednem sluchae, esli my delaem tabulyaciyu, my polu- chim tol'ko pervuyu poziciyu tabulyacii. Dlya polucheniya posleduyushchih tabulya- cij my otobrazhaem sem' simvolov dlya togo, chtoby popast' na mesto sledu- yushchego polya tabulyacii. (Esli bylo 3-6 simvolov, my vse ravno ostanovimsya na pole vtoroj tabulyacii, t.e. eto mesto rabotaet verno.) Zatem otobra- zhaem tabulyaciyu dlya togo, chtoby my popali na mesto okonchaniya vtoroj ta- bulyacii, chto nam i trebovalos'. Esli imya fajla soderzhit bolee semi simvolov, my uzhe nahodimsya v pervoj pozicii tabulyacii ili za nej. Takim obrazom, sleduyushchij simvol tabulyacii peredvinet nas vo vtoruyu poziciyu tabulyacii. |ffekt zaklyucha- etsya v tom, chto dlya razmeshcheniya kolonok ne imeet znacheniya razmer imeni fajla (krome sluchaya, kogda ono dejstvitel'no ochen' dlinnoe). |to pozvo- lyaet izbavit'sya ot "blyuza polzushchih kolonok", kogda kolonki sdvigayutsya v zavisimosti ot razmera otobrazhaemoj informacii. V kachestve primera ta- kogo effekta mozhet sluzhit' standartnaya komanda sum. Ee vyhod vyglyadit tak: -------------------------------- | 4243 3 autobkp | 247 1 can | 25167 6 cpiobr | 186 3 dosflp | 56864 2 dsum | 2782 1 log | S drugoj storony, vyhod dsum ochen' yasnyj i chetkij, ne sdvigaetsya po vsemu ekranu. Sdvig delaet vyvod izlomannym i zatrudnyaet bystryj prosmotr informacii. CHudo vyvoda v odnu stroku sovershaetsya v stroke 27 (dlya fajlov s imenami menee 7 simvolov) ili v stroke 28 (dlya fajlov s bolee dlinnymi imenami). Vnutri komandy echo v kazhdom sluchae my pryachem drugie komandy, no po-prezhnemu upravlyaem tem, kak ih rezul'taty vyvodyatsya na ekran. Vo-pervyh, sami imena fajlov vyvodyatsya, buduchi ranee izvlechennymi iz polnogo marshrutnogo imeni. Obratite vnimanie, chto imena fajlov ne so- derzhat informaciyu o tom, iz kakogo oni kataloga. Zatem my neskol'ko sdvigaemsya i pechataem pervoe pole vyhodnoj summy dlya etogo fajla (samu kontrol'nuyu summu). |to kontrol'naya summa versii fajla v upravlyayushchem kataloge, poskol'ku peremennaya FILE byla sgenerirovana dlya etogo kata- loga. Komanda sum vyvodit tri znacheniya (kontrol'naya summa, chislo blo- kov, zanyatyh fajlom, i samo imya fajla). Nam nuzhno poluchit' tol'ko per- voe znachenie, kotoroe izvlekaetsya putem vypolneniya komandy sum i pere- dachi ee vyhoda po kanalu komande cut, kotoraya i vozvrashchaet pervoe pole. Posle togo, kak znachenie kontrol'noj summy napechatano, my otobrazhaem \c dlya zapreshcheniya perehoda na novuyu stroku. |to sohranyaet kursor v toj zhe stroke. Zdes' nachinaet rabotat' stroka 30. Ona generiruet kontrol'nuyu sum- mu togo zhe fajla v kataloge kopii ($2 v komandnoj stroke) i tekushchee imya fajla, vyrezaya tol'ko chislo, i pechataet ego pravee kursora v toj zhe stroke. Cikl zavershaetsya, kogda vse fajly iz upravlyayushchego kataloga budut provereny komandoj sum.

    VOZMOZHNYE MODIFIKACII KOMANDNOGO FAJLA

Neplohoj modifikaciej mozhet byt' variant, chtoby dsum pechatala ne tol'ko znacheniya, kak eto sdelano, no i flag v konce stroki v sluchae, kogda dva fajla otlichayutsya. Togda u nas ne bylo by neobhodimosti prosmatrivat' neposredstvenno chisla. My ishchem flag i srazu vidim, kogda chto-to ne tak. Nizhe privoditsya reshenie problemy vyvoda flaga dlya togo, chtoby ob- legchit' vam rabotu. Ono ne vklyucheno v predstavlennuyu vyshe utilitu po toj prichine, chto takogo roda veshchi mogut byt' vypolneny otnositel'no prosto. Vy mozhete sami sdelat' etu modifikaciyu v kachestve uprazhneniya. Tekst programmy, vypolnyayushchej etu rabotu, vyglyadit tak: for FILE in $1/$FLIST do BASEF=`basename $FILE` S1=`sum $FILE 2>&1 | cut -d' ' -f1` S2=`sum $2/$BASEF 2>&1 | cut -d' ' -f1` if [ "$S1" = "$S2" ] then M="" else M="<---" fi if [ ` expr $BASEF : '.*'` -lt 7 ] then echo "$BASEF: \t$S1\t$S2 $M" else echo "$BASEF:\t$S1\t$S2 $M" fi done Podhod k resheniyu nemnogo otlichaetsya ot resheniya, prinyatogo pri na- pisanii dsum, poskol'ku vy ne mozhete generirovat' kontrol'nuyu summu na hodu. Vy dolzhny perehvatit' vyhod komandy sum i ispol'zovat' ego pozzhe. To, chto my ishchem, poyavlyaetsya v shestoj stroke. Esli dve kontrol'nye summy razlichny, peremennaya M ustanavlivaetsya sootvetstvuyushchim obrazom. Esli fajly razlichayutsya, peremennaya M poluchaet strelku, ukazyvayushchuyu na to, chto kopiya plohaya. 3.4.2. log - menyu dostupa k fajlam protokola kopirovaniya -------------------------------------------------------------------------- Imya : log _________________________________________________________________________ log Menyu dostupa k fajlam protokola kopirovaniya

    NAZNACHENIE

Obespechivaet interfejs v vide menyu k fajlam protokola, poluchennym ot utility autobkp.

    FORMAT VYZOVA

log Primer vyzova log Komandnyj fajl log 1 : 2 # @(#) log v1.0 Menu access to backup logfiles Author: Russ Sage 4 c 5 set `date` 6 echo " 8 $1, $2 $3 $4 10 Logfile Menu 11 ---------------- 12 1 - list all log file names 13 2 - display log of home backup 14 3 - display log of product backup 15 to exit 17 Enter command (1-3,<>): \c" 18 read CMD 20 case $CMD in 21 "") exit;; 22 1) echo "\nLogfile names:" 23 sed -n -e "/more/s/^.*more \(.*\);;$/\1/p" $HOME/bin/log;; 24 2) more $HOME/bin/autobkplog.home;; 25 3) more$HOME/bin/auto2.bkplogm;; 26 *) echo "log: $CMD is not a command";; 27 esac Peremennye sredy vypolneniya CMD Komanda, poluchennaya ot pol'zovatelya HOME Vash registracionnyj katalog v sisteme Opisanie Zachem nam nuzhen log? Esli vy chitali etu glavu, nichego ne propuskaya, vy uzhe vstrechalis' s programmoj autobkp. Vyvodnye dannye autobkp ochen' informativny i dolzhny byt' sohraneny kak chast' operacii kopirovaniya. |to eshche bolee vazhno, esli u vas imeyutsya programmy, zapuskaemye s pomoshch'yu cron. So vremenem nekotorye iz etih programm mozhet nachat' rabotat' neverno i razrushit' vse vami sdelannye kopii. Edinstvennyj sposob prosledit' za takimi veshchami - eto ispol'zovat' fajly protokola. Fajly protokola ko- mandy cron soderzhat nekotoruyu informaciyu, no fajly protokola programmy autobkp soderzhat ee gorazdo bol'she. Problema voznikaet, kogda vy stalkivaetes' s nalichiem neskol'kih rabot dlya autobkp. Vy mozhete ne zahotet' smeshivat' nevzaimosvyazannye kopii fajlov v odnom i tom zhe fajle so spiskom marshrutov, poetomu vy sozdaete neskol'ko fajlov pathlist, neskol'ko zadanij dlya cron i neskol'ko fajlov protokola. Esli vam nuzhno vypolnit' pyat' ili desyat' podobnyh rabot, kakim obrazom vy prosledite za vsemi fajlami protoko- lov, zapomnite ih imena i oblegchite ih prosmotr? Vse eti problemy reshe- ny v komandnom fajle log. CHto delaet log? Komandnyj fajl log - eto upravlyaemaya pri pomoshchi menyu utilita. Menyu pozvolyaet vam videt' tekushchie imena fajlov v fajlah protokola, poetomu vam net neobhodimosti pomnit' ih. Ostal'nye komandy yavlyayutsya vhodnymi tochkami v fajly protokola, ispol'zuyushchimi komandu more dlya prosmotra. Kogda my rassmatrivali komandnyj fajl cpiobr, my videli, kak rabo- taet upravlyaemaya pri pomoshchi menyu programma. Komandnyj fajl log neskol'- ko proshche v tom smysle, chto on delaet tol'ko odin prohod. Krome togo, log - eto "zhivaya" programma. Ona ne yavlyaetsya statichnoj i dolzhna posto- yanno izmenyat'sya v sootvetstvii s vashimi procedurami kopirovaniya. Posredstvom takoj modifikacii log sposobna soobshchit' vam dejstvitel'nye imena fajlov. Log yavlyaetsya raznovidnost'yu programmy, ssylayushchejsya sama na sebya. Dlya pokaza dejstvitel'nyh imen fajlov ona prosmatrivaet svoe soderzhimoe i vybiraet (ispol'zuya sed) imena log-fajlov iz komandy more, kotoraya vyvodit ih. Poskol'ku vy dobavlyaete fajly protokola, programma log mo- zhet hranit' tekushchie, potomu chto ona prosmatrivaet sama sebya dlya oprede- leniya togo, chto sootvetstvuet dejstvitel'nosti. Primenyaya proceduru po- iska takim obrazom, my izbavlyaemsya ot neobhodimosti sohranyat' otdel'nye fajly dannyh s imenami v nih ili ispol'zovat' kakie-to soglasheniya ob imenovanii vypolneniya toj zhe zadachi. Sposobnost' programmy log obra- shchat'sya samoj k sebe pozvolyaet vam dobavlyat' neogranichennoe chislo fajlov protokola v spisok, i vam predostavlyaetsya svoboda po vyboru imen takih fajlov. Vozmozhno, vy zametili, chto strategiya, ispol'zovannaya v komandnom fajle log, mozhet byt' ispol'zovana dlya obespecheniya vyvoda na ekran lyu- bogo nabora fajlov (zapisnye knizhki, dokumentaciya ili eshche chto-to). Vse, chto vam nuzhno sdelat' dlya etogo - zapisat' ih v sootvetstvii s komandoj more i dobavit' stol'ko komand v glavnoe menyu, skol'ko vy hotite. Poyasneniya Stroka 4 ochishchaet ekran, ispol'zuya komandu c, predstavlennuyu nizhe v etoj knige. (Vmesto etogo vy snova mozhete ispol'zovat' komandu clear, esli ona dostupna.) Stroka 5 ustanavlivaet v pozicionnye parametry vyhod komandy date. |to to zhe samoe, chto my delali v programme cpiobr. Stroki 6-17 vyvodyat menyu. Zdes' ispol'zovan odin operator echo, kak opisano v cpiobr. Stro- ka 13 chitaet komandu pol'zovatelya. Stroki 20-27 vypolnyayut osnovnuyu rabotu programmy. Esli vvedennaya komanda byla prosto vozvratom karetki (traktuetsya kak nul'), programma zavershaetsya. V stroke 23 komanda sed prosmatrivaet fajl $HOME/bin/log. |to trebuet, chtoby vy pomestili log v podkataloge dvoichnyh modulej va- shego registracionnogo kataloga. Esli vy razmestite ee gde-libo v drugom meste, vy dolzhny izmenit' etu stroku. Komanda sed ispol'zuet klyuch -n, kotoryj zapreshchaet vyvod, za isklyucheniem togo, chto yavno ukazano dlya pe- chati. Stroka -e nahodit imena fajlov. Dannyj podhod ispol'zuet funkciyu zameny v komande sed. Takim obra- zom my mozhem zamenit' vse za isklyucheniem imeni fajla, a zatem napecha- tat' ego. Smysl etoj zapisi primerno takoj: sperva my ishchem vyrazhenie more (/more/), nahodya tem samym vse stroki v fajle protokola, soderzha- shchie slovo "more". Po opredeleniyu, kazhdyj fajl protokola vyvoditsya na ekran, ispol'zuya komandu more. Poskol'ku vy dobavlyaete fajly protokola, kazhdaya novaya stroka dolzhna soderzhat' slovo more, poetomu fajly naho- dyatsya avtomaticheski po vyrazheniyu komandy sed. Zatem my ukazyvaem komande sed sdelat' zamenu. Pervoe vyrazhenie soderzhit v sebe vsyu stroku ot nachala do konca, no my primenyaem kruglye skobki dlya otmetki vnutri nee obrazca .*, tem samym vydelyaya chast' stro- ki mezhdu probelom posle "more" i pervoj tochkoj s zapyatoj v konce stro- ki. Esli vy posmotrite na vse stroki v fajle log, kotorye nachinayutsya s "more", to vy uvidite, chto eto sootvetstvuet imeni fajla, kotoroe my ishchem. Zatem my ukazyvaem komande sed zamenit' vsyu stroku na pervyj obra- zec "pattern 1". "Pattern 1" - eto zapis' komandy sed dlya pervogo otme- chennogo ili "otmechennogo birkoj" vyrazheniya. Drugimi slovami, my zameni- li imya fajla na vsyu stroku celikom i ukazali komande sed napechatat' re- zul'tat, tem samym vydavaya na ekran imya fajla. |ta rabota vypolnyaetsya dlya takogo kolichestva operatorov more, skol'ko vy imeete. CHem bol'she fajlov log vy imeete, tem bol'she fajlov obrabatyvaet komanda sed. Obratite vnimanie, chto operator sed prosmat- rivaet lyuboe kolichestvo simvolov ot nachala stroki dlya nahozhdeniya slova "more". Ne ukazyvaya v programme konkretnoe chislo simvolov, na kotoroe nuzhno otstupit', vy poluchaete tem samym svobodu vybora vashih sobstven- nyh urovnej otstupa. Esli vvedennaya komanda ne yavlyaetsya dopustimoj, vydaetsya soobshchenie ob oshibke. |ta programma ne imeet cikla, poetomu srabatyvaet odin raz. Esli vy hotite zapustit' ee snova, vy dolzhny snova vvesti log. Primer $ log 1 Posle zapuska programmy vyvoditsya menyu. Vvedite chislo 1 dlya togo, chtoby uvidet' vse imena log-fajlov. Teper', kogda my izuchili, kak raspoznavat' i upravlyat' fajlami vo- obshche, davajte rassmotrim nekotorye sistematicheskie metody upravleniya INFORMACIEJ v fajlah. My nachinaem v sleduyushchej glave s fajlov, kotorye vazhny dlya nas kak dlya programmistov.

    * GLAVA 4. Upravlenie programmnoj dokumentaciej *

VVEDENIE 4.1. PROGRAMMIROVANIE i UPRAVLENIE DOKUMENTACIEJ 4.2. IZVLECHENIE DOKUMENTIRUYUSHCHIH ZAGOLOVKOV 4.2.1. stripc - iz fajla na yazyke Si 4.2.2. stripf - iz Si-funkcii 4.2.3. strips - iz komandnogo fajla Shell 4.3. ctags - sozdanie fajla priznakov ishodnogo koda proekta

    VVEDENIE

Vy reshili risknut'. Produkt na tri mesyaca opazdyvaet v proiz- vodstvo i nuzhdaetsya lish' v krohotnoj dorabotke. Vy uvereny, chto znaete, kak rabotaet funkciya, kotoraya otkryvaet vhodnoj bufer. Vy ee nedavno ispol'zovali. Vy uvelichivaete razmer bufera v vyzove funkcii i zapuska- ete bystryj testik. Vse v poryadke, poetomu vy okonchatel'no sobiraete postavku na diske i otpravlyaete ee v proizvodstvo. Mesyac spustya, nachi- nayut postupat' soobshcheniya ot razgnevannyh zakazchikov. Pohozhe, chto esli tekstovyj processor, elektronnaya tablica i baza dannyh otkryty vse vmeste i aktivny odnovremenno (chto yavlyaetsya odnim iz bol'shih tovarnyh dostoinstv vashego produkta), to prosto novyj bufer nastol'ko velik, chto pogloshchaet klyuchevoj razdel pamyati i prevrashchaet vysoko letayushchee chudo in- tegrirovannogo programmnogo obespecheniya v yarkuyu ruinu. Pochemu vy ne proverili dokumentaciyu po etoj funkcii? Vyyasnenie to- go, v kakom fajle nahoditsya dokumentaciya, zanyalo by opredelennoe vremya, a poskol'ku dokumentaciyu tak trudno soprovozhdat', to svyazannye s nej veshchi tak ili inache ustarevayut. Tem ne menee, analogichnye provaly ne dolzhny voznikat'. Programmirovanie - tyazhelaya rabota, no eto tol'ko polovina raboty. Horoshaya dokumentaciya ochen' vazhna, esli vy sobiraetes' imet' vozmozhnost' soprovozhdat' vash programmnyj kod, no i upravlenie vsej dokumentaciej, svyazannoj s bol'shim programmnym proektom takzhe yavlyaetsya tyazheloj rabo- toj. Proishodyat postoyannye izmeneniya, i obychno otsutstvuet edinoobrazie podhoda. Dokumentirovanie ishodnyh fajlov na Sikak v celom, tak i po kazhdoj funkcii yavlyaetsya horoshim pervym shagom, no takaya dokumentaciya ne ochen' polezna, esli vy vynuzhdeny probirat'sya cherez dyuzhiny fajlov, chtoby obnaruzhit', kak nazyvaetsya konkretnaya funkciya ili kakie funkcii sostav- lyayut dannyj modul'. Esli vy hoteli by izuchit' eshche odno sredstvo, svyazannoe s razrabot- koj, sm. programmu cg v glave 10.

    4.1. PROGRAMMIROVANIE I UPRAVLENIE DOKUMENTACIEJ

V dannoj glave predstavlen nabor komandnyh fajlov komandnogo pro- cessora dlya izvlecheniya dokumentiruyushchej informacii iz ishodnogo koda programm na Si i komandnyh fajlov komandnogo processora. Ispol'zuyutsya dve strategii. Pervaya sostoit v tom, chto, sleduya standartnoj "modeli dokumentacii" v ishodnom kode, vy mozhete pridumat' komandnye fajly, ko- torye prosto "vytyagivayut" samye novye razdely s zagolovochnoj informaci- ej iz fajlov s ishodnym kodom i sobirayut ih zatem v novyj fajl. Takie fajly sluzhat v kachestve karkasa dlya dokumentacii po programme. Sledova- tel'no, pri uslovii, chto zagolovki ishodnogo koda izmenyayutsya raznymi programmistami standartnym obrazom, prostaya komanda UNIX mozhet izvlech' polnost'yu novyj karkas rukovodstva. |tot podhod realizuyut komandnye fajly stripc, stripf i strips. Stripc i stripf predostavlyayut listingi blokov dokumentacii urovnya fajla i urovnya funkcij iz vashih ishodnyh fajlov na Si, a strips izvlekaet doku- mentaciyu iz komandnyh fajlov komandnogo processora. Vtoroj podhod - dostup k opredelennym vidam struktur (takim kak funkcii na Si) v tele samogo programmnogo koda. |tim metodom vy mozhete tochno najti, kak nazyvaetsya dannaya funkciya, bez sosredotochennogo izuche- niya gory listingov. Komandnyj fajl ctags yavlyaetsya i poleznym instrumen- tom, i model'yu primeneniya etogo podhoda k drugim vidam programmnyh struktur. Ctags ob容dinyaet svoj vyvodnoj fajl s redaktorom vi/ex s cel'yu predostavleniya prostogo sposoba dostupa k lyuboj zadannoj funkcii i ee prosmotra, kopirovaniya ili redaktirovaniya v tekushchej programme. Ctags delaet eto putem predostavleniya priznakov, kotorye ponimaet vi, dlya kazhdoj funkcii, obnaruzhennoj v lyubom ukazannom nabore fajlov. Takim ob- razom, vy mozhete ispol'zovat' prostuyu komandu redaktora, chtoby poluchit' to, chto vam nuzhno. Vy bol'she ne obyazany zabotit'sya o tom, kakoj fajl soderzhit kakuyu funkciyu. Ctags - otlichnyj primer primeneniya moshchi UNIX v polnom ob容me. Imeya takie instrumental'nye sredstva, vam ne nuzhno izobretat' ko- leso, tak kak vy mozhete legko nahodit' i vybirat' te sredstva, kotorye neobhodimy vam v konkretnom prilozhenii. Vy uzhe napisali programmu up- ravleniya terminalom Trantor TR-101? Primenite ctags i najdite ee. Bolee togo, samodokumentiruemyj napechatannyj fajl i dokumentaciya o funkciyah, poluchennaya s pomoshch'yu etih komandnyh fajlov, dayut drugim programmistam horoshij start v ponimanii togo, chto vy sdelali. |to dazhe mozhet slegka proizvesti vpechatlenie na vashego nachal'nika. Kakim v obshchih chertah budet nash podhod k sozdaniyu takih komandnyh fajlov? U nas est' nekotorye potencial'nye preimushchestva v primenenii takogo vida dostupa v sisteme UNIX. Prezhde vsego, ishodnye fajly ne ot- lichayutsya ot drugih tekstovyh fajlov, poetomu my mozhem ispol'zovat' vse imeyushchiesya v UNIX sredstva poiska i raspoznavaniya shablonov (sed, awk i t.d.), chtoby nahodit' simvol'nye stroki. Vo-vtoryh, my osvoili tehniku obhoda fajlovyh derev'ev i raboty s otobrannymi tipami fajlov, opisan- nuyu v predydushchih glavah. Nash podhod sostoit v ob容dinenii etih sredstv takim obrazom, chtoby oni obespechivali dostup k strukturirovannoj doku- mentacii, soderzhashchejsya v programmnyh fajlah. 4.2. Izvlechenie dokumentiruyushchih zagolovkov 4.2.1. stripc - iz fajla na yazyke Si ------------------------------------------------------------ IMYA: stripc ------------------------------------------------------------ stripc Izvlekaet dokumentiruyushchij zagolovok iz ishodnogo fajla na yazyke Si.

    NAZNACHENIE

Pechataet pervyj blok strok kommentariya v fajle s ishodnym kodom na Si tak, chtoby vy mogli bystro identificirovat' naznachenie programmy na Si.

    FORMAT

stripc fajl [...]

    PRIMER VYZOVA

stripc prog*.c > header Izvlekaet nachal'nye bloki kommentariev iz vseh fajlov i pomeshchaet v odin fajl s imenem header. ISHODNYJ KOD DLYA stripc 1 : 2 # @(#) stripc v1.0 Strip comment header Author: Russ Sage 4 if [ "$#" -eq "0" ] 5 then echo "stripc: arg count error" >&2 6 echo "usage: stripc file [...]" >&2 7 exit 1 8 fi 10 for FILE in $@ 11 do 12 if [ ! -s $FILE ] 13 then echo "file \"$FILE\" does not exist" >&2 14 continue 15 fi 17 awk '/^\/\*/, /^ \*\// { if ($0 != " */") 18 print 19 else {print;exit} 20 }' $FILE 21 echo "^L" 22 done (Pered tem kak vvodit' etot ishodnyj kod, obratite vnimanie, chto v stroke 21 dolzhen byt' dejstvitel'no simvol control- L, vvedennyj mezhdu dvumya kavychkami, po prichinam, rassmotrennym nizhe.)

    PEREMENNAYA SREDY

FILE Hranit imya fajla, poluchennoe iz komandnoj stroki. OPISANIE ZACHEM NAM NUZHEN stripc? V bol'shih proektah po razrabotke programmnogo obespecheniya trebu- etsya obychno mnogo vremeni dlya raboty s dokumentaciej. Imeyutsya programm- nye fajly dlya dokumentirovaniya, funkcional'nye specifikacii dlya napisa- niya programm i, nakonec, rukovodstva i spravochnye karty, glossarii, ukazateli i t.d. Nastoyashchij programmnyj kod dolzhen imet' svoyu sobstven- nuyu vstroennuyu dokumentaciyu, inache upravlenie etim kodom stanovitsya ochen' trudnym. CHtoby izbezhat' putanicy, nuzhno sozdat' model' dokumentacii, a za- tem sdelat' ee standartom, kotoromu dolzhny sledovat' vse programmisty. Dazhe esli eta model' ne budet absolyutno ideal'noj, ee nalichie yavlyaetsya pervym shagom po sozdaniyu sredy, kotoroj vy mozhete upravlyat'. Sleduyushchie dva instrumental'nye sredstva, kotorye my predlagaem, sleduyut modeli dokumentacii, opisannoj v dal'nejshem tekste. |ta model' posledovatel'na i ponyatna, ee mozhno dopolnit' ili izmenit' po vashemu usmotreniyu. CHTO DELAET stripc? Stripc pechataet tol'ko pervyj zagolovochnyj blok kommentariev iz nachala ishodnogo fajla na yazyke Si. ZHelatel'no, chtoby etot blok soder- zhal vsyu vazhnuyu informaciyu o fajle: ego oficial'noe imya, dlya chego on prednaznachen, kto ego sozdal, kogda on byl sozdan i t.d. Vnutri fajla mozhet razmeshchat'sya odna ili neskol'ko funkcij ili dazhe glavnaya program- ma. |ta model' predpolagaet, chto ves' vash kod soderzhit ochen' malo glav- nyh programm i mnogo nezavisimyh modulej. Rassmotrim na model'nom ishodnom fajle, kakogo roda informaciyu my dolzhny izvlech' iz ishodnyh fajlov. /* * |to dokumentiruyushchij zagolovok dlya fajla * s ishodnym kodom na yazyke Si. * On poyasnyaet, chto soderzhitsya v fajle (programmy, funkcii, * biblioteki i t.d.) i identificiruet proekt. * */ |to otmetka konca zagolovochnogo kommentariya. ^L Instrumenty izvlecheniya primenyayut control-L kak razdelitel'. /* |to dokumentiruyushchij zagolovok dlya glavnoj chasti programmy. * Glavnaya pometka dolzhna ob座asnyat', chto eto za programma * i chto ona delaet. Zdes' mogut byt' takzhe ukazany avtor, * data i istoriya izmenenij. */ main() { /* Zdes' nahoditsya glavnaya Si-programma */ } ^L /* |to dokumentiruyushchij zagolovok dlya opredelennoj funkcii, * kotoraya za nim sleduet. Dokumentiruetsya posledovatel'- * nost' vyzova, vhod i vyhod i obshchee naznachenie etoj * funkcii. */ func(arg1,arg2) int arg1; char arg2; { /* Tekst funkcii nahoditsya zdes' */ } ^L /* Analogichno, etot blok kommentariev dokumentiruet * sleduyushchuyu funkciyu. Nalichie dokumentacii vmeste s kodom * sokrashchaet ob容m nakladnyh rashodov pri chtenii i * izmenenii koda. */ func(arg1,arg2) int arg1, arg2; { /* Tekst funkcii nahoditsya zdes' */ } Kak ukazyvalos' ranee, funkciya main ne obyazatel'na i, veroyatno, vstrechaetsya tol'ko v odnom ili dvuh fajlah, v zavisimosti ot vida prog- ramm, kotorye vy pishete. Odin fajl mozhet imet' stol'ko funkcij, skol'ko vy hotite, no rekomenduemoe maksimal'noe chislo - ot odnoj do treh, v zavisimosti ot togo, kak eti funkcii vzaimosvyazany. V kazhdom fajle imejte delo tol'ko s odnoj programmiruemoj ideej i ee realizaciej. Pri izuchenii etoj modeli vy vidite, chto obespechivaetsya tri urovnya dokumentacii. Zagolovok v nachale fajla izvlekaetsya s pomoshch'yu stripc. |tot zagolovok otnositsya ko vsemu fajlu v celom. Zagolovok v nachale glavnoj programmy otnositsya ko vsej programme i podderzhivaetsya s po- moshch'yu stripf. Zagolovok dlya kazhdoj funkcii otnositsya k etoj funkcii. |ti zagolovki obsluzhivayutsya komandnym fajlom stripf, kotoryj obsuzhda- etsya nizhe. Otmetim, chto mezhdu funkciyami imeetsya progon formata (simvol control-L koda ASCII). V predydushchem listinge my ukazali etu kombinaciyu klavish s pomoshch'yu simvola ^L, chtoby nashi tekstovye processory ne proiz- vodili lishnih stranic pri formatirovanii rukopisi dannoj knigi. Vam nuzhno v kazhdom sluchae dejstvitel'no vvodit' control-L vmesto ^L pri razmeshchenii kommentariev v vashih fajlah i pri vvode ishodnogo koda dan- nogo i posleduyushchih komandnyh fajlov. Simvol progona formata ispol'zu- etsya v modeli zagolovka dlya otmetki verhnej granicy pervoj funkcii v fajle i dlya progona stranic na pechatayushchem ustrojstve pri chistovoj raspechatke, chtoby kazhdaya funkciya poyavlyalas' na novoj stranice. V nachale kazhdoj funkcii (pered main ili pered imenem funkcii) dol- zhen sushchestvovat' dokumentiruyushchij zagolovok. |tot zagolovok obychno otra- zhaet naibolee nedavnie izmeneniya v etom module, i ego mozhno schitat' bo- lee dostovernym, chem zagolovok dokumenta, kotoryj byl napechatan neskol'ko nedel' ili dazhe mesyacev nazad. Vhodom dlya stripc yavlyaetsya posledovatel'nost' imen fajlov s ishod- nym kodom. Dlya kazhdogo fajla v komandnoj stroke proveryaetsya, sushchestvuet li on i imeet li razmer bol'she, chem nol' bajt. Esli on ne udovletvoryaet etim kriteriyam, to pechataetsya soobshchenie ob oshibke i proveryaetsya sleduyu- shchij fajl. Kazhdyj fajl chitaetsya s pervogo bajta, i v nem ishchetsya simvol'- naya stroka nachala kommentariya (/*). Kogda ona najdena, informaciya do simvol'noj stroki konca kommentariya (*/) postrochno vyvoditsya v stdout. Esli pravye simvoly ne najdeny, nichego ne pechataetsya, no soobshchenie ob oshibke ne vyvoditsya, chtoby ne isportit' vyvodnuyu informaciyu. Posle togo kak kazhdyj fajl obrabotan, v konce pechataetsya progon formata, kotoryj razbivaet vyvodnuyu informaciyu na stranicy-razdely. |to primenyaetsya v osnovnom, kogda dokumentiruyushchie zagolovki ochen' dlinnye i nuzhdayutsya v vizual'noj razbivke. Otmetim, chto "izvlechenie" ("strip") zdes' i v sleduyushchih dvuh uti- litah oznachaet ne UDALENIE, a kopirovanie sootvetstvuyushchej informacii. Nikakih izmenenij vo vhodnyh fajlah ne delaetsya. Kogda vse fajly v komandnoj stroke obrabotany, komandnyj fajl za- vershaetsya.

    PRIMERY

1. $ stripc test?.c > test.filehdrs Izvlekaet blok fajlovyh kommentariev iz vseh fajlov, sootvetstvuyu- shchih stroke "test", za kotoroj sleduyut odin proizvol'nyj simvol, a zatem .c. Syuda podhodyat test1, testA, testb i t.d. Vse bloki kommentariev po- meshchayutsya v fajl test.filehdrs v takom poryadke, kak oni obrabatyvalis' by v cikle for. 2. $ for DIR in src1 src2 src3 > do > stripc $DIR/*.c > /tmp/$DIR.hdrs > done |tot cikl prohodit kazhdyj iz treh katalogov src1, src2 i src3. V kazhdom iz nih imeyutsya ishodnye fajly, iz kotoryh nuzhno izvlech' dokumen- tiruyushchie zagolovki. Kazhdyj raz beretsya odin katalog, i stripc vyzyva- etsya dlya vseh ishodnyh fajlov na yazyke Si iz dannogo kataloga. Vyhod, t.e. vse dokumentiruyushchie zagolovki iz fajlov v etom kataloge, pomeshcha- etsya v fajl v kataloge /tmp. Fajly v /tmp imeyut imena /tmp/src1.hdrs, /tmp/src2.hdrs i /tmp/src3.hdrs. Otmetim, chto chislo fajlov, peredavae- myh stripc, imeet ogranichenie v 255 simvolov. Posle etogo komandnaya stroka perepolnyaetsya i vypolnenie komandnogo fajla avarijno zaversha- etsya. POYASNENIYA Stroki 4-8 delayut proverku na oshibki. Esli chislo parametrov v ko- mandnoj stroke nulevoe, voznikaet oshibka. Pri vyzove stripc dolzhno byt' hotya by odno imya fajla. Cikl for v strokah 10-22 probegaet po kazhdomu imeni fajla iz spiska pozicionnyh parametrov v komandnoj stroke. Pervym delom, v strokah 12-15 proveryaetsya sushchestvovanie fajla. Esli fajl ne sushchestvuet, vydaetsya sootvetstvuyushchee soobshchenie ob oshibke i cikl prodolzhaetsya so sleduyushchim fajlom. Stroki 17-20 - eto cikl awk, kotoryj delaet vsyu vazhnuyu rabotu. Vhodnym dlya awk yavlyaetsya imya fajla, kotoroe sejchas obrabatyvaet cikl for. Esli vy ne ochen' znakomy s programmoj awk, soobshchim, chto ona vyzy- vaetsya tak: awk programma imya-fajla gde programma sostoit iz posledovatel'nosti predlozhenij, imeyushchih vid: shablon { dejstvie } Ukazannoe dejstvie primenyaetsya k tekstu, kotoryj sootvetstvuet shablonu. Dlya togo chtoby utilita awk rabotala korrektno, vy dolzhny zak- lyuchit' vsyu programmu v odinarnye kavychki. V stripc dlya ukazaniya nachala kommentariya (/*) i konca kommentariya (*/) ispol'zuyutsya sootvetstvenno shablony /^\/\*/ i /^ \*\// Dlya interpretacii etih oboznachenij nuzhno vspomnit' regulyarnye vy- razheniya ed, sed i grep. Regulyarnye vyrazheniya (RV) dolzhny byt' ograniche- ny (simvolom /). awk vosprinimaet dva vyrazheniya, razdelennye zapyatymi, kak nachal'nyj i konechnyj shablony dlya kvalifikacii vvodnyh strok. V dannom primere nachal'noe vyrazhenie oznachaet "ot nachala stroki (^), vsled za dejstvitel'nym simvolom kosoj cherty (kotoryj dolzhen byt' ekranirovan, chtoby ubrat' ego special'noe znachenie, t.e. \/) i dejstvi- tel'noj zvezdochkoj (\*), ispol'zovat' vse stroki, obnaruzhennye vplot' do konechnogo vyrazheniya". |tim vybiraetsya tol'ko pervoe vhozhdenie so- postavlyaemogo shablona (t.e. pervogo bloka kommentariev), tak kak prog- ramma awk zakanchivaet rabotu pri obnaruzhenii zavershayushchej stroki. (Ostal'nye bloki kommentariev vybirayutsya s pomoshch'yu stripf vmeste s ime- nem funkcii i argumentami.) Dlya kazhdoj stroki, kotoraya sootvetstvuet naboru vyrazhenij ot na- chal'nogo do konechnogo, vypolnyayutsya predlozheniya, ukazannye v "dejstvii". Stroki 17, 18 i 19 soderzhat predlozhenie if-then= else, kotoroe vypolnya- et vsyu rabotu. Esli $0 (chto yavlyaetsya vsej strokoj) NE ravno probelu i koncu kommentariya (*/), pechataetsya vsya stroka. Formiruya takim obrazom predlozhenie if, my pechataem pervuyu stroku i vse posleduyushchie stroki, po- ka ne doberemsya do konca kommentariya. Kogda obnaruzhena poslednyaya stroka, rezul'tatom proverki yavlyaetsya znachenie "lozh'", poetomu vypolnyaetsya else-chast'. Poskol'ku my znaem, chto eto poslednyaya stroka, my pechataem ee dlya zavershennosti bloka kom- mentariya, a zatem vyhodim iz awk. Otmetim, chto blagodarya vlozheniyu etih dvuh komand vmeste v figurnye skobki ({}), oni rassmatrivayutsya kak odno sostavnoe predlozhenie. Posle zaversheniya awk proizvoditsya eho-otobrazhenie progona formata na ekran i beretsya sleduyushchij fajl. Tak prodolzhaetsya do teh por, poka vse fajly v komandnoj stroke ne budut obrabotany. 4.2.2. stripf - iz Si-funkcii ------------------------------------------------------------ IMYA: stripf ------------------------------------------------------------ stripf Izvlekaet dokumentiruyushchij zagolovok Si-funkcii. FUNKCIYA Izvlekaet i pechataet kommentiruyushchij zagolovok, imya funkcii s para- metrami vyzova i ob座avlenie tipov parametrov dlya vseh funkcij v ishod- nom fajle na Si. FORMAT stripf file [...] PRIMER VYZOVA stripf lib1.c Izvlekaet dokumentiruyushchie zagolovki dlya vseh funkcij v fajle lib1.c. ISHODNYJ KOD DLYA stripf 1 : 2 # @(#) stripf v1.0 Strip function header Author: Russ Sage 4 for FILE in $@ 5 do 6 sed -n -e ' 7 /^L$/ { 8 s/^L$/.bp/p 9 : loop 10 n 11 /^{/b exit 12 p 13 b loop 14 : exit 15 i\ 16 {} 17 b 18 }' $FILE 19 done

    PEREMENNAYA SREDY

FILE Hranit imya fajla dlya kazhdogo fajla iz komandnoj stroki. OPISANIE ZACHEM NAM NUZHEN stripf? Predpolozhim, chto nash kod na yazyke Si sootvetstvuet modeli dokumen- tacii, predstavlennoj ranee pri opisanii stripc. Togda nam nuzhen sposob podderzhaniya izmenenij v dokumentacii po hodu izmenenij koda. My videli, chto pri hranenii dokumentacii v ishodnyh fajlah bolee veroyatno, chto ona budet izmenena, kogda izmenitsya kod. Problema voznikaet, kogda nam nuzh- na tverdaya kopiya dokumentacii, kotoraya nahoditsya vnutri ishodnogo koda. Kak nam poluchit' ee iz fajlov? CHTO DELAET stripf? Komandnyj fajl stripf reshaet etu problemu. On prosmatrivaet ves' fajl i pechataet vsyu dokumentaciyu dlya kazhdoj FUNKCII, kotoraya razmeshchena v etom fajle (vklyuchaya "main", esli ona est'). Vhodom dlya stripf yavlyayutsya imena fajlov, peredannye v komandnoj stroke. Stripf obrabatyvaet fajly po ocheredi i pomeshchaet vyhod v stdout. |tot vyhod mozhno perenapravit', no vhod dolzhen byt' v komandnoj stroke. K vyhodu primenyayutsya dopolnitel'nye modifikacii, chtoby sformiro- vat' dannye dlya sredy utility nroff, poetomu vyvodnye fajly mozhno for- matirovat' s pomoshch'yu etoj utility. Vse progony formata zamenyayutsya na komandu .bp, prinyatuyu v nroff dlya nachala stranicy. |ta komanda nroff progonyaet stranicu i uvelichivaet na edinicu schetchik stranic. Vozmozhno, vy ne hotite menyat' nazhatie klavish control-L na eto znachenie, no vy vsegda mozhete ukazat' v komandnom fajle takie dejstviya, kakie vam nuzh- ny.

    PRIMERY

1. $ stripf module1.c | grep >"^\.bp$" | wc -l Pechataet chislo modulej-funkcij, soderzhashchihsya v fajle module1.c, putem poiska kazhdogo poyavleniya komand novoj stranicy programmy nroff i ih podscheta. My znaem, chto odna iz takih komand yavlyaetsya vyhodom dlya kazhdoj obnaruzhennoj funkcii. Dannuyu stroku mozhno vlozhit' v predlozhenie echo, kotoroe govorit "imeetsya X modulej v fajle $FILE". 2. $ for FILE in *.c ../*.c $HOME/src/*.c > do > stripf $FILE > done >> /tmp/func.hdrs Dannyj cikl for rasprostranyaetsya na vse fajly v tekushchem kataloge, kotorye okanchivayutsya na .c, vse fajly v roditel'skom kataloge s takim zhe suffiksom i vse fajly v podkataloge src moego home-kataloga s tem zhe suffiksom. Iz kazhdogo fajla izvlekaetsya dokumentaciya o funkciyah i nap- ravlyaetsya v standartnyj vyvod. Ves' cikl perenapravlen s pomoshch'yu >>, poetomu vyhod kazhdogo vyzova stripf DOBAVLYAETSYA k fajlu v /tmp.

    POYASNENIYA

Vsya programma - eto odin bol'shoj cikl for v strokah 4-19. |tot cikl prisvaivaet peremennoj FILE kazhdoe imya, imeyushcheesya v komandnoj stroke. Dannyj komandnyj fajl ne imeet opcij i obrabotki oshibok. Komanda sed sistemy UNIX vyzyvaetsya dlya kazhdogo imeni fajla. Prog- ramma sed chitaet ves' vhod i vyvodit izmenennyj tekst v standartnyj vy- vod. Opciya -n ispol'zuetsya v sed dlya podavleniya vsego vyvoda, v proti- vopolozhnost' dejstviyu po umolchaniyu, kogda vse pechataetsya. My ispol'zuem etot flag po toj prichine, chto my hotim ukazat' programme sed, kogda pe- chatat' vyhod. Opciya -e primenyaetsya, chtoby soobshchit' programme sed, chto sleduyushchaya posledovatel'nost' teksta mezhdu odinarnymi kavychkami yavlyaetsya vyrazheniem, kotoroe nuzhno vychislit'. Napomnim, chto sed - potokovyj redaktor, kotoryj chitaet odnu stro- ku, sveryaet ee s vyrazheniyami, zatem chitaet sleduyushchuyu stroku i delaet vse snachala. Pervoe, chto my ishchem - simvol control-L, stoyashchij v stroke samostoyatel'no. Esli my ne nahodim ego, proveryaetsya sleduyushchaya stroka i tak dalee, poka ne budet obnaruzhen control-L. (Eshche raz napomnim, chto vmesto oboznacheniya ^L v kode dolzhen byt' vveden nastoyashchij control-L.) Kogda obnaruzhen control-L, on aktiviziruet vse vyrazhenie, zaklyu- chennoe v figurnye skobki. Pervym dejstviem yavlyaetsya podstanovka komandy nachala stranicy programmy nroff, kak opisano ranee. |ta podstanovka pe- chataetsya, chto yavlyaetsya samym pervym vyvodom. V stroke 9 ob座avlena metka "loop". |to ne privodit ni k kakim dejstviyam, no ustanavlivaet tochku perehoda, kotoraya vposledstvii ispol'zuetsya. (Upravlyayushchie struktury programmy sed dovol'no primitivny, no oni pozvolyayut opisat' vypolnyaemuyu rabotu.) Stroka 8 ispol'zuet komandu n programmy sed, chtoby vyzvat' chtenie sleduyushchej stroki. My razobralis' s pervoj strokoj - strokoj, kotoraya soderzhit control-L - tak chto my mozhem ee otbrosit'. V sluchae vypolneniya cikla my vidim, chto sed prodvigaetsya po nashemu trebovaniyu, no ne prod- vigaetsya sam. Vspomnim model' dokumentacii, rassmotrennuyu ranee. |ta model' vklyuchaet dokumentiruyushchij zagolovok dlya fajla v celom, vypolnennyj v obychnom stile yazyka Si. Model' zavershaetsya simvolom control-L. |tot pervyj blok obrabatyvaetsya s pomoshch'yu stripc, kak opisano ranee. My ne hotim ispol'zovat' ego zdes' pri rabote so stripf. Poetomu my sejchas dolzhny spozicionirovat'sya posle fajlovogo dokumentiruyushchego zagolovka. Vsled za simvolom control-L imeetsya eshche odin nabor iz odnoj ili bolee strok kommentariya yazyka Si, kotorye opisyvayut funkciyu, sleduyushchuyu za nimi. Dalee idet samo imya funkcii, ob座avlenie parametrov i otkryvayu- shchij simvol samoj funkcii, kotorym yavlyaetsya levaya figurnaya skobka (}). Stroka 11 ishchet etu figurnuyu skobku. Esli ona najdena, vypolnenie perehodit na metku exit (stroka 14). My mozhem polagat', chto my vse sde- lali, esli najdena levaya figurnaya skobka, tak kak etot simvol dolzhen poyavlyat'sya tol'ko v nachale funkciimodulya. Kogda my nahodim figurnuyu skobku, my uzhe napechatali k etomu momentu vsyu kommentiruyushchuyu informaciyu i zagolovok funkcii posredstvom stroki 12, kotoruyu my sejchas opishem. A chto esli figurnaya skobka poyavlyaetsya v pole kommentariya? Net problem, poskol'ku poisk figurnoj skobki privyazan k nachalu stroki s pomoshch'yu sim- vola ^. On proizvodit vyrazhenie, oznachayushchee "ot pervogo simvola v stro- ke". My tol'ko togda sopostavlyaem figurnuyu skobku etomu vyrazheniyu, kog- da ona vstrechaetsya v kachestve samogo pervogo simvola v stroke. Zatem stroka 12 predpolagaet, chto my eshche ne obnaruzhili figurnuyu skobku i poetomu my dolzhny napechatat' stroku. Operator p pechataet teku- shchuyu stroku, kotoruyu obrabatyvaet sed. |tot vyvod napravlyaetsya na ekran. Stroka 13 - bezuslovnyj perehod na metku loop. Otmetim, chto etot perehod tol'ko izmenil process vypolneniya i ne privel k chteniyu eshche od- noj vvodnoj zapisi. S etim my dolzhny byt' ostorozhny pri upravlenii pro- cessom vypolneniya v programme sed. My tol'ko chto napechatali tekushchuyu za- pis', poetomu teper' my dolzhny otbrosit' ee i poluchit' sleduyushchuyu za- pis', chto oznachaet vozvrat v stroku 9. |tot cikl pechati i chteniya sledu- yushchej zapisi prodolzhaetsya do obnaruzheniya figurnoj skobki, kotoraya pere- vodit vypolnenie na metku exit. Stroka 14 - eto metka exit. Kogda my popadaem na nee, my znaem, chto byl obnaruzhen control-L, napechatan kommentiruyushchij zagolovok, nape- chatany imya funkcii i ob座avleniya ee parametrov i najdena figurnaya skob- ka. Zametim, chto figurnaya skobka eshche ne napechatana. Kogda my nahodim ee, my tol'ko delaem vetvlenie. Stroka 15 zavershaet vyvod, vstavlyaya nekotoryj tekst v vyvodnoj po- tok. My ne mozhem skazat' "pechatat' eto v bukvennom vide", poetomu pro- ishodit dvizhenie vpravo po tekstu, kak po komande echo. My dolzhny syg- rat' na pravilah, ustanovlennyh programmoj sed. Lyuboj vyvod dolzhen byt' porozhden obychnymi komandami v stile redaktora ed. Vstavka teksta s po- moshch'yu komandy "i" delaet nam eto. Otmetim, chto my takzhe vstavlyaem sim- vol vozvrata karetki (ili perevoda stroki, v zavisimosti ot vashej osve- domlennosti). On mozhet byt' opredelen simvolom obratnoj kosoj cherty (\). Obratnaya kosaya cherta ubiraet special'noe znachenie simvolov i pri ispol'zovanii v konce stroki, kak zdes', oznachaet, chto special'nyj sim- vol, vstavlennyj v vyrazhenie, yavlyaetsya vozvratom karetki. Vdobavok k vozvratu karetki, my vstavlyaem paru figurnyh skobok. |to oboznachaet ob座avlenie nachala-konca funkcii, kotoruyu my obrabatyvaem. Poskol'ku my vstavlyaem tekst, my ne dolzhny govorit' programme sed, chto ego nuzhno pe- chatat'. Stroka 17 - bezuslovnyj perehod na sebya, ukazyvayushchij programme sed perehod na vershinu vsego obrabatyvaemogo vyrazheniya. Kogda eto proisho- dit, my zavershaem poisk eshche odnogo control-L i nachinaem ves' process snova. Takim obrazom, my mozhem obrabotat' vse funkcii iz odnogo fajla nezavisimo ot togo, skol'ko ih tam. Stroka 18 yavlyaetsya koncom sed-vyrazheniya i soderzhit takzhe imya faj- la, kotoroe dolzhno byt' peredano programme sed. |to yavlyaetsya chast'yu obychnogo sintaksisa, prinyatogo v sed, no vyglyadit neskol'ko neumestnym, tak kak ne vydeleno special'nym otstupom. Kogda vse fajly obrabotany, zavershaetsya vneshnij cikl i zakanchivaetsya rabota komandnogo fajla. 4.2.3. strips - iz komandnogo fajla Shell ------------------------------------------------------------ IMYA: strips ------------------------------------------------------------ strips Izvlekaet dokumentiruyushchij zagolovok komandnogo processora.

    FUNKCIYA

Pechataet nachal'nye stroki kommentariya k komandnomu fajlu komandno- go processora, chto vyrazheno bukvoj "s" v imeni. Pervaya stroka ignoriru- etsya dlya sovmestimosti s komandnym processorom yazyka Si.

    FORMAT

strips fajl [...]

    PRIMER VYZOVA

strips *.sh Izvlekaet kommentarii iz vseh komandnyh fajlov v tekushchem kataloge. ISHODNYJ KOD DLYA strips 1 : 2 # @(#) strips v1.0 Strip shell comment header Author: Russ Sage 4 for FILE in $@ 5 do 6 cat $FILE | (read LINE; echo $LINE 7 while read LINE 8 do 9 if [ "`echo $LINE|cut -c1`" = "#" ] 10 then echo "$LINE" 11 else exit 12 fi 13 done) 14 done

    PEREMENNYE SREDY

FILE Hranit kazhdoe imya fajla, poluchennoe iz komandnoj stroki. LINE Hranit kazhduyu stroku vvodnogo teksta, poluchennuyu iz chitaemogo fajla. OPISANIE ZACHEM NAM NUZHEN strips? Tak zhe kak nam nuzhny sredstva obrabotki dokumentacii dlya fajlov s ishodnym kodom na Si, nam nuzhny i analogichnye sredstva dlya komandnyh fajlov komandnogo processora. Raznica mezhdu izvlecheniem kommentariev iz koda na yazyke Si i ih izvlecheniem iz koda komandnyh fajlov komandnogo processora - v sposobe razgranicheniya kommentariev v ishodnom fajle. Ishodnyj fajl na Si ispol'zuet paru /* */, a komandnye fajly komandnogo processora primenyayut #, chtoby vydelit' ostatok stroki kak kommentarij. Obrabotka dokumentacii oblegchaetsya, kogda komandnye fajly sleduyut nekotoroj forme standartizovannoj dokumentacii. V dejstvitel'nosti net formal'nogo standarta, no naibolee blizkij standart prihodit so stranic rukovodstv po samoj sisteme UNIX. Standartnymi polyami yavlyayutsya imya ko- mandnogo fajla, sposob ego vyzova, chto on delaet i, vozmozhno, nekotorye pometki o tom, kak on rabotaet, ssylki na drugie mesta dlya poiska in- formacii i svedeniya o tom, kakie fajly ispol'zuet dannyj komandnyj fajl. Primer formata vyglyadit tak: : # IMYA # strips Izvlekaet polya shell-kommentariev # # FORMAT VYZOVA # strips fajl [...] # # AVTOR # Russ Sage mm/dd/yy # # OPISANIE # Dannyj komandnyj fajl izvlekaet kommentiruyushchie # zagolovki iz komandnyh fajlov interpretatora shell. # # SM. TAKZHE # sh(1), cat(1) Otmetim, chto v pervoj stroke imeetsya operator :, kotoryj yavlyaetsya dlya komandnogo processora nulevym operatorom. On nichego ne delaet, no vsegda vozvrashchaet uspeshnyj status vyhoda. On nahoditsya v otdel'noj stroke, poskol'ku eto oboznachaet komandnyj fajl dlya Bourne shell. Esli vy zapuskaete /bin/csh vmesto /bin/sh, komandnye fajly mogut vyzvat' putanicu. C Shell ishchet simvol # v pervoj kolonke pervoj stroki. Esli on tam est', komandnyj processor schitaet etot fajl komandnym fajlom in- terpretatora csh. CHtoby ukazat' interpretatoru csh, chto komandnyj fajl prednaznachen dlya interpretatora Bourne shell, my mozhem ostavit' etu stroku pustoj (chto budet ne slishkom horosho pechatat'sya i podlezhit udale- niyu) ili pomestit' operator, kotoryj soobshchaet interpretatoru C Shell, chto eto komandnyj fajl dlya Bourne shell, no nichego ne delaet pod uprav- leniem Bourne shell. CHTO DELAET strips? Strips chitaet komandnyj fajl i pechataet vse kommentarii s nachala fajla, kotorye yavlyayutsya nepreryvnymi (t.e. pechataet, poka ne dostignet stroki, ne yavlyayushchejsya kommentariem). Pervaya stroka ignoriruetsya, no pe- chataetsya. Kogda stroka ne imeet simvola # v pervoj simvol'noj pozicii, strips prekrashchaet chtenie etogo fajla. Komandnyj fajl dolzhen imet' strukturu kommentariya, analogichnuyu strukture, pokazannoj v nashem predydushchem primere. Simvoly # dolzhny byt' v pervoj pozicii, i kazhdaya stroka dolzhna imet' simvol #. Esli u vas est' pustaya stroka gde-nibud' v nachal'nom bloke kommentariev, strips pechataet tol'ko pervuyu chast' bloka.

    PRIMERY

1. $ strips `kind /bin /usr/bin` Bloki kommentariev izvlekayutsya iz tekstovyh fajlov, razmeshchennyh v katalogah /bin i /usr/bin. 2. $ find / -name "*.sh" -print | while read FILE > do > strips $FILE > /tmp/doc/$FILE > done Find porozhdaet spisok vseh imen fajlov, kotoryj popadaet v strips. Vyhod strips napravlyaetsya v katalog dokumentacii v /tmp. Okonchatel'nyj vyhod popadaet v fajl s tochno takim zhe imenem, kak ishodnyj fajl, tol'- ko vyhod pomeshchaetsya v /tmp, poetomu nikakih sluchajnyh udalenij ne pro- ishodit.

    POYASNENIYA

Stroki 4 i 14 okajmlyayut vneshnij cikl, kotoryj podaet imena fajlov dannomu komandnomu fajlu. Obrabotki ili proverki oshibok net. Poka v ko- mandnoj stroke est' fajly, cikl prodolzhaetsya. Vy mozhete, konechno, pro- verit' nalichie argumentov, pravil'nost' i sushchestvovanie fajlov. Dlya etogo, my dumaem, vy videli dostatochno primerov proverki oshibok, chtoby dobavit' ih, kuda vam nuzhno. Poetomu my inogda opuskaem takie fragmenty v nashem kode, chtoby sekonomit' mesto i vydelit' glavnuyu funkciyu. Stroka 6 primenyaet komandu cat k fajlu, kotoryj sejchas obrabatyva- etsya. Vyhod napravlyaetsya v konvejer, chtoby ego prochital drugoj shell. Novyj shell poluchaet dlinnuyu komandnuyu stroku (oboznachennuyu skobkami v strokah 6 i 13). Pervaya komanda read chitaet samuyu pervuyu stroku. Poskol'ku my ne sobiraemsya proveryat' etu stroku, my otobrazhaem ee, a zatem opuskaemsya v cikl posledovatel'nogo chteniya. Predpolagaetsya, chto pervaya stroka nachinaetsya s dvoetochiya, no esli ona nachinaetsya s simvola #, ona vse ravno pechataetsya, tak chto vy ne budete teryat' tekst. Stroki 7-13 yavlyayutsya vnutrennim ciklom while, chitayushchim stroki teksta so standartnogo vvoda, kotoryj byl vyhodom komandy cat. Kogda tekst zakanchivaetsya, prekrashchaetsya i cikl while. Stroki 9-12 - eto stroki prinyatiya resheniya. Snachala my otobrazhaem tekushchuyu vvodnuyu stroku i peredaem ee po konvejeru komande cut. Vyreza- etsya pervyj simvol, zatem komanda sravneniya proveryaet, sovpadaet li on s simvolom kommentariya. Esli da, stroka otobrazhaetsya na standartnyj vy- vod. Esli eto ne simvol kommentariya, to nuzhno dostich' konca bloka kom- mentariev, poetomu proishodit vyhod iz vnutrennego cikla. Upravlenie vozvrashchaetsya vo vneshnij cikl (for), kotoryj startuet i beret sleduyushchee imya fajla. Kogda vse fajly obrabotany, strips zavershaetsya. 4.3. ctags - sozdanie fajla priznakov ishodnogo koda proekta ------------------------------------------------------------ IMYA: ctags ------------------------------------------------------------ ctags Delaet fajl priznakov ishodnogo koda dlya prostoty dostupa s pomoshch'yu utility vi.

    FORMAT

ctags [fajl ...]

    PRIMER VYZOVA

ctags proj*.c Delaet fajl priznakov dlya vsego ishodnogo koda proekta. ISHODNYJ KOD DLYA ctags 1 : 2 # @(#) ctags v1.0 Create a C source code tag file Author: Russ Sage 4 awk -F'(' '/^[a-zA-Z_][a-zA-Z0-9_]*\(/ { 5 printf ("%s\t%s\t/^%s$/\n", $1, FILENAME, $0) }' $@ | sort -u +0 -1 PEREMENNAYA SREDY FILENAME awk Peremennaya, soderzhashchaya imya fajla. OPISANIE ZACHEM NAM NUZHEN ctags? UNIX sozdan kak sreda dlya razrabotki programmnogo obespecheniya. Ona podderzhivaet i pooshchryaet modul'nost' ishodnogo koda programmy. Modul'- nost' - eto koncepciya razbieniya proekta na otdel'nye fajly, prevrashcheniya idej v podprogrammy i kompilyacii otdel'nyh fajlov s ishodnym kodom v peremeshchaemye moduli dlya posleduyushchej ih sborki v ispolnyaemyj modul'. Takaya filosofiya razrabotki programmnogo obespecheniya mozhet, odnako, porodit' nekotorye problemy. Glavnaya problema - popytka poluchit' neko- torogo roda scepku iz vseh malen'kih kuskov golovolomki. Delayutsya vyzo- vy podprogramm, kotorye nahodyatsya v drugih fajlah, vozmozhno dazhe v dru- gih katalogah. Nuzhen instrument, pozvolyayushchij nam, lyudyam, posmotret' na programmnoe obespechenie chelovecheskim vzglyadom, t.e. soderzhatel'no, a ne s tochki zreniya fizicheskogo razmeshcheniya. |tot podhod chem-to analogichen chteniyu knigi v sravnenii s chteniem komp'yuternoj raspechatki. Raspechatka zastavlyaet vas delat' posledovatel'nyj prosmotr, a kniga dopuskaet prya- moj dostup (i obychno predostavlyaet oglavlenie i predmetnyj ukazatel' dlya poiska specificheskih punktov). Ctags preodolevaet etot razryv, sozdavaya fajl special'nogo forma- ta, kotoryj raspoznayut redaktory vi i ex. |tot fajl soderzhit "prizna- ki", kotorye mogut byt' ispol'zovany pri rabote s redaktorom dlya obespecheniya avtomaticheskogo dostupa k lyuboj nuzhnoj funkcii, ne trebuyu- shchego ot vas znanij o tom, v kakom fajle nahoditsya funkciya. Fakticheski, ctags predostavlyaet vam predmetnyj ukazatel' dlya grup- py fajlov s ishodnym kodom na yazyke Si. Kogda vy ob容dinyaete ego s re- daktorom, vy mozhete bystro najti lyubuyu funkciyu po izvestnomu vam imeni i posmotret' telo funkcii. |to znachit takzhe, chto vy mozhete legko kopi- rovat' i vstavlyat' funkcii v lyuboj ishodnyj fajl, s kotorym vy sejchas rabotaete. Esli redaktor ne imel vozmozhnosti raboty s priznakami ili my ne postroili instrumental'noe sredstvo, ispol'zuyushchee takoe preimushchestvo, to my dolzhny zapuskat' grep dlya imeni funkcii na nabore ishodnyh fajlov na Si (v nadezhde, chto u nas est' podhodyashchie fajly!), otmechat', kakoj fajl imeet trebuemuyu funkciyu, vhodit' v etot fajl redaktorom (vruchnuyu vvodya vse simvoly imeni fajla), a zatem nabirat' simvoly shablona po- iska. |to bol'shaya rabota, kotoraya mozhet zanyat' mnogo vremeni. Blagodarya ispol'zovaniyu vozmozhnosti raboty s priznakami, dlya fajla priznakov, iz- vlechennyh iz ishodnogo koda, vsya eta ruchnaya rabota sokrashchaetsya. |to sochetanie vozmozhnostej illyustriruet to, chemu ne chasto prida- etsya znachenie: vladel'cy UNIX vsegda nastorozhenno otnosyatsya k vozmozh- nosti ispol'zovat' preimushchestva mnogochislennyh sredstv, uzhe imeyushchihsya v takih programmah, kak vi ili ex. Zachastuyu ot 90 do 95 procentov neobho- dimyh vam vozmozhnostej uzhe imeyutsya, ozhidaya otnositel'no prostogo ko- mandnogo fajla interpretatora shell, svyazyvayushchego ih vmeste v moshchnyj novyj instrument. Ctags uzhe sushchestvuet v vide ispolnyaemogo modulya v sisteme Berkely (BSD) i v nyneshnej AT&T System V. On proishodit iz sistemy Berkely, no podderzhivaetsya teper' v System V. |to illyustraciya vzaimodejstviya mezhdu etimi dvumya istochnikami v mire UNIX, poskol'ku oni vzaimstvuyut poleznye idei drug u druga. Dannoe konkretnoe voploshchenie ctags yavlyaetsya komand- nym fajlom utility awk, imitiruyushchim ispolnyaemuyu programmu iz sistemy Berkely, a eto znachit, chto pol'zovateli sistem XENIX i predydushchih versij AT&T mogut teper' izvlech' pol'zu ot primeneniya ctags. Eshche odno preimushchestvo versii v vide komandnogo fajla v tom, chto ego mozhno legko modificirovat', chtoby obrabatyvat' drugie osobennosti yazyka Si. Takoe vy ne mozhete delat' s ispolnyaemym modulem, esli tol'ko u vas net doro- gostoyashchej licenzii na ishodnyj kod. CHTO DELAET ctags? Ctags prosmatrivaet fajly s ishodnym kodom na Si, peredannye v ko- mandnoj stroke, i pechataet spisok imen funkcij v kazhdom ishodnom fajle. Imena funkcij imeyut special'nyj sintaksis i dolzhny byt' imenno v takom formate, inache awk ne raspoznaet ih kak takovye. |ti pravila zaklyucha- yutsya v tom, chto imya funkcii dolzhno nahodit'sya v nachale stroki, sostoyat' iz razreshennyh simvolov i za nim dolzhna sledovat' levaya skobka. Probely v imeni funkcii ne dopuskayutsya. Vot primer modulya programmy na Si, po- davaemogo na rassmotrenie komandnomu fajlu ctags: main() { } func1(arg1,arg2) int arg1,arg2; { } func2(arg1,arg2)int arg1,arg2; { } Rezul'tat raboty ctags napravlyaetsya v standartnyj vyvod (na ek- ran), poetomu on dolzhen byt' perenapravlen, chtoby popast' v fajl. Vho- dom dlya ctags yavlyaetsya lyuboe chislo imen fajlov. Napomnim, chto esli na vhode imeetsya neskol'ko fajlov, to vyhod predstavlyaet soboj odin nepre- ryvnyj potok dannyh, popadayushchij v odin fajl. Esli vam nuzhen vyvodnoj fajl dlya kazhdogo vhodnogo fajla, to dlya upravleniya ctags mozhno prime- nit' takoj komandnyj fajl s ciklom: for F in *.c do ctags $F > $F.tags done Vyhod ctags sostoit iz treh polej v takom formate: priznak imya_fajla shablon_poiska Real'nyj vyhod dlya primera programmy na Si, privedennogo vyshe, byl by takim: main /usr/russ/src/program.c /^main()$/ func1 /usr/russ/src/program.c /^func1(arg1,arg2)$/ func2 /usr/russ/src/program.c /^func2(arg1,arg2)$/ Pervoe pole yavlyaetsya imenem priznaka (kotoroe sovpadaet s imenem funkcii). Vtoroe pole - marshrutnoe imya fajla, soderzhashchego dannuyu funk- ciyu. Tret'e pole - shablon poiska, ispol'zuemyj priznakovymi sredstvami redaktora dlya dostupa k funkcii vnutri fajla (bolee podrobno ob etom - pozzhe). Predpolozhim, vy mozhete sgenerirovat' pravil'nyj fajl priznakov. Kak soglasovat' fajl priznakov s redaktorami takim obrazom, chtoby vy mogli najti interesuyushchuyu vas funkciyu? Redaktor vi predostavlyaet mnogo putej dlya etogo. Pervyj sposob - pomestit' imya ispol'zuemogo fajla priznakov v fajl .exrc. (Fajl .exrc yavlyaetsya analogom fajla .profile dlya redaktora ex i rabotaet takzhe s redaktorom vi, chto ne udivitel'no, tak kak vi postroen na ex. Poskol'ku vi - naibolee populyarnyj redaktor sistemy UNIX, my primenyaem ego zdes' dlya nashih primerov.) Vy mozhete imet' fajl .exrc, kotoryj vyglyadit primerno tak: set tags=/usr/russ/mytags Vposledstvii, kogda vy obrashchaetes' k nekotoromu priznaku, ispol'- zuetsya dannyj fajl priznakov. Drugoj sposob - ustanovit' fajl priznakov posle togo, kak vy voshli v redaktor. CHtoby posmotret', kakim yavlyaetsya vash fajl priznakov po umolchaniyu, vvedite, nahodyas' v vi, sleduyushchee: :set tags |ta komanda pechataet fajl priznakov, o kotorom ona znaet. Dlya iz- meneniya opredelennogo v nastoyashchij moment fajla priznakov, ispol'zujte sintaksis, kotoryj byl v primere fajla .exrc: :set tags=/usr/russ/mytags Teper', kogda redaktor znaet, v kakom fajle iskat' priznaki, k ko- torym vy obrashchaetes', davajte rassmotrim, kak obrashchat'sya k priznaku (t.e. k imeni funkcii). Pervyj sposob - ob座avit' ego v komandnoj stroke pri vyzove redaktora. Naprimer: $ vi -t tag Esli vy uzhe nahodites' v redaktore vi, mozhete primenit' takuyu ko- mandu dlya poiska priznaka: :ta tag Dvoetochie oznachaet, chto my napravlyaemsya v ex, chtoby vypolnit' etot poisk. My prosim ex najti ukazannuyu stroku kak priznak, kotoryj razme- shchaetsya v tekushchem fajle priznakov. Kogda etot priznak najden v fajle priznakov, redaktor vi redaktiruet fajl s sootvetstvuyushchim imenem, koto- roe on beret iz polya 2. |to analogichno komande ":e imya_fajla". Kogda novyj fajl vnesen v bufer redaktora, poslednee pole fajla priznakov ispol'zuetsya v kachestve stroki shablona poiska. Sintaksis tochno takoj zhe, kak esli by vy nabirali ego vruchnuyu. Kursor peremeshchaetsya v poziciyu v fajle, kotoraya sootvetstvuet stroke poiska, pri etom vy popadaete na interesuyushchuyu vas funkciyu. VZAIMOSVYAZX MEZHDU ex I vi Neskol'ko otklonyayas' ot temy, rassmotrim dva fajla: /bin/ ex i /bin/vi. Nebol'shoe issledovanie obnaruzhivaet, chto na samom dele eto odin i tot zhe fajl. My mozhem proverit' eto, posmotrev na ih indeksnye opisateli fajlov. Vvedite takuyu komandu: $ ls -li `path ex vi` Vyhod pokazyvaet, chto dva chisla v pervoj kolonke odinakovy. 510 -rwx--x--t 5 bin bin 121412 Sep 19 1985 /bin/ex 510 -rwx--x--t 5 bin bin 121412 Sep 19 1985 /bin/vi |to chislo i est' indeksnyj opisatel' fajla (inode). Poskol'ku oba fajla yavlyayutsya odnim i tem zhe, vyzov lyubogo iz nih zapuskaet odin i tot zhe ispolnyaemyj modul'. Kakim obrazom on znaet, kak vy ego vyzvali? Programma smotrit na stroku argv[0] i vidit, kakoe imya vy ispol'zovali dlya vyzova fajla. Zatem redaktor ustanavlivaet svoj interfejs v soot- vetstvii s tem, kak vy ego vyzvali. Obratite vnimanie, chto eta programma imeet pyat' svyazej. Kak nam najti vse drugie imena, kotorymi mozhno vyzvat' vi i ex? My mozhem ispol'zovat' komandu sistemy UNIX ncheck. |ta komanda vosprinimaet in- deksnyj opisatel' fajla i pechataet vse fajly, imeyushchie takoj opisatel' fajla . Primery takih komand: $ ncheck -i 510 /dev/root $ ncheck -i 510 Pervyj sintaksis ukazyvaet komande ncheck iskat' fajly s inode, ravnym 510, tol'ko v kornevoj fajlovoj sisteme. Ncheck ogranichena po- iskom v odnoj fajlovoj sisteme. |to podkreplyaet tot fakt, chto fajly ne mogut byt' privyazany k razlichnym fajlovym sistemam, poskol'ku kazhdaya fajlovaya sistema nachinaetsya s inode 2 i posledovatel'no narashchivaetsya. Kazhdaya fajlovaya sistema imeet inode 510, kotoryj unikalen dlya kazhdoj fajlovoj sistemy. Vyhod predydushchej komandy vyglyadit tak: dev/root: 510 /bin/edit 510 /bin/ex 510 /bin/vedit 510 /bin/vi 510 /bin/view Esli fajlovaya sistema ne ukazana, kak vo vtorom primere, vypolnya- etsya poisk po vsem fajlovym sistemam, smontirovannym v nastoyashchee vremya. |to ne slishkom horosho dlya nas, poskol'ku pyat' svyazej vi dolzhny naho- dit'sya v odnoj i toj zhe fajlovoj sisteme. V protivnom sluchae fajly byli by svyazany poperek granic fajlovyh sistem. My uzhe mozhem skazat', chto nikakih fajlov redaktora net v kataloge /usr, razmeshchennom vo vtorom razdele diska ot kornevoj fajlovoj sistemy.

    PRIMERY

1. $ ctags *.c Generiruet fajl priznakov dlya vseh fajlov s ishodnym kodom na Si v tekushchem kataloge. Vyhod napravlyaetsya na ekran v otsortirovannom poryadke dlya kazhdogo fajla. Poryadok fajlov alfavitnyj, tak kak ukazano rasshire- nie fajla. Konechno, v bol'shinstve sluchaev vy zahotite perenapravit' vy- hod ctags v fajl. 2. $ ctags `Find /usr/src -name "*.c" -print` |tot sintaksis ispol'zuet komandnuyu podstanovku, chtoby najti vse imena fajlov, okanchivayushchiesya na .c i pomestit' ih v komandnuyu stroku. Problema v tom, chto esli najdeno slishkom mnogo fajlov, komandnaya stroka ctags mozhet perepolnit'sya i isportit' vsyu komandu. V zavisimosti ot ser'eznosti perepolneniya, ona mozhet isportit' i ves' vash process shell. 3. $ find /usr/src -name "*.c" -exec ctags {} \; > tags Nahodit vse ishodnye fajly na Si v segmente dereva /usr/src. Dlya kazhdogo podhodyashchego fajla zapuskaet programmu ctags na etom fajle. Ispol'zovanie takoj formy zapisi predotvrashchaet porchu vashej komandy (o kotoroj tol'ko chto shla rech'), a takzhe zapuskaet ctags dlya kazhdogo imeni fajla. Ves' vyhod pomeshchaetsya v fajl tags dlya posleduyushchego ispol'zova- niya. 4. $ find /usr/src -type f -print | sort | > while read FILE > do > ctags $FILE > done >> tags Ispol'zuya preimushchestvo mnozhestvennyh katalogov, nahodit i sortiru- et vse fajly iz kataloga /usr/src i pechataet ih marshrutnye imena v standartnyj vyvod. Zatem oni sortiruyutsya i postupayut po konvejeru v cikl while. Cikl while ispol'zuetsya dlya obsluzhivaniya skol' ugodno bol'- shogo chisla fajlov bez perepolneniya buferov. Vyhod cikla while dobavlya- etsya k odnomu fajlu - tags. |tot cikl gromozdkij i medlennyj, no on vy- polnyaet svoyu rabotu. 5. $ find /usr/src -print | ctags |to nepravil'nyj sposob ispol'zovaniya ctags. Vyhodom komandy find yavlyayutsya marshrutnye imena. Ctags chitaet standartnyj vvod, poskol'ku v komandnoj stroke net fajlov. Poluchaetsya, chto dannye, kotorye chitaet awk, yavlyayutsya marshrutnymi imenami ot find, kotorye ne imeyut korrektnyh polej dlya sootvetstviya shablonam funkcij. Nikakogo sopostavleniya ne pro- ishodit. Analogichnuyu problemu mogla by vyzvat' takaya komandnaya stroka: find /usr -print | wc -l Vy mogli by interpretirovat' eto tak: "poschitat', skol'ko strok imeetsya vo vseh fajlah kataloga /usr". No v dejstvitel'nosti zdes' ska- zano: "skol'ko imen fajlov imeetsya v drevovidnoj strukture /usr". Dlya podscheta obshchego kolichestva strok v etih fajlah nuzhen takoj sintaksis: find /usr -exec cat {} \; | wc -l kotoryj glasit: "najti vse fajly v /usr, raspechatat' kazhdyj iz nih, zatem poschitat', skol'ko strok v nih imeetsya". CHtoby tak zhe postu- pit' s ctags, nuzhen takoj sintaksis: find /usr/src -name "*.c" -exec cat {} \; | ctags V otlichie ot rezul'tata, kotoryj my poluchili by v predydushchih pri- merah: func1 /usr/russ/src/program.c /^func1(arg1,arg2)$/ func2 /usr/russ/src/program.c /^func2(arg1,arg2)$/ teper' vyhod budet vyglyadet' tak: func1 - /^func1(arg1,arg2)$/ func2 - /^func2(arg1,arg2)$/

    POYASNENIYA

Simvoly "-" vmesto imeni fajla poyavlyayutsya iz-za togo, chto ctags chitaet iz standartnogo vvoda. Awk avtomaticheski prisvaivaet svoej vnut- rennej peremennoj FILENAME znachenie "-", tak kak znaet, chto v komandnoj stroke ne bylo fajlov. Ves' komandnyj fajl est' programma awk. Vhodom dlya komandnogo faj- la utility awk yavlyaetsya $@, chto predstavlyaet vse pozicionnye parametry. Kazhdyj parametr schitaetsya imenem ishodnogo fajla na Si. Esli nikakie fajly ne peredayutsya v komandnoj stroke, awk ishchet dannye v standartnom vhodnom potoke, no eto sozdaet nekorrektnyj vyhod, tak kak peremennaya FILENAME v awk imeet po umolchaniyu znachenie "-". Poskol'ku awk trebuet imena fajlov, my dolzhny vyzyvat' ctags s imenami fajlov, a ne pereda- vat' emu dannye po konvejeru cherez standartnyj vvod, kak pokazano v predydushchem primere. Awk chitaet kazhdyj raz odnu stroku iz fajla dannyh i sveryaet ee s shablonom, pytayas' ustanovit' sootvetstvie. Dlya kazhdoj stroki, soot- vetstvuyushchej shablonu, awk vypolnyaet zadannuyu programmu. Pervoe, chto de- laet ctags,- izmenyaet podrazumevaemyj razdelitel' polej utility awk s probela na levuyu skobku. Blagodarya ispol'zovaniyu etogo simvola v ka- chestve razdelitelya polej, stroka opredeleniya funkcii razbivaetsya na dva polya: imya funkcii i ostatok stroki. SHablon poiska utility awk sootvetstvuet sintaksisu imeni Si-funk- cii. Ono mozhet nachinat'sya s simvolov a-z, A-Z ili simvola podcherkiva- niya. Dalee v imeni mogut byt' lyubye simvoly iz nabora a-z, A-Z, 0-9 i _. Mezhdu imenem i skobkoj nel'zya ispol'zovat' probely. Poisk nachinaetsya ot nachala stroki (^), za kotorym sleduet posledovatel'nost' dopustimyh simvolov (a-z, A-Z, 0-9), a zatem levaya skobka. Kogda stroka sootvetstvuet dannomu shablonu, generiruetsya vyhod s pomoshch'yu operatora printf. Pervoe pole - stroka, predstavlennaya obozna- cheniem $1. V dannom sluchae $1 - eto tol'ko imya funkcii, isklyuchaya levuyu skobku. Pechataetsya simvol tabulyacii, zatem sleduyushchaya stroka, kotoraya yavlyaetsya peremennoj FILENAME iz utility awk. |ta peremennaya dolzhna byt' poluchena iz komandnoj stroki, inache awk ne budet znat' imya fajla, v ko- torom razmeshchena dannaya funkciya, i fajl priznakov poteryaet informaciyu, neobhodimuyu dlya dostupa k fajlu, soderzhashchemu funkciyu. Pechataetsya eshche odna tabulyaciya, zatem stroka poiska. Strokoj poiska yavlyaetsya $0, chto predstavlyaet vsyu stroku, s kotoroj rabotaet awk. Stroke predshestvuet simvol ^, a za strokoj sleduet simvol $. Vyhod propuskaetsya po konvejeru cherez sort s toj cel'yu, chtoby vse priznaki shli v otsortirovannom poryadke. Opcii sortirovki ukazyvayut uti- lite sort proveryat' tol'ko pervoe pole i pechatat' tol'ko odno poyavlenie stroki, esli imeetsya neskol'ko zapisej. MODIFIKACII DLYA ctags Teper', kogda my znakomy s obshchim formatom redaktiruemogo fajla priznakov, mozhem li my primenit' ego dlya drugih poleznyh celej? My zna- em, chto my mozhem identificirovat' regulyarnye struktury v programmah na Sii sozdat' priznaki, s pomoshch'yu kotoryh mozhno poluchit' dostup k etim strukturam v redaktore. V programmah na Si imeyutsya ne tol'ko imena funkcij, no i drugie interesnye konstrukcii, naprimer imena struktur. Ih mozhno obsluzhivat' s pomoshch'yu modificirovannoj versii ctags. Edinstvennoe, chto nam nuzhno znat',- eto oficial'nyj sintaksis struktury dannyh. Struktura dannyh, kotoraya nas by zainteresovala, chasto imeet takoj format: struct name { int val1; char val2; }; Vse, chto my dolzhny sdelat',- eto zastavit' awk iskat' vse poyavle- niya opredeleniya struktury. Zatem my mozhem postroit' fajl priznakov, v kotorom priznakom yavlyaetsya imya struktury. |tot fajl, vidimo, budet ta- kim zhe, kak i prezhde, a stroka poiska budet obnaruzhivat' opredelenie struktury, a ne imya funkcii. Fakticheski, kombinaciya utility awk, priz- nakov i redaktora mozhet byt' ispol'zovana dlya lyubogo vida informacii, kotoruyu vy mozhete zahotet' hranit' v fajle special'nogo formata, napri- mer dlya adresov, zametok, bibliograficheskih ssylok i t.d. Vam prosto nuzhno podobrat' sootvetstvuyushchie razdeliteli i pravil'no ih ispol'zo- vat'. My nadeemsya, chto oblegchili soprovozhdenie vashih programm i predlo- zhili vam idei dlya drugih sposobov avtomaticheskoj obrabotki dokumenta- cii. Vy mozhete bez osobogo truda uchrezhdat' i podderzhivat' lokal'nye soglasheniya o dokumentacii s pomoshch'yu komandnyh fajlov, analogichnyh predstavlennym zdes'. Primerom proekta, za kotoryj vy mozhete vzyat'sya, yavlyaetsya soglasovanie nashih programm izvlecheniya informacii (stripf, stripc, strips) i drugih programm, kotorye vy pishete, takim obrazom, chtoby oni mogli chitat' fajl-formirovatel' (makefile, sm. Make(1)) i vy- davat' polnuyu dokumentaciyu po vsem ishodnym fajlam, uchastvuyushchim v dan- nom proekte.

    * GLAVA 5. UPRAVLENIE LICHNOJ INFORMACIEJ I: *

    UPRAVLENIE VREMENEM

    I DELOPROIZVODSTVOM

    UPRAVLENIE VREMENEM

at vypolnenie zadach v ukazannoe vremya b porozhdennyj shell fonovyh zadach greet svoevremennoe privetstvie s terminala lastlog soobshchenie vremeni poslednej registracii timelog uchet i statistika seansov raboty today pechat' kalendarya s otmechennoj tekushchej datoj

    UPRAVLENIE DELOPROIZVODSTVOM

jargon generator tehnicheskih terminov phone baza dannyh s telefonnymi nomerami office deloproizvoditel' UPRAVLENIE LICHNOJ INFORMACIEJ I:

    UPRAVLENIE VREMENEM

    I DELOPROIZVODSTVOM

    VVEDENIE

My uzhe mnogoe znaem o fajlah i o tom, kak upravlyat' fajlovoj strukturoj. Pora rassmotret', kak my mozhem ispol'zovat' sistemu UNIX dlya upravleniya mnozhestvom zadach, kotorye sostavlyayut nash rabochij den' i derzhat nas v kurse togo, chto delayut drugie pol'zovateli. Termin "up- ravlenie lichnoj informaciej" (personal management) podrazumevaet, chto vy hotite sozdat' svoyu sobstvennuyu PERSONALXNUYU rabochuyu sredu i instrumental'nye sredstva. My predlagaem vam paket programm, kotorye vy mozhete prisposobit' k vashim trebovaniyam. Fakticheski my v etoj i sleduyushchej glave predstavlyaem chetyre otdel'nyh nabora programm, kazhdyj iz kotoryh posvyashchen opredelennomu aspektu upravleniya lichnoj informaci- ej. Sredstva upravleniya vremenem pomogayut nam splanirovat' vypolnenie zadach komp'yuterom, a takzhe kontrolirovat' nashe lichnoe vremya. Upravle- nie deloproizvodstvom imeet delo s hraneniem i izvlecheniem informacii, a takzhe s organizaciej dostupa k razlichnym funkciyam sistemy UNIX posredstvom prostogo v ispol'zovanii interfejsa v vide menyu. Dlya kazhdoj iz etih oblastej deyatel'nosti my daem ee obzor, a za- tem predstavlyaem sootvetstvuyushchuyu gruppu sredstv.

    UPRAVLENIE VREMENEM

Poskol'ku sistema UNIX imeet vstroennye funkcii podderzhki vremeni i chasy, ona mozhet sledit' za vremenem. Ob容dinenie funkcij podderzhki vremeni s vozmozhnost'yu avtomaticheskogo zapuska gruppy komand oznachaet, chto my mozhem nastroit' ih tak, chtoby komp'yuter vypolnyal mnogie nashi rutinnye raboty, svyazannye so vremenem. My takzhe mozhem ispol'zovat' komp'yuter dlya otslezhivaniya nashego sobstvennogo vremeni. V dannom razdele predstavleny instrumental'nye sredstva at, b, greet, lastlog, timelog i today. Komandnyj fajl at daet nam vozmozhnost' skazat' mashine o tom, chto v ukazannoe vremya neobhodimo sdelat' to-to i to-to (vyvesti na ekran soobshchenie ili vypolnit' kakie-to drugie komandy). Zadacha zapuskaetsya v fonovom rezhime, tak chto my mozhem prodolzhat' druguyu rabotu, a fonovaya zadacha vypolnitsya avtomaticheski v ukazannoe vremya. |ta zadacha mozhet sostoyat' iz lyubyh razreshennyh v UNIX komand, poetomu ee vozmozhnosti ochen' gibkie. My prosto predlagaem nekotorye idei, svyazannye s ee ispol'zovaniem. Vtorym sredstvom yavlyaetsya komandnyj fajl b. |to obrabotchik fono- vyh zadach. Ochen' chasto pri porozhdenii fonovyh processov my ne mozhem uznat', kogda oni zakonchilis'. Dlya togo, chtoby eto opredelit', nam ne- obhodimo vruchnuyu prosmotret' tablicu processov ili najti kakoj-to inoj priznak togo, chto dannaya rabota zavershena. Komandnyj fajl b zapuskaet zadachu, upravlyaet operaciyami vvoda-vyvoda i zatem soobshchaet nam o tom, chto zadacha zavershena. Komandnyj fajl greet pokazyvaet, kakim obrazom perevodit' vnut- rennee vremya komp'yutera v bolee ponyatnye pol'zovatelyu kategorii. On razlichaet tri perida sutok (utro, den' i vecher) i reagiruet na nih sootvetstvuyushchimi soobshcheniyami. |to dovol'no prosto, no obespechivaet neplohoe osnovanie dlya podhoda k resheniyu drugih problem, svyazannyh so vremenem. Dalee my predstavlyaem dva sredstva, kotorye obrazuyut bazis siste- my upravleniya vremenem. Pri vypolnenii mnozhestva rabot nam neobhodimo podschitat' vremya, kotoroe my potratili na dannyj proekt, chtoby my mog- li vystavit' nashemu klientu sootvetstvuyushchij schet. Komandnyj fajl lastlog zapuskaetsya avtomaticheski, kogda vy registriruetes' v sisteme. Podderzhivaetsya baza dannyh, v kotoruyu kazhdyj raz zapisyvaetsya vremya vashej registracii dlya posleduyushchego analiza ili hraneniya zapisej. S etim instrumental'nym sredstvom sosedstvuet komandnyj fajl timelog. |to utilita, kotoraya vypolnyaet podschet vremeni. Ona mozhet sledit' za obshchim vremenem, zatrachennym na lyuboj ukazannyj proekt. Za- tem mozhno sgenerirovat' statistiku, kotoraya pokazyvaet, kogda i skol'- ko vremeni vy rabotali nad kazhdym proektom. Poslednee sredstvo, otnosyashcheesya ko vremeni - eto komandnyj fajl today. |to utilita, kotoraya izmenyaet vid vyhodnyh dannyh komandy UNIX cal. Ona pechataet obychnyj kalendar', tol'ko tekushchaya data vyvoditsya v inversnom vide. |to ochen' naglyadno. Vy mozhete razvit' etot instrument dlya togo, chtoby otmechat' prazdniki ili drugie osobye dni. ---------------------------------------------------- IMYA: at ---------------------------------------------------- at - vypolnit' komandu ili fajl v ukazannoe vremya

    NAZNACHENIE

Perevodit lyubuyu komandnuyu stroku v fonovyj rezhim i vypolnyaet ee v zadannoe vremya.

    FORMAT VYZOVA

at hr:min cmd [;cmd ...]

    PRIMER VYZOVA

at 12:00 echo "time for lunch!" V dvenadcat' chasov dnya vyvodit soobshchenie na ekran terminala. TEKST PROGRAMMY at 1 : 2 # @(#) tree v1.0 Execute command line at specific time Author: Russ Sage 2a Vypolnit' komandnuyu stroku v ukazannoe vremya 4 if [ $# -lt 2 ] 5 then echo "at: wrong arg count" >&2 6 echo "usage: at hr:min cmd [;cmd ...]" >&2 7 exit 1 8 fi 10 ITS=$1; shift 12 while : 13 do 14 TIME=`date | cut -c12-16` 16 if [ "$ITS" = "$TIME" ] 17 then eval $@ 18 exit 0 19 else sleep 35 20 fi 21 done &

    PEREMENNYE SREDY VYPOLNENIYA

ITS Vremya, v kotoroe sleduet vypolnit' ukazannye komandy TIME Tekushchee vremya v sisteme OPISANIE ZACHEM NAM NUZHEN at? Na protyazhenii rabochego dnya my vypolnyaem mnogo nebol'shih rabot, kotorye nuzhno delat' cherez razlichnye intervaly vremeni. Nekotorye veshchi prosto dolzhny byt' sdelany odin raz v lyuboe vremya, togda kak drugie dolzhny delat'sya v opredelennoe vremya kazhdyj den'. Naprimer, vam mozhet ponadobit'sya zapuskat' proceduru kopirovaniya fajlov kazhduyu noch', vho- dit' v druguyu sistemu raz v den' i proveryat' pochtu ili soobshcheniya pol'- zovatelej seti po zadannoj teme raz v neskol'ko dnej. Komandnyj fajl at predostavlyaet mehanizm dlya vypolneniya zadach, svyazannyh so vremenem. My mozhem skazat' sisteme, chto i kogda my hotim sdelat'. Zadacha ostaetsya "spyashchej" v fonovom rezhime do naznachennogo vremeni. |to daet nam vozmozhnost' prevratit' komp'yuter v budil'nik, sekretarya, administratora vstrech i t.d. Dannaya koncepciya ne nova i uzhe sushchestvuet v sisteme Berkeley UNIX pod tem zhe imenem. Ona realizovana takzhe v poslednih versiyah System V. Pochemu zhe togda my predstavlyaem zdes' nashu sobstvennuyu versiyu? Odna iz prichin v tom, chto mnogie iz vas imeyut bolee rannie versii UNIX, v kotoryh eto sredstvo otsutstvuet. No vazhnee, vidimo, drugoe - nasha cel' ne v tom, chtoby sdelat' sushchestvuyushchie komandy at ustarevshimi, a v pokaze togo, kak legko otslezhivat' vremya i realizovyvat' obrabot- ku, svyazannuyu so vremenem. Imeya nashu sobstvennuyu komandu at, my mozhem nastroit' ee po svoemu vkusu i izmenit' ee, kogda neobhodimo. Komanda at, predstavlennaya zdes', fakticheski bolee gibkaya, chem at v sisteme Berkeley, hotya v pervoj otsutstvuyut nekotorye osobennosti vtoroj. Ona bolee gibkaya potomu, chto vy mozhete pomestit' nastoyashchie komandy v fono- vuyu zadachu at, v to vremya kak dlya at v sisteme Berkeley vy dolzhny ispol'zovat' imya komandnogo fajla interpretatora shell. Metod Berkeley zapreshchaet vam vyzyvat' ispolnyaemye moduli neposredstvenno v komandnoj stroke, a nasha at - net. (Konechno, vy mozhete s takim zhe uspehom ispol'zovat' komandnye fajly interpretatora shell, esli vam eto neob- hodimo.) CHTO DELAET at? Komanda at daet nam vozmozhnost' sobirat' neskol'ko komand v odno celoe i vposledstvii zapuskat' ih. Kogda oni vypolnyayutsya, ih vyvod mo- zhet libo idti na ekran, libo perenapravlyat'sya v opredelennyj fajl. Komandnaya stroka prinimaet dva parametra: vremya vypolneniya i ko- mandnuyu stroku, kotoruyu sleduet vypolnit'. Vremya vyrazheno v formate chas:minuta. CHas dolzhen byt' ukazan strokoj iz dvuh cifr (v diapazone ot 0 do 23 chasov), tak kak ego ispol'zuet komanda date. Ispol'zovanie togo zhe standarta, chto i v komande date, znachitel'no uproshchaet komandu at. V kachestve vtorogo parametra mozhet byt' lyubaya komanda, kotoruyu obychno mozhno vvesti v komandnoj stroke interpretatora shell. Mozhno takzhe ispol'zovat' konvejery, sostavnye komandy i perenaznacheniya. Net ogranichenij na to, kakaya komanda mozhet byt' vypolnena. Komanda at mo- zhet zapustit' obychnyj ispolnyaemyj modul' UNIX ili vash sobstvennyj ko- mandyj fajl. Vyhod at po umolchaniyu napravlyaetsya v standartnyj vyvod. Standart- nym vyvodom v dannom sluchae yavlyaetsya ekran terminala. Komanda at v sisteme Berkeley ne imeet vyvoda po umolchaniyu, chto neskol'ko zatrudnya- et poluchenie rezul'tata i otpravku ego na ekran. Komanda at vsegda zapuskaetsya kak fonovaya zadacha. Necelesoobrazno zapuskat' ee v prioritetnom rezhime, gde ona blokiruet terminal na vse vremya svoego vypolneniya. Prebyvaya v fonovom rezhime, at osvobozhdaet resursy, no vse zhe rabotaet dlya vas. Mezhdu prochim, otmetim, chto kogda processy stavyatsya v fonovyj rezhim iznutri komandnogo fajla, identifi- kator processa ne pechataetsya na ekran, kak eto proishodit, kogda pro- cessy zapuskayutsya v fonovom rezhime s klaviatury. Porozhdenie bol'shogo kolichestva fonovyh processov mozhet imet' ot- ricatel'nyj effekt dlya sistemy. Kazhdaya fonovaya zadacha - eto cikl while interpretatora shell, kotoryj rabotaet ochen' medlenno. Kogda mnogo fo- novyh processov, malo vremeni central'nogo processora ostaetsya na dru- gie celi. V rezul'tate proizvoditel'nost' sistemy uhudshaetsya. V bol'- shih sistemah eto, veroyatno, ne problema, esli tol'ko sistema ne zagru- zhena mnozhestvom pol'zovatelej, no vy dolzhny ispol'zovat' eto sredstvo s ostorozhnost'yu. Otmetim, chto format chas:minuta goditsya tol'ko dlya odnogo polnogo dnya. Dannaya programma at zadumana kak ezhednevnaya i ne imeet sredstv zapuska v opredelennyj den' ili mesyac, hotya vy mozhete legko rasshirit' ee, kak tol'ko pojmete, kak chitaetsya i ispol'zuetsya informaciya o vre- meni.

    PRIMERY

1. $ at 11:45 echo ^G^G It's almost lunch time Bez pyatnadcati minut dvenadcat' dvazhdy vydaetsya zvukovoj signal (control-G) i vyvoditsya soobshchenie o lenche. 2. $ at 10:45 "if [ -s $MAIL ]; then echo ^G You have mail; fi" Bez pyatnadcati odinnadcat' proveryaetsya, sushchestvuet li moj pochto- vyj fajl i est' li v nem hotya by odin simvol ($MAIL est' /usr/spool/mail/russ). Esli eto tak, vydaetsya zvukovoj signal i soob- shchenie o tom, chto u menya est' pochta. 3. $ at 17:00 "c; date; banner ' time to' ' go home'" V pyat' chasov vechera ochishchaetsya ekran (s pomoshch'yu komandy c, opisan- noj dalee v dannoj knige), pechataetsya data i vyvoditsya krupnymi bukva- mi na ves' ekran soobshchenie "time to go home" ("pora domoj"). S pomoshch'yu apostrofov v komandnoj stroke banner my mozhem dobit'sya vyvoda simvola vozvrata karetki, chtoby razmestit' kazhdyj nabor slov v otdel'noj stro- ke. Esli kakaya-libo iz etih komand ne srabatyvaet (naprimer, ne najde- na komanda c), to i ves' fonovyj process okanchivaetsya neudachej.

    POYASNENIYA

Prezhde vsego at proveryaet, pravil'no li ona byla vyzvana. Stroki 4-8 delayut proverku oshibok. V komandnoj stroke dolzhny prisutstvovat' po krajnej mere dva parametra: vremya i komanda. Esli eto tak, to schet- chik pozicionnyh parametrov raven 2. Esli etot schetchik men'she 2, proi- zoshla oshibka. V standartnyj fajl oshibok posylayutsya soobshcheniya ob oshibke s pomoshch'yu pereadresacii v fajlovyj deskriptor 2. Peremennaya interpretatora shell ITS inicializiruetsya v stroke 10. V nej ustanavlivaetsya znachenie pervogo pozicionnogo parametra ($1), kotorym yavlyaetsya chas:minuta. Kak tol'ko my zanesli eto znachenie v pe- remennuyu, ono bol'she ne nuzhno nam v komandnoj stroke. Komanda shift udalyaet $1 iz komandnoj stroki. Teper' komandnaya stroka sostoit iz vy- zyvayushchej komandy $0 (t.e. samoj at) i ostatka stroki ($@ ili $*). Vy- zyvayushchaya komanda ne vychislyaetsya kak chast' ostatka stroki, poetomu vam ne nuzhno zabotit'sya ob argumente $0. Dalee at perehodit k vechnomu ciklu while v strokah 12-21. Vechnym etot cikl delaet komanda : (dvoetochie). |to vstroennaya komanda interp- retatora shell, kotoraya nichego ne delaet krome togo, chto vsegda vozv- rashchaet uspeshnyj status vyhoda, zastavlyaya tem samym cikl prodolzhat'sya. Komanda true interpretatora shell ochen' pohozha i delaet programmu bo- lee naglyadnoj. My zhe ispol'zuem : vmesto true, chtoby sokratit' izderzh- ki na porozhdenie processa dlya kazhdoj iteracii cikla. Komanda : vstroe- na v sam shell. True, naprotiv, yavlyaetsya vneshnej komandoj v kataloge bin (tak zhe, kak ls), ona dolzhna byt' najdena po fajlovomu puti, vy- polnit'sya i vernut' znachenie. |to zanimaet gorazdo bol'she processorno- go vremeni. Na kazhdoj iteracii cikla tekushchee vremya sveryaetsya s naznachennym vremenem, peredannym iz komandnoj stroki. Tekushchee vremya izvlekaetsya iz komandy date v stroke 14. Obychno date vydaet rezul'tat v takom forma- te: ---------------------------- | | Mon Mar 31 06:54:25 PST 1986 | | Poskol'ku eto stroka fiksirovannogo razmera, my mozhem poschitat' nomera pozicij, v kotoryh razmeshcheny chas i minuta. Dannye chas:minuta nahodyatsya v poziciyah 12-16. Dlya polucheniya etih simvolov my zapuskaem komandu date, propuskaem ee rezul'tat po konvejeru cherez cut i vyreza- em nuzhnye pozicii. Ves' rezul'tat prisvaivaetsya peremennoj TIME. Zame- tim, chto pole sekund ne ispol'zuetsya. Naimen'shaya edinica vremeni v etoj programme - minuta. Vse volshebstvo dannoj komandy zaklyucheno v strokah 16-20. Esli vremya, ukazannoe v komandnoj stroke, ravno tekushchemu vremeni (stroka 16), vychislit' i vypolnit' ostal'nye argumenty komandnoj stroki (stro- ka 17), zatem vyjti s uspeshnym nulevym znacheniem (stroka 18). Esli vremya ne sovpalo, nemnogo pospat' (stroka 19) i povtorit' vse snachala. Simvol & v konce cikla v stroke 21 prevrashchaet ves' cikl while v fonovyj process. Kak my mozhem ubedit'sya, chto shell vypolnyaet vse svoi komandy v fonovom rezhime i nikakie iz nih ne vypolnyaet v operativnom rezhime? V dejstvitel'nosti my ne mozhem etogo sdelat'. My dolzhny pola- gat', chto shell tak rabotaet. Poskol'ku mnogoe pri programmirovanii na shell delaetsya ishodya iz opyta i intuicii, vam prihoditsya ispytyvat' mnogie veshchi, chtoby uvidet', kak oni rabotayut. Periodicheski shell pre- podnosit syurprizy i delaet nechto sovershenno neozhidannoe.

    ISSLEDOVANIYA

CHto by sluchilos', esli by vy postavili zadanie at v fonovyj re- zhim, a zatem vyshli iz sistemy? Otvet zavisit ot togo, s kakim shell vy rabotaete. Esli u vas Bourne shell, to vvod komandy control-D pri vy- hode iz sistemy prekrashchaet vypolnenie vseh vashih fonovyh zadach. Edinstvennyj sposob ostavit' v zhivyh fonovye zadachi posle vyhoda iz sistemy - ispol'zovat' komandu nohup ("no hang up" - "ne kaznit'"). Nohup obespechivaet, chto vse signaly o prekrashchenii processa ne dostiga- yut dannogo processa. Ne poluchaya signal o prekrashchenii vypolneniya, pro- cess dumaet, chto vy vse eshche nahodites' v sisteme. Sintaksis vyglyadit tak: nohup at 13:00 echo "back from lunch yet?" Esli vy zapuskaete Si-shell, vse fonovye processy prodolzhayutsya posle vashego vyhoda iz sistemy. Prichina v tom, chto Si-shell perevodit vse svoi fonovye zadachi v sostoyanie zashchity ot prekrashcheniya vypolneniya. |tot process avtomaticheskij, i ego ne nuzhno ukazyvat' yavno. Vy, vozmozhno, udivleny tem, chto v stroke 17 ispol'zovana komanda "eval $@". |to sformirovalos' metodom prob i oshibok. Na nachal'nyh eta- pah razrabotki at komanda "$@" ispol'zovalas' sama po sebe. Pri sa- mostoyatel'nom primenenii eta komanda oznachaet "vypolnit' vse pozicion- nye parametry". Poskol'ku eto byla edinstvennaya komanda, vypolnyalas' vsya stroka pozicionnyh parametrov, posle chego voznikali problemy. Ispol'zovanie perenaznachenij i peremennyh interpretatora shell sil'no zaputyvalo at. Dlya illyustracii rassmotrim paru primerov. Esli my zapuskaem at s komandnoj strokoj at 09:30 echo $HOME to vse vrode by rabotaet. Snachala raskryvaetsya peremennaya $HOME, zatem echo pechataet ee znachenie - /usr/russ. No esli my zapuskaem komandnuyu stroku at 09:30 echo \$HOME to peremennaya ne raskryvaetsya i echo fakticheski pechataet $HOME vmesto znacheniya peremennoj $HOME. My izbezhali etogo prosto s pomoshch'yu komandy eval dlya povtornogo vychisleniya komandnoj stroki pered ee vypolneniem. Sushchestvo problemy v tom, chto vyzyvayushchij interpretator shell ne raskry- vaet znachenie peremennoj, poetomu my zastavlyaem vypolnyayushchijsya shell povtorno analizirovat' komandnuyu stroku i vychislyat' vse peremennye. Na etot raz znacheniya peremennyh raskryvayutsya, i my poluchaem vernyj konech- nyj rezul'tat.

    MODIFIKACII

Vozmozhno, vy zahotite bolee podrobno rassmotret' interfejs so vremenem. V nyneshnem sostoyanii at vosprinimaet tol'ko vremya v predelah ot 0 do 23 chasov v techenie odnogo dnya. Neplohim dopolneniem bylo by zastavit' ego razlichat' vremya sutok, t.e. 8:30 a.m. (do poludnya) ili 8:30 p.m. (posle poludnya). Bylo by neploho takzhe imet' vozmozhnost' skazat' "cherez 10 minut sdelat' to-to i to-to". V etom sluchae komanda mogla by imet' primerno takoj vid: at -n 10 echo "do in now plus 10 minutes" gde -n bylo by tekushchim vremenem, a 10 dobavlyalos' by k nemu. Drugoj ochevidnoj oblast'yu modifikacii yavlyaetsya nadelenie at voz- mozhnost'yu zapominaniya periodov vremeni, prevyshayushchih sutki. |to mozhet byt' zavtrashnij den', opredelennyj den' ili dazhe opredelennyj mesyac. Rabota s opredelennym mesyacem mozhet byt' ne sovsem real'noj, poskol'ku komandnyj fajl, vypolnyaemyj v fonovom rezhime v techenie neskol'kih mesyacev, potrebuet gromadnogo kolichestva processornogo vremeni, a tak- zhe hraneniya postoyanno vozrastayushchego schetchika identifikatorov pro- cessov, chto dast, veroyatno, pol'zovatelyam iskazhennoe predstavlenie ob aktivnosti sistemy. Po dostizhenii maksimal'nogo nomera processa, snova vernutsya mladshie nomera, tak chto eto ne privedet k kakim -libo ser'ez- nym posledstviyam. Reshenie voprosa o tom, stoit li takoj cenoj dosti- gat' vashej celi, zavisit ot togo, schitaete li vy, chto vashi trebovaniya izlishne zagruzhayut sistemu. ------------------------------------------------------------- IMYA: b -------------------------------------------------------------- b Obrabotchik fonovyh zadach

    FORMAT VYZOVA

b any_command_with_options_and_arguments (lyubaya komanda s opciyami i argumentami)

    PRIMER VYZOVA

b cg f.c Kompilirovat' ishodnyj fajl v fonovom rezhime, gde cg - komandnaya stroka kompilyatora, opisannaya v glave 10. TEKST PROGRAMMY b 1 : 2 # @(#) b v1.0 Background task handler Author: Russ Sage 2a Obrabotchik fonovyh zadach 4 ($@; echo "^G\ndone\n${PS1}\c") & OPISANIE ZACHEM NAM NUZHEN b? Kak vy videli v poslednem razdele, Bourne shell daet vozmozhnost' zapuskat' zadachi v fonovom rezhime vypolneniya. |to delaet simvol &. CHto zhe na samom dele proishodit, kogda my zapuskaem chto-nibud' v fonovom rezhime? Porozhdaetsya eshche odin shell, kotoryj dolzhen vypolnit' svoyu sobstvennuyu komandnuyu stroku. Posle togo, kak vse ego komandy vypol- nyatsya, on zavershaetsya. Vy mozhete opredelit' fonovye zadachi po rezul'- tatu raboty komandy ps. |ti zadachi vyglyadyat kak interpretatory shell, zapushchennye s vashego terminala, odnako ih vladel'cem, ili roditel'skim processom v dejstvitel'nosti yavlyaetsya komanda init, a ne vash registra- cionnyj shell (eto spravedlivo tol'ko dlya shell, k kotorym primenena komanda nohup). Interpretatory shell, k kotorym ne primenyalas' nohup, prinadlezhat vashemu registracionnomu shell. Nizhe privoditsya primer raspechatki komandy ps dlya fonovyh zadach. Komandoj dlya vypolneniya v fo- novom rezhime byla: while :;do date; done & Komanda ps pokazyvaet moj registracionnyj shell (PID=32), vveden- nuyu mnoj komandnuyu stroku dlya vypolneniya v fonovom rezhime (PID=419) i shell, kotoryj vypolnyaet cikl while (PID=449). ----------------------- | | UID PID PPID C STIME TTY TIME COMMAND | | root 0 0 0 Dec 31 ? 0:03 swapper | root 1 0 0 Dec 31 ? 0:02 /etc/init | russ 32 1 0 14:18:36 03 1:26 -shV | russ 419 32 0 15:30:31 03 0:02 -shV | russ 449 419 2 15:30:31 03 0:02 -shV | Nizhe priveden listing komandy ps, kotoryj pokazyvaet fonovyj shell, prinadlezhashchij processu init. On byl poluchen komandoj "b ps -ef", gde b - utilita, kotoraya budet rassmotrena dalee. Kak vidite, poslednij process 471 est' fonovyj shell, prinadlezhashchij processu 1, kotorym yavlyaetsya init, a ne moj registracionnyj shell (PID=32). ------------------------- | | UID PID PPID C STIME TTY TIME COMMAND | root 0 0 1 Dec 31 ? 0:04 swapper | root 1 0 0 Dec 31 ? 0:02 /etc/init | russ 32 1 1 14:18:36 03 1:30 -shV | russ 472 471 5 15:46:46 03 0:12 ps -ef | russ 471 1 0 15:46:46 03 0:00 -shV | K chemu vse eto privodit? Kogda my ispol'zuem fonovye zadachi, my dolzhny mirit'sya s "nerazborchivost'yu" pri upravlenii asinhronnymi pro- cessami. Kakovy eti nedostatki? Vo-pervyh, my nikogda ne znaem momenta zaversheniya fonovyh zadach. Edinstvennyj sposob opredelit' moment zaversheniya takih zadach - prover- ka rezul'tatov v kakom-libo fajle ili nekotoroj raboty, vypolnennoj zadachej, ili ispol'zovanie komandy ps i postoyannoe slezhenie za tem, kogda process zavershitsya. Takoe slezhenie pri pomoshchi komandy ps - ne samyj luchshij sposob, poskol'ku ps zanimaet mnogo processornogo vremeni i ochen' medlenno rabotaet. Vtoroj neakkuratnyj moment - eto simvol priglasheniya posle vydachi na vash ekran rezul'tata iz fonovoj zadachi. Posle togo kak vydan re- zul'tat iz fonovoj zadachi, vash registracionnyj shell ozhidaet vvoda ko- mandy, no priglasheniya mozhet i ne byt', poskol'ku ono bylo udaleno s ekrana nekotorym drugim soobshcheniem. Vy mozhete ozhidat' priglasheniya ce- lyj den', no ono nikogda ne poyavitsya, poskol'ku ono uzhe bylo vyvedeno na ekran. Vy prosto dolzhny znat', chto shell zhdet vashu komandu. Nam neobhodimo instrumental'noe sredstvo, kotoroe soobshchaet nam o zavershenii fonovoj zadachi, a takzhe vosstanavlivaet nash ekran posle vy- dachi na nego kakih-libo rezul'tatov. Mozhem li my skazat', vypolnyala li vyvod na ekran fonovaya zadacha ili net? Net, poetomu my dolzhny zhestko zaprogrammirovat' vosstanovlenie ekrana v programme. CHTO DELAET b? Komandnyj fajl b - eto mehanizm, kotoryj pomogaet v vypolnenii fonovyh zadach. On zapuskaet nashi fonovye zadachi. Po zavershenii on otobrazhaet na ekran slovo "done" i zatem povtorno vyvodit simvol-prig- lashenie shell. Dannoe sredstvo ne imeet opcij i proverki na nalichie oshibok. Ob- rabotchik fonovyh zadach fakticheski vypolnyaet komandnuyu stroku, kotoruyu my emu peredaem, i posleduyushchuyu obrabotku. Otmetim, chto dlya vydachi na ekran vashego simvola priglasheniya, vy dolzhny eksportirovat' peremennuyu PS1 iz vashej tekushchej sredy. |to mozhet soblyudat'sya ne na vseh mashinah, poskol'ku kazhdaya sistema UNIX imeet svoi osobennosti. V sisteme XENIX peremennaya PS1 ne peredaetsya, vozmozhno iz-za togo, chto eto shell, ko- toryj vyzyvaet drugoj shell v fonovom rezhime. Esli vy skazhete "sh" v interaktivnom rezhime, on budet peredan kak priglashenie. Sistema UNIX tak prekrasna i udivitel'na!

    PRIMERY

1. $ b ls -R .. Nachinaya s roditel'skogo kataloga, rekursivno sostavlyaetsya spisok vseh fajlov i vyvoditsya na ekran. Obratite vnimanie, chto pri ispol'zo- vanii fonovyh zadach vy ne mozhete effektivno peredat' vse eto po konve- jeru komande more, poskol'ku obychnym vhodnym ustrojstvom dlya fonovyh zadach yavlyaetsya /dev/null. Komanda more ne rabotaet normal'no, kogda ee vyzyvayut iz fonovogo rezhima. |to takzhe imeet smysl, poskol'ku vy mogli by imet' dve zadachi - odnu v fonovom rezhime, a druguyu v prioritetnom - proizvodyashchie besporyadok na ekrane. Fonovaya komanda more dolzhna byla by sohranyat' v neprikosnovennosti to, chto vyvodit na ekran prioritetnaya komanda. 2. $ b echo hello > z Fajl z soderzhit ne tol'ko slovo "hello", no takzhe i soobshchenie "done", poskol'ku pereadresaciya v fajl z vypolnyaetsya vo vneshnem shell. Pereadresaciya dlya podzadachi dolzhna byt' vypolnena v kruglyh skobkah programmy b, a my v dannom sluchae ne mozhem etogo sdelat'. 3. $ b sleep 5; echo hello |ta komandnaya stroka ne mozhet byt' vypolnena, poskol'ku programma b vosprinimaet tol'ko komandu sleep. Komanda echo ne pomeshchaetsya v fo- novyj process i srazu zhe vypolnyaetsya. 4. $ b "sleep 5; echo hello" |tu komandnuyu stroku my tozhe ne mozhem vypolnit', poskol'ku eti dve komandy budut vosprinyaty komandnym fajlom b kak odna. Zatem koman- da sleep ne vypolnitsya, poskol'ku "5; echo hello" yavlyaetsya nedopusti- mym ukazaniem vremennogo perioda dlya komandy sleep.

    POYASNENIYA

Obratite vnimanie, chto v stroke 4 vsya struktura komandy zaklyuchena v kruglye skobki, za kotorymi sleduet simvol &. Kruglye skobki pereda- yut vsyu strukturu podchinennomu shell, kotoryj zatem pomeshchaetsya v fono- vyj rezhim vypolneniya. Pomeshchaya vse komandy v odin shell, my garantiruem vyvod na ekran slova "done" posle zaversheniya poslednego processa. Dannaya komandnaya stroka vypolnyaetsya s pomoshch'yu simvolov $@. |to oznachaet: "vypolnit' vsyu komandnuyu stroku, raspolozhennuyu sprava". Poskol'ku vyrazhenie $@ vypolnyaet samo sebya (t.e. ne v operatore echo ili v chem-libo podobnom), to shell prosto vypolnyaet komandy ishodnoj komandnoj stroki. |to imenno to, chto my hotim! Obratite vnimanie, chto zdes' net nikakogo operatora eval. Poskol'ku to, chto my delaem, pohozhe na svoego roda "komandnyj interpretator strok" dlya ih vvoda i ispolne- niya, vy mogli by podumat', chto komanda eval zdes' neobhodima. Po opytu my znaem, chto eto ne tak. Pohozhe, chto primenenie eval uslozhnit delo. Dazhe nash staryj test, ispol'zuyushchij peremennye sredy vypolneniya, rabo- taet. Po komande b echo $HOME na ekran budet vydano soobshchenie /usr/russ Kogda vsya komanda vypolnitsya, podaetsya zvukovoj signal i vyvo- ditsya soobshchenie, informiruyushchee pol'zovatelya o tom, chto operaciya zaver- shilas'. Poskol'ku eto soobshchenie nakladyvaetsya na to, chto bylo na ekra- ne, to pereotobrazhaetsya nachal'nyj simvol priglasheniya (PS1). |to delaet normal'nym vid ekrana v tom smysle, chto simvol priglasheniya shell soob- shchaet ob ozhidanii vvoda. --------------------------------------------------------- IMYA: greet --------------------------------------------------------- greet Svoevremennoe privetstvie s terminala

    NAZNACHENIE

Opredelenie vremeni sutok i pechat' privetstviya i kakogo-libo soobshcheniya na terminal v zavisimosti ot vremeni dnya.

    FORMAT VYZOVA

greet

    PRIMER VYZOVA

greet Vyzyvaet komandnyj fajl greet, kotoryj opredelyaet vremya i pechataet sootvetstvuyushchee soobshchenie. TEKST PROGRAMMY greet 1 : 2 # @(#) greet v1.0 Timely greeting from the terminal Author: Russ Sage 2a Svoevremennoe privetstvie s terminala 4 if [ `expr \`date +%H\` \< 12` = "1" ] 5 then echo "\nGood morning.\nWhat is the best use of your time right now?" 6 elif [ `expr \`date +%H\` \< 18` ="1" ] 7 then echo "\nGood afternoon.\nRemember, only handle a piece of paper once!" 8 else echo "\nGood evening.\nPlan for tomorrow today." 9 fi OPISANIE ZACHEM NAM NUZHEN greet? Odnim iz zamechatel'nyh preimushchestv mnogopol'zovatel'skih operaci- onnyh sistem yavlyaetsya to, chto oni imeyut horosho razvituyu koncepciyu vre- meni. Obychno oni soderzhat chasy real'nogo vremeni i nekotoroe programm- noe obespechenie, kotoroe manipuliruet s nimi. Odnako vsegda est' mesto dlya dopolnitel'nogo programmnogo obespecheniya, rabotayushchego so vremenem. Takie sredstva mogut byt' napisany kak na yazyke Si, tak i na shell-yazyke. Kak my izvlekaem i vydelyaem vremya s pomoshch'yu komandnogo fajla in- terpretatora shell? Dostupno mnogo sposobov, no standartnaya komanda UNIX date, vidimo, yavlyaetsya nailuchshim sposobom. V sluchae yazyka Si vy dolzhny programmno upravlyat' preobrazovaniem vremeni i vremennymi zona- mi. Komanda date delaet eto dlya vas. Vazhna takzhe edinica vremeni. Dolzhny li my razlichat' sekundy, mi- nuty, chasy, dni ili nedeli? |to vse zavisit ot trebuemogo prilozheniya. V nashem prostom primere my razlichaem tol'ko tri chasti sutok: utro, den' i vecher. My opredelili eti periody tak: s polunochi do poludnya, ot poludnya do shesti chasov i ot shesti chasov do polunochi sootvetstvenno. CHTO DELAET greet? Greet - eto utilita, kotoraya privetstvuet pol'zovatelya razlichnymi soobshcheniyami v zavisimosti ot vremeni sutok. Vyvodimye soobshcheniya ne tak vazhny. Oni v osnovnom ispol'zovany kak primery, pokazyvayushchie, kak mo- gut byt' vypolneny kakie-to komandy. Esli vy rabotaete v odinochestve i hoteli by poboltat', eti soobshcheniya mogli by chitat'sya periodicheski iz sootvetstvuyushchih fajlov dlya sozdaniya illyuzii avtomaticheskoj pis'mennoj boltovni v zavisimosti ot vremeni sutok. Dejstvitel'noj zhe cel'yu yavlyaetsya sozdanie karkasa programmy, ko- toraya mozhet pereklyuchat'sya v zavisimosti ot parametrov vremeni. Putem rasshireniya koncepcii vremeni vy mozhete sozdat' drugie utility, kotorye znayut, kogda im rabotat' (v kakoj promezhutok vremeni) i mogut vesti sebya inache v sootvetstvii so vremenem. Greet ne trebuet nichego v komandnoj stroke. Ne vypolnyaetsya nika- koj proverki na nalichie oshibok, poetomu i net v programme sintaksi- cheskoj podskazki. Vyhod komandy greet mozhet byt' pereadresovan v fajl ili peredan po konvejeru drugomu processu.

    PRIMERY

1. $ if greet | fgrep 'morn' > /dev/null > then morning_routine > fi Vypolnyaetsya greet. Standartnyj vyvod greet po konvejeru pereda- etsya na standartnyj vvod fgrep. Proizvoditsya poisk simvol'noj stroki "morn". Ves' vyhod pereadresovyvaetsya v nikuda, tak chto on ne zasoryaet ekran. Esli vyhodnoj status komandy fgrep raven nulyu (ona nashla nuzhnuyu stroku), vypolnyaetsya fajl morning_routine. 2. $ at 10:30 greet; at 13:50 greet Vy mogli by vstavit' eto v vash .profile. Dva processa at budut vypolnyat'sya na vashej mashine v fonovom rezhime do teh por, poka ne nastupit vremya ih zapuska - togda oni poprivetstvuyut vas na vashem ter- minale. Pravda, eto mozhet prichinit' nebol'shoe neudobstvo. Soobshchenie mozhet poyavit'sya, kogda vy rabotaete v redaktore, i narushit' soderzhimoe ekrana, no na samom dele ono ne izmenit vash redaktiruemyj fajl.

    POYASNENIYA

Vsya programma predstavlyaet soboj odin bol'shoj operator if -then-else v strokah 4-9. Logika programmy vyglyadit na psevdokode sle- duyushchim obrazom: if it is morning esli utro then echo morning statement to vyvesti "utrennee" privetstvie else if it is noon inache esli den' then echo noon statement to vyvesti "dnevnoe" privetstvie else echo evening statement inache vyvesti "vechernee" privetstvie V dejstvitel'nosti programma gorazdo slozhnee, poetomu perevedem dyhanie i pristupim k delu. V stroke 4 proveryaetsya tekushchee vremya na to, men'she li ono 12 chasov. Esli da, to fraza komandy expr vyvodit na standartnoe ust- rojstvo vyvoda edinicu ("1"). Poskol'ku simvoly udareniya (`), kotorye obramlyayut etu frazu, perehvatyvayut standartnyj vyvod, simvol 1 stano- vitsya chast'yu operatora proverki, chto ukazano kvadratnymi skobkami ([]). Zatem operator test proveryaet, raven li vyhod komandy expr lite- ral'noj edinice. Esli oni odinakovy, to v stroke 5 vyvoditsya "utren- nee" soobshchenie. Rassmotrim bolee podrobno, kak raskryvaetsya operator expr. Vo-pervyh, on zaklyuchen v simvoly udareniya. |to oznachaet, chto on vypol- nyaetsya pered operatorom proverki. Zatem ego vyhod pomeshchaetsya dlya obra- botki v operator test. Odnako vnutri operatora expr imeetsya eshche odno vyrazhenie mezhdu znakami udareniya, kotoroe vypolnyaetsya do operatora expr. Takoe starshinstvo vypolneniya upravlyaetsya interpretatorom koda vnutri shell. Vnutrennie znaki udareniya sohranyayutsya pri nachal'nom sintaksi- cheskom razbore stroki, poskol'ku oni ekranirovany simvolami obratnoj kosoj cherty. Pervoj zapuskaetsya komanda date, imeyushchaya v kachestve vyho- da tol'ko tekushchee znachenie chasa v sootvetstvii s formatom %H. Zatem expr ispol'zuet dannoe znachenie chasa dlya proverki, men'she li ono 12. Esli da, expr pechataet edinicu. Esli znachenie chasa bol'she ili ravno 12, to vozvrashchaemoe znachenie ravno 0. Takoe ponimanie, chto 1=istina i 0=lozh', sootvetstvuet sintaksisu, ispol'zuemomu v yazyke Si. Odnako ranee my zamechali, chto v srede programmirovaniya na yazyke shell 1 oznachaet lozh', a 0 - istinu. |to proishodit potomu, chto prove- ryaemoe znachenie operatora if yavlyaetsya v dejstvitel'nosti statusom vy- hoda iz predvaritel'no vypolnennoj komandy. Nul' sootvetstvuet nor- mal'nomu zaversheniyu, poetomu 0 ispol'zovan dlya pereklyucheniya proverki v sostoyanie "istina" i vypolneniya operatora then. Dlya togo, chtoby preob- razovat' vozvrashchaemyj status 1 (pri uslovii, chto znachenie chasa men'she 12) v nul' (dlya pereklyucheniya operatora then), my ispol'zuem komandu test. Vozvrashchaemyj status edinicy raven konstante 1, poetomu komanda test vozvrashchaet 0, chto predstavlyaet istinu. Vot tak! Esli by ne byli ispol'zovany vlozhennye znaki udareniya, to edinstvennym sposobom peredachi dannogo tipa informacii drugomu pro- cessu bylo by primenenie peremennyh shell. Ispol'zovanie vlozhennoj ko- mandnoj podstanovki daet nam bol'shuyu gibkost' i prostotu programmiro- vaniya. CHem bol'she glubina vlozhennosti, tem glubzhe ekranirovanie znakov udareniya. Poryadok ekranirovaniya simvolami obratnoj kosoj cherty takoj: ne nuzhno dlya vneshnej komandy, odin raz dlya vtoroj vnutrennej komandy, pyat' raz dlya tret'ej vnutrennej komandy. Na chetvertom urovne ih dolzhno byt' sem' ili devyat' (ya eshche ne proboval), no veroyatno net bol'shoj nuzh- dy vo vlozhennosti takoj glubiny. Esli proverka v stroke 4 daet "lozh'", vypolnyaetsya stroka 6. |to operator else ot pervogo if i odnovremenno sleduyushchij if. V takih oso- byh sluchayah sintaksis shell menyaetsya. Klyuchevoe slovo "else" stanovitsya klyuchevym slovom "elif". Vtoroj if ispol'zuet komandu test tochno tak zhe, kak i pervyj. Proveryaemoe vremya zdes' 18, chto predstavlyaet soboj 6 chasov vechera. Esli vtoraya proverka takzhe daet "lozh'", vypolnyaetsya poslednij operator v stroke 8. |tot else ne ispol'zuet komandu test, poskol'ku posle vy- polneniya pervyh dvuh proverok my mozhem sdelat' vyvod, chto ostalsya poslednij period vremeni, a imenno period posle 18:00. -------------------------------------------------------- IMYA: lastlog -------------------------------------------------------- lastlog Soobshchaet vremya poslednej registracii

    NAZNACHENIE

Zapisyvaet i vyvodit na ekran den' i vremya vashej poslednej re- gistracii v sisteme.

    FORMAT VYZOVA

lastlog [-l]

    PRIMER VYZOVA

lastlog Pechataet datu, kogda vy poslednij raz registrirovalis' TEKST PROGRAMMY lastlog 1 : 2 # @(#) lastlog v1.0 Report last login time Author: Russ Sage 2a Soobshchaet vremya poslednej registracii 4 if [ $# -gt 1 ] 5 then echo "lastlog: arg error" >&2 6 echo "usage: lastlog [-l]" >&2 7 exit 1 8 fi 10 if [ "$#" -eq "1" ] 11 then if [ "$1" = "-l" ] 12 then date >> $HOME/.lastlog 13 lastlog 14 else echo "lastlog: unrecognized option $1" >&2 15 echo "usage: lastlog [-l]" >&2 16 exit 1 17 fi 18 else echo "Time of last login : `tail -2 $HOME/.lastlog | 19 (read FIRST; echo $FIRST)`" 20 fi PEREMENNYE SREDY VYPOLNENIYA FIRST Hranit pervuyu iz dvuh vvedennyh strok HOME Hranit imya vashego registracionnogo kataloga OPISANIE ZACHEM NAM NUZHEN lastlog? Odnim iz preimushchestv raboty v sisteme UNIX yavlyaetsya to, chto v nej sovershaetsya avtomaticheskaya zapis' vashego nachal'nogo vremeni pri kazhdom seanse raboty - vashego vremeni registracii. |ta informaciya mozhet byt' poleznoj po neskol'kim prichinam. Vopervyh, vy mozhete zapomnit', kogda vy dejstvitel'no rabotali v sisteme poslednij raz i proveryat', ne re- gistrirovalsya li kto-nibud' pod vashim parolem vo vremya vashego otsutstviya. Kak my uvidim v glave 9, imeetsya ryad vozmozhnostej dlya to- go, chtoby kto-nibud' mog "zaimstvovat'" vash parol' bez sprosa. Po etoj prichine mnogie kommercheskie sistemy soobshchayut vam, kogda vy registriro- valis' poslednij raz (ili kogda, po ih mneniyu, vy eto delali). Drugoj vozmozhnoj prichinoj mog by byt' podschet obshchego vremeni v konce seansa raboty. Vy mogli by ispol'zovat' eto kak uchetnuyu informa- ciyu dlya sebya ili vychislitel'nogo centra. Nemnogo pozzhe my predstavim sredstvo, kotoroe pomogaet pri takih podschetah. Razrabatyvaemoe nami instrumental'noe sredstvo dolzhno imet' voz- mozhnost' zapisyvat' novye znacheniya vremeni i vyvodit' na ekran vremya nashej poslednej registracii. Vazhno, chto dannaya programma mozhet byt' vyzvana tak, chto ona ne izmenyaet fajl s dannymi, no postoyanno vyvodit vremya poslednej registracii. CHTO DELAET lastlog? Lastlog - eto programma, kotoraya zapisyvaet vremya vashej registra- cii pri kazhdom vhode v sistemu. Zatem eto vremya hranitsya v fajle dan- nyh v vashem registracionnom kataloge pod imenem $HOME/.lastlog. Imya fajla lastlog nachinaetsya s tochki s toj cel'yu, chtoby sdelat' ego nevi- dimym dlya komandy ls. Ukrytie "sluzhebnyh" fajlov ot raspechatki po umolchaniyu neskol'ko predohranyaet ot lyubopytnyh glaz, a takzhe ubiraet eti fajly s dorogi, kogda vy prosmatrivaete chto-to drugoe. Pri vyzove bez opcij lastlog pechataet dlya nas datu poslednej re- gistracii, poluchaya zapis' iz fajla .lastlog. Dlya vypolneniya novoj zapisi v fajl .lastlog neobhodimo vyzvat' lastlog s opciej -l. Pri etom novoe znachenie vremeni zapishetsya v fajl .lastlog, a zatem komandnyj fajl lastlog vyzovet sam sebya dlya vyvoda na ekran novogo znacheniya - nebol'shaya rekursiya. Dlya togo, chtoby programma lastlog rabotala avtomaticheski, vy dolzhny vypolnyat' ee iz vashego fajla .profile vo vremya registracii. Pri takom sposobe ona zapishet poslednee vremya v fajl .lastlog. V kachestve primera posmotrite fajl .profile v pervoj glave.

    POYASNENIYA

V strokah 4-8 vypolnyaetsya proverka na nalichie oshibok. Esli vy vyzvali lastlog s chislom argumentov bol'she odnogo, to eto privedet k oshibke. Vyvoditsya soobshchenie na standartnoe ustrojstvo registracii oshi- bok, i lastlog zavershaetsya so statusom oshibki 1. Stroki 10-20 predstavlyayut soboj operator if-then-else, kotoryj pokazyvaet, byl li eto vyzov dlya zapisi novogo znacheniya vremeni ili dlya pechati staryh znachenij. Esli v stroke 10 chislo pozicionnyh parametrov ravno odnomu, to my znaem, chto libo etot parametr dolzhen byt' opciej -l, libo eto oshibka. Sleduyushchij operator if v stroke 11 proveryaet, yavlyaetsya li pervyj pozi- cionnyj parametr opciej -l. Esli da, to v fajl $HOME/.lastlog dobavlya- etsya tekushchaya data i lastlog vyzyvaetsya snova bez argumentov dlya pechati predydushchej daty registracii. (My tol'ko chto videli, kak eto delaetsya.) Esli eto ne byl argument -l, to stroki 14-16 vypolnyayut obrabotku oshib- ki. Esli chislo pozicionnyh parametrov ravno nulyu, vypolnyaetsya opera- tor else v stroke 18. Otsutstvie opcij oznachaet, chto my hotim najti vremya nashej poslednej registracii na mashine i raspechatat' ego. |to ka- zhetsya dovol'no prostym, no kto skazal, chto mashiny prosty? Esli vy pomnite posledovatel'nost' raboty, to my sperva registri- ruem novoe vremya, a zatem hotim najti vremya nashej predydushchej registra- cii. Dlya fajla .lastlog eto oznachaet, chto nashe tekushchee vremya registra- cii nahoditsya v samom konce fajla, a nashe predydushchee vremya registracii nahoditsya v stroke neposredstvenno pered nim. |to znachit, chto my dolzh- ny poluchit' vtoruyu stroku ot konca fajla. Da uzh. Kak vidno iz stroki 18, ona zanimaetsya polucheniem poslednih dvuh strok. Komanda tail krasivo vypolnyaet etu rabotu. Nam nuzhen takoj sposob, chtoby my mogli prochitat' imenno pervuyu stroku, a vtoruyu otb- rosit', chto vypolnyaetsya v stroke 19. My peredaem po konvejeru vyhod komandy tail podchinennomu shell (ukazannomu kruglymi skobkami), koto- ryj chitaet pervuyu stroku i zatem otobrazhaet ee. A chto zhe so vtoroj strokoj? Ona nikogda ne beretsya i propadaet. Drugim sposobom mozhet byt' peredacha vyhoda komandy tail po konvejeru komande "head -1". Poskol'ku eta komanda ne imeet drugih opcij, my ne daem nikakih primerov. Tem ne menee, davajte teper' rassmotrim nashe drugoe sredstvo registracii vremeni vhoda v sistemu. -------------------------------------------------------- IMYA: timelog -------------------------------------------------------- timelog Uchet i statistika vremeni

    NAZNACHENIE

Interfejsnoe menyu dlya slezheniya i soprovozhdeniya fajlov registracii vremeni.

    FORMAT VYZOVA

timelog

    PRIMER VYZOVA

timelog Vyvodit na ekran glavnoe menyu, iz kotorogo mozhno vybirat' neobhodimoe dejstvie TEKST PROGRAMMY timelog 1 : 2 # @(#) timelog v1.0 Time accounting and statistics Author: Russ Sage 2a Uchet i statistika vremeni 4 PROJ="" 6 while : 7 do 8 set `date` 9 echo " 11 $1, $2 $3 $4 13 Time Logger 14 ----------- Project: $PROJ 15 s) Select a project file 16 c) Create a new project file 17 l) List current project files 18 v) View the project file 19 n) Turn billing on 20 f) Turn billing off 21 r) Report ststistics 23 enter response (s,c,l,v,n,f,r,): \c" 25 read RSP 27 case $RSP in 28 "") break;; 29 s) echo "\Enter project name ( for exit): \c" 30 read PROJ2 31 if [ "$PROJ2" = "" ] 32 then continue 33 fi 34 if [ ! -s $PROJ2.time ] 35 then echo "you must specify a valid project file" 36 continue 37 fi 38 PROJ="$PROJ2";; 39 c) echo "\nEnter the new project name ( to exit): \c" 40 read PROJ2 41 if [ "PROJ2" = "" ] 42 then continue 43 fi 44 if [ -f "$PROJ2.time" ] 45 then echo "\n ** $PROJ2 already exists **" 46 continue 47 fi 48 PROJ="$PROJ2" 49 echo "\nProject file created: $PROJ" 50 echo "Project file created: `date`\nOFF: begin" > $PROJ.time;; 51 l) echo "\nCurrent project files:\n" 52 ls -l *.time 2>/dev/null || echo "no project files" | 53 sed "s/\.time//";; 54 v) if [ "$PROJ" = "" ] 55 then echo "you must select a project file first" 56 continue 57 fi 58 echo "\n:----------------------------" 59 more $PROJ.time 60 echo ":---------------------------";; 61 n) if [ "$PROJ" = "" ] 62 then echo "you must select a project file first" 63 continue 64 fi 65 if [ "`tail -1 $PROJ.time|cut -d: -f1`" != "OFF" ] 66 then echo "logging was not turned off" 67 continue 68 fi 69 echo "\nBilling turned on for project file: $PROJ" 70 echo "ON: `date`" >> $PROJ.time;; 71 f) if [ "$PROJ" = "" ] 72 then echo "you must select a project file first" 73 continue 74 fi 75 if [ "`tail -1 $PROJ.time|cut -d: -f1`" != "ON" ] 76 then echo "logging was not turned on" 77 continue 78 fi 79 echo "\nBilling turned off for project file: $PROJ" 80 echo "OFF: `date`" >> $PROJ.time;; 81 r) while : 82 do 83 echo " 84 Statistics 85 ---------- Project: $PROJ 86 a) Accumulative time totals 87 n) All times on 88 f) All times off 90 enter response (a,n,f,): \c" 92 read RSP 94 case $RSP in 95 "") break;; 96 a) awk '/Total:/ { PRINT $0 }' $PROJ.TIME;; 97 n) awk '/ON/ { print $0 }' $PROJ.time;; 98 f) awk '/OFF/ { print $0 }' $PROJ.time;; 99 *) echo "\n ** Wrong command, try again **";; 100 esac 101 done;; 102 *) echo "\n ** Wrong command, try again **";; 103 esac 104 done

    PREMENNYE SREDY VYPOLNENIYA

PROJ Soderzhit tekushchee imya proekta PROJ2 Soderzhit vremennoe imya proekta, vvedennoe pol'zovatelem RSP Soderzhit komandu vybora iz menyu OPISANIE ZACHEM NAM NUZHEN timelog? Vremya - dragocennyj tovar. Ego vsegda ne hvataet, i esli uzh ono ispol'zovano, to ego nikogda bol'she nel'zya vernut'. My hotim byt' uve- reny, chto nashe vremya ispol'zuetsya plodotvorno. My mozhem i dolzhny soz- dat' instrumental'nye sredstva, kotorye pomogut nam upravlyat' nashim vremenem i fiksirovat' ego. My dolzhny rassmotret' sleduyushchie voprosy: nad kakimi proektami my rabotaem, v techenie kakogo vremeni my nad nimi rabotaem (t.e. nachalo i okonchanie), i kakuyu eshche informaciyu nam nuzhno hranit'. Kak raz pochti vse eti funkcii podderzhivayutsya programmoj timelog. My napisali dovol'no dlinnuyu programmu, no zametim, chto na samom dele rabota nad etim sredstvom ne okonchena. Predlagaemyj komandnyj fajl timelog podgotavlivaet vas k rabote s sistemoj upravleniya vremenem. Vam nuzhno vstavit' vash sobstvennyj tekst dlya vydachi otchetov, osnovan- nyh na statistike vremeni. CHTO DELAET timelog? Timelog otnositsya k ves'ma vazhnoj oblasti, svyazannoj s fiksaciej vremeni i upravleniem vremenem. Otmetim, chto kolichestvo uchetnyh svede- nij, kotorye mozhno sozdat', prosmotret' i obrabotat', ogranicheno tol'- ko dostupnym prostranstvom fajlovoj pamyati. Timelog - eto polnost'yu upravlyaemyj s pomoshch'yu menyu interfejs. Sistemy s menyu v UNIX - eto nechto novoe, oni imeyut svoi preimushchestva i nedostatki. Odnim iz preimushchestv yavlyaetsya to, chto vsya rabota nad dan- nymi vypolnyaetsya programmno, a ne vruchnuyu. Krome togo, kazhduyu funkciyu naglyadno vidno i legko vybrat'. Vam net neobhodimosti zapominat' opcii i imena fajlov, dostatochno prosto nazhat' odnu klavishu dlya vypolneniya dejstviya. Nedostatkom yavlyaetsya to, chto menyu rabotayut medlennee, chem ruchnoj interfejs (t.e. prosto nabor i neposredstvennoe vypolnenie komand). |to ochen' vazhnoe zamechanie, no my dolzhny takzhe pomnit', chto programmy dolzhny byt' prostymi v ispol'zovanii, prostymi dlya modifikacii i vy- polnyat' mnozhestvo melochej, svyazannyh s kakoj-libo ideej ili oblast'yu naznacheniya. Poterya mashinnogo vremeni chashche vsego luchshe, chem poterya vre- meni cheloveka! Drugoj nedostatok - dlya togo chtoby dobrat'sya do oprede- lennoj funkcii, vy dolzhny projti cherez neskol'ko urovnej menyu. Naprimer, chtoby napechatat' otchet, vy dolzhny vyzvat' timelog, vyb- rat' menyu statistiki, zatem vybrat' nuzhnyj vam otchet. Zdes' tri urov- nya, a pri nalichii utility vy mogli by vsego odnoj komandoj skazat' "report report_file". Dlya utilit, vypolnyayushchih odnu funkciyu, nalichie odnoj komandy s neskol'kimi opciyami dovol'no effektivno. Takoj podhod primenyaetsya v bol'shinstve komandnyh fajlov interpretatora shell. No kogda u vas est' mnozhustvo nebol'shih zadach, vypolnyaemyh nad gruppoj ob容ktov, menyu bo- lee udobny. Nekotorye sistemy predostavlyayut interfejs, upravlyaemyj kak menyu, tak i komandami. |to ustraivaet bol'shij krug pol'zovatelej i pozvolyaet izbezhat' bol'shinstva nedostatkov, upomyanutyh vyshe. Konechno, pri takom podhode neminuemy nekotorye izderzhki i programma stanovitsya bolee dlinnoj. Pri vyzove timelog na ekran vyvoditsya nachal'noe menyu, kak pokaza- no nizhe. --------------------- | | Thu, Jun 19 21:32:12 | | Time Logger | ----------- Project: | s) Select a project file | c) Create a new project file | l) List current project files | v) View the project file | n) Turn billing on | f) Turn billing off | r) Report statistics | | enter response (s,c,l,v,n,f,r,): V levom verhnem uglu pokazan den' nedeli i data. V pravom verhnem uglu pokazano vremya. |to real'noe vremya, i ono obnovlyaetsya pri kazhdom vyzove menyu. Imya menyu "Time Logger" (registrator vremeni). "Report statistics" (soobshchit' statistiku) vyzyvaet poyavlenie podchinennogo me- nyu. Stroka, v kotoroj napisano "Project:" (proekt), pokazyvaet, chto tekushchee imya proekta nulevoe. Dlya togo chtoby rabotat' nad proektom, vy sperva dolzhny sozdat' fajl proekta ili vybrat' ego, esli on uzhe su- shchestvuet. Vse dejstviya, vypolnyaemye posle etogo, otnosyatsya k tekushchemu fajlu proekta. Pervyj punkt menyu s prednaznachen dlya vybora fajla proekta. Posle vybora etogo punkta vyvoditsya soobshchenie: --------------------------- | | Enter project name ( for exit): | Vvedite imya proekta ( dlya vyhoda): Vy mozhete vvesti lyubuyu tekstovuyu stroku v kachestve imeni proekta ili, esli vam ne nuzhna eta opciya, nazhat' klavishu vozvrata karetki dlya blagopoluchnogo vyhoda. Esli vy ne pomnite imena proektov, vy mozhete ispol'zovat' opciyu l, poyasnyaemuyu nizhe. Posle vvoda imeni sushchestvuyushchego proekta, tekushchemu imeni proekta (kotoroe pechataetsya sprava vverhu v kazhdom menyu) prisvaivaetsya imya etogo fajla. Sleduyushchej yavlyaetsya opciya c dlya sozdaniya fajla proekta. Kak uzhe otmechalos', eto dolzhno byt' pervym, chto vy delaete, nachinaya rabotat' s utilitoj timelog, no posle etogo vy obychno vybiraete sushchestvuyushchie faj- ly. Kogda vy vybrali opciyu c, pechataetsya sleduyushchee priglashenie: --------------------------- | | Enter the new project name ( to exit): | Vvedite imya novogo proekta ( dlya vyhoda): Zdes' nuzhno vvodit' to zhe samoe, chto i pri vybore proekta. Dlya vyhoda nazhmite vozvrat karetki. Posle vvoda imeni tekushchee imya proekta izmenyaetsya, sozdaetsya fajl proekta, zapominaetsya vremya, i fajl zagru- zhaetsya ishodnoj informaciej. Sleduyushchaya opciya l prednaznachena dlya vydachi spiska imen fajlov proektov. Poskol'ku kazhdyj proekt yavlyaetsya fajlom, otobrazhaetsya spisok v vide, obychnom dlya komandy ls. Tem ne menee, bud'te vnimatel'ny. Spisok nel'zya poluchit' pryamo komandoj ls. Imena izmeneny dlya zashchity ot naivnyh. Kazhdyj fajl proekta hranitsya na diske v formate "project. time". CHast' project v kazhdom fajle otlichaetsya i predstavlyaet soboj imya, vve- dennoe v opcii sozdaniya. Vse fajly imeyut suffiks .time. Kogda vyvo- ditsya spisok, prefiks .time otbrasyvaetsya, tak chto imena fajlov yavlya- yutsya prosto proektami, kotorye vy vveli v opcii vybora proekta. Zdes' vse rabotaet, no vy dolzhny pomnit', chto esli vy zahotite prosmotret' fajly vremen vruchnuyu, to imena ne budut temi zhe samymi. Esli net nika- kih fajlov proektov, to ob etom vyvoditsya soobshchenie. Sleduyushchej opciej yavlyaetsya v dlya prosmotra fajla proekta. Fajlom, kotoryj vy sobiraetes' prosmotret', yavlyaetsya tekushchij fajl proekta. Ego imya vyvoditsya v menyu sprava ot slova "Project:". Esli ne poyavilos' ni- kakogo imeni, vy dolzhny sperva sozdat' novyj proekt ili vybrat' su- shchestvuyushchij. Fajl proekta vyvoditsya na ekran komandoj UNIX more. Sleduyushchej opciej yavlyaetsya opciya n dlya vklyucheniya podscheta vremeni. |to oznachaet nachalo zapisi novogo seansa raboty nad proektom. Proverya- etsya imya proekta, chtoby vyyasnit', byl li vybran fajl proekta. Esli net, vyvoditsya soobshchenie o tom, chto nuzhno eto sdelat'. Zatem proverya- etsya, byl li fajl proekta otklyuchen predydushchej operaciej. Esli da, to registrator vremeni mozhet byt' vklyuchen. Vy ne mozhete vklyuchit' ego dvazhdy. Vy dolzhny otklyuchit' ego, zatem vklyuchit' i t.d. Sleduyushchaya opciya f otklyuchaet podschet vremeni dlya fajla proekta. Tekushchee imya proekta sravnivaetsya s nulevym, i esli eto tak, to vyvo- ditsya sootvetstvuyushchee soobshchenie. Zatem proveryaetsya, byl li predvari- tel'no vklyuchen podschet vremeni dlya etogo fajla. Esli byl, to v fajl proekta dobavlyaetsya zapis' o vyklyuchenii podscheta. Poslednej opciej yavlyaetsya r dlya otcheta i statistiki. Posle ee vy- bora na ekran vyvoditsya podchinennoe menyu: ----------------------- | | Statistics | ---------- Project: | a) Accumulative time totals | n) All times on | f) All times off | | enter response (a,n,f,): Kak upominalos' ranee, eto menyu na samom dele ne realizovano. Neskol'ko komand-zaglushek pozvolyayut etomu menyu funkcionirovat', no v etom meste vy mozhete nastroit' otchety po vashim trebovaniyam. Obratite vnimanie, chto imya proekta takzhe vyvoditsya v etom menyu. |to imya zatem dostupno dlya lyubyh funkcij, pomeshchennyh v dannoe menyu.

    PRIMERY

1. c,l,v |to pervyj nabor komand pri pervonachal'nom zapuske. Opciya c - punkt menyu dlya sozdaniya fajla proekta. Komanda l vyvodit spisok vseh imen fajlov proektov, a v prosmatrivaet ishodnye dannye, nahodyashchiesya v fajle proekta. 2. n,n Takaya posledovatel'nost' illyustriruet proverku na oshibki vnutri programmy. Snachala vklyuchaetsya podschet vremeni dlya tekushchego fajla pro- ekta, a zatem on vklyuchaetsya opyat'. Timelog raspoznaet eto i soobshchaet, chto vy dolzhny otklyuchit' podschet pered tem, kak snova vklyuchit' ego. 3. s,junk |ta posledovatel'nost' takzhe illyustriruet proverku oshibok. Pyta- emsya vybrat' novoe imya fajla proekta. Imya fajla junk (kotorogo vy ne imeete). Timelog proveryaet, sushchestvuet li fajl registracii vremeni s imenem junk. Esli net, vyvoditsya soobshchenie o tom, chto vy dolzhny vyb- rat' pravil'noe imya fajla proekta.

    POYASNENIYA

V etom komandnom fajle mnogo teksta, no zamysel ne ochen' slozhen. Stroka 4 inicializiruet peremennuyu PROJ nulevym znacheniem. PROJ - eto peremennaya, kotoraya soderzhit imya proekta, otobrazhaemoe v menyu. V nachale raboty my dolzhny byt' uvereny, chto eta peremennaya ustanovlena v nul'. Stroki 6-104 - eto ogromnyj beskonechnyj cikl while, kotoryj vy- polnyaet rabotu vsej programmy. Poskol'ku eto beskonechnyj cikl, my mo- zhem vyjti iz nego libo operatorom break, (vvodya obychnye simvoly prery- vaniya), libo s pomoshch'yu komandy vyhoda. V stroke 8 pozicionnym parametram prisvaivaetsya rezul'tat komandy date. Postupaya takim obrazom, my mozhem zatem legko obrashchat'sya k kazhdo- mu polyu bez vydeleniya ego komandoj cut - shell vypolnyaet za nas sin- taksicheskij razbor polej. My mozhem ssylat'sya na polya daty v vide $1, $2 i t.d. Stroki 9-23 vyvodyat na ekran glavnoe menyu. Verhnyaya stroka obrashcha- etsya k dannym iz komandy date. $1, $2 i $3 predstavlyayut soboj den' ne- deli, mesyac i chislo. $4 - eto vremya. Pered tem kak komanda echo vyvo- dit tekstovye stroki, eti peremennye raskryvayutsya takim obrazom, chto oni poyavlyayutsya v menyu. Esli peremennaya PROJ ravna nulyu, to nichego ne pechataetsya v kachestve imeni tekushchego proekta. Simvoly \c v konce og- romnogo operatora echo ustanavlivayut kursor posle priglasheniya v etoj zhe stroke, tak chto my gotovy prinimat' vvodimye pol'zovatelem simvoly. Posle pechati menyu v peremennuyu RSP chitaetsya otvet v stroke 25. Zatem nastupaet chered ogromnogo operatora case (stroki 27-103), koto- ryj soderzhit vetku dlya kazhdoj komandy. V stroke 28 proveryaetsya, ne byl li otvet vsego lish' vozvratom ka- retki, ukazyvayushchim, chto pol'zovatel' hochet vyjti. Esli byl, to cikl while zavershaetsya posredstvom komandy break i programma zakanchivaet rabotu. Inogda vozvrat karetki - bolee zhelatel'nyj metod vyhoda, chem ko- manda exit interpretatora shell. V konechnom itoge eta komanda shell privodit k vypolneniyu programm exit i _exit Si -interfejsa. Vypolnenie vyzova exit v Si inogda privodit k neozhidannym pobochnym effektam, v to vremya kak normal'noe vypolnenie teksta programmy do konca ne daet ta- kih zhe rezul'tatov. Odnazhdy my stolknulis' s takoj problemoj pri ispol'zovanii ESC -posledovatel'nostej dlya izmeneniya cveta na cvetnom monitore. Kogda programma zavershalas' normal'no, cvet ne pereustanav- livalsya. Odnako kogda byl sdelan sistemnyj vyzov exit, pechatalis' ne- kotorye ESC-posledovatel'nosti, chto pereustanavlivalo otdel'nye chasti ekrana. Ochen' stranno! Stroki 29-38 upravlyayut funkciej vybora proekta. Imya proekta zap- rashivaetsya i chitaetsya v peremennuyu PROJ2. PROJ2 ispol'zovana dlya vre- mennogo hraneniya etogo znacheniya. Esli byl vveden vozvrat karetki, ope- rator continue privodit k sleduyushchej iteracii vneshnego cikla while. |to pozvolyaet pol'zovatelyu prekratit' vypolnenie etoj funkcii pri oshiboch- nom vvode, ostavayas' vse zhe v timelog. Esli vvod byl nepustym, fajl proekta proveryaetsya na sushchestvovanie i na nalichie v nem dannyh. Esli fajl ne sushchestvuet, pol'zovatelya prosyat ukazat' vernoe imya proekta. Esli imya fajla pravil'noe, to peremennoj PROJ prisvaivaetsya znachenie PROJ2. Tol'ko posle togo, kak komandnyj fajl s uverennost'yu znaet, chto imya, vvedennoe pol'zovatelem, dopustimo, ono naznachaetsya v kachestve tekushchego imeni proekta. |to predohranyaet ot poteri vybora tekushchego proekta iz-za oshibki pol'zovatelya. Teper' PROJ vyvoditsya v menyu na ek- ran. Komanda sozdaniya obrabatyvaetsya strokami 39-50. Snova zaprashiva- etsya imya i proveryaetsya, ne ravno li ono nulyu. Esli imya bylo vvedeno, to proveryaetsya, sushchestvuet li uzhe takoj fajl. My ne hotim snova sozda- vat' i zatirat' uzhe imeyushchijsya fajl. Fajl sozdaetsya v stroke 50. V etot fajl vyvodyatsya otmetka o vremeni ego inicializacii i nachal'noe soobshche- nie o tom, chto podschet vremeni otklyuchen. Opciya vyvoda spiska vypolnyaetsya v strokah 51-53. Vyvoditsya zago- lovok, a zatem komanda ls ispol'zuetsya dlya generacii spiska. Esli net fajlov nuzhnogo nam tipa, to komanda ls vozvrashchaet status, otlichnyj ot nulya, tem samym vklyuchaetsya operator ||. V sushchnosti etot fokus shell daet nam vstroennyj operator if-then, kotoryj mozhet ispol'zovat' re- zul'taty predydushchej komandy. Esli vypolnenie komandy ls neudachno (t.e. ne najdeny podhodyashchie fajly), eto soobshchenie ob oshibke otbrasyvaetsya (ne vyvoditsya) i vypolnyaetsya operator echo. Komanda echo soobshchaet, chto net fajlov, chtoby vy znali ob etom. Vsyakij vyhod komandy ls propuskaetsya cherez komandu sed dlya otb- rasyvaniya rasshireniya imeni fajla .time. Dlya sohraneniya mesta i dlya udobstva pol'zovatelya my hotim tol'ko posmotret' i napechatat' imena proektov, a ne imena fajlov. Odnako, my hotim hranit' imena fajlov v special'nom vnutrennem formate tak, chtoby my mogli proshche obrabatyvat' ih i podderzhivat' unikal'nye imena. Komanda prosmotra vypolnyaetsya v strokah 54-60. Tekushchij fajl pro- ekta proveryaetsya na to, bylo li vybrano imya. Esli net, glavnoe menyu vyvoditsya snova. V protivnom sluchae pechataetsya stroka iz chertochek, vy- voditsya komandoj more fajl proekta i pechataetsya eshche odna stroka cherto- chek dlya obramleniya vyvedennoj informacii. Vy mozhete udivit'sya, pochemu pervym simvolom operatora echo yavlyaetsya dvoetochie (:). |to nekotoryj kazus, poskol'ku, esli vy popytaetes' otobrazit' simvol chertochki (-) v kachestve pervogo simvola, to operator echo "podumaet", chto eto pustaya opciya i ne vyvedet ee na ekran. Vy prosto dolzhny postavit' v pervoj pozicii kakoj-to nepustoj simvol, otlichnyj ot chertochki. Vklyuchenie podscheta vremeni vypolnyaetsya v strokah 61-70. Tekushchee imya proekta proveryaetsya na to, bylo li ono vybrano. Esli da, to prove- ryaetsya, byl li otklyuchen fajl proekta. My vypolnyaem eto, ispol'zuya ko- mandu tail dlya vydeleniya poslednej stroki fajla, zatem peredaem po konvejeru etu stroku komande cut, gde my izmenyaem simvol-razdelitel' na simvol : i otrezaem pervoe pole. Esli v etom pole nahodyatsya simvoly OFF, vse v poryadke. Posle etogo stroka 69 vyvodit na ekran soobshchenie dlya pol'zovatelya, a stroka 70 vstavlyaet v fajl proekta stroku ON, za kotoroj sleduet tekushchaya data. Tem samym fajl otmechaetsya kak vklyuchen- nyj. Podschet vremeni nachalsya. Esli eta operaciya uzhe byla vklyuchena, my soobshchaem ob etom pol'zovatelyu i vyhodim iz dannoj operacii menyu. Stroki 71-80 obrabatyvayut otklyuchenie podscheta vremeni. Zdes' poch- ti vse identichno tekstu programmy, kotoryj vklyuchaet etu operaciyu, tol'ko esli tam bylo slovo "on", to zdes' slovo "off". Stroki 81-101 obrabatyvayut podchinennoe menyu vydachi otchetov i sta- tistiki. Kak vidite, ekrannoe menyu splanirovano takim zhe obrazom: cikl while, pechat' menyu, chtenie otveta, vypolnenie operatora case v zavisi- mosti ot vybrannoj komandy i t.d. Komanda r podobna glavnomu menyu, tol'ko sokrashchena dlya togo, chtoby pomestit'sya vnutri operatora case. Vy takzhe mozhete zametit', chto v strokah 96-99 vypolnyaetsya ne ochen' mnogo obrabotki. |to to mesto, gde vy dolzhny vypolnit' nekotoruyu rabotu. Stroka 102 vypolnyaet obrabotku oshibok pri lyubom nevernom vvode. Pechataetsya soobshchenie ob oshibke, operator case vyhodit na sleduyushchuyu iteraciyu cikla while, i vse nachinaetsya snachala.

    MODIFIKACII

Osnovnoj vozmozhnost'yu dlya modifikacii yavlyaetsya dobavlenie fakti- cheskoj obrabotki informacii o vremeni. Odin iz podhodov k etomu - zap- rosit' pochasovoj tarif vremeni v moment sozdaniya fajla proekta (esli schitat', chto vy rabotaete na takih osnovaniyah). |tot tarif mozhet hra- nit'sya pervym punktom v fajle proekta. Sleduyushchie dve stroki mogut byt' otvedeny dlya "scheta po tekushchemu seansu" i "obshchego scheta" sootvetstven- no. Kogda podschet vremeni raboty nad proektom otklyuchaetsya, mozhno proa- nalizirovat' tekushchee sistemnoe vremya i nachal'noe vremya podscheta i za- tem pereschitat' v minuty (dlya uproshcheniya arifmetiki) s ispol'zovaniem komandy expr (ili, vozmozhno, awk). Zatem eto znachenie mozhno umnozhit' na hranimyj v fajle tarif vremeni, a rezul'tat sohranit' v zapisi o tekushchem seanse raboty i DOBAVITX k sovokupnoj obshchej zapisi. ----------------------------------------------------- IMYA: today ------------------------------------------------------ today Pechat' kalendarya s podsvechennoj segodnyashnej datoj

    NAZNACHENIE

Modificiruet vyvod utility cal dlya pechati segodnyashnej daty in- versnym cvetom.

    FORMAT VYZOVA

today

    PRIMER VYZOVA

today Pechataet kalendar' na etot mesyac s podsvechennoj segodnyashnej datoj TEKST PROGRAMMY today 1 : 2 # @(#) today v1.0 Calendar with today highlighted Author: Russ Sage 2a Kalendar' s podsvetkoj segodnyashnego dnya 4 SYSV=n 6 set `date` 8 if [ "$SYSV" = "y" ] 9 then RVR=`tput smso` 10 BLNK=`tput blink` 11 NORM=`tput rmso` 12 cal ${2} ${6} | sed "s/${3}/${RVR}${BLNK}${3}${NORM} /g" -e "s/^/ /" 13 else RVR="^[[7m" # termcap so 14 NORM="^[[0m" # termcap se 15 cal ${2} ${6} | sed -e "s/ ${3}/ ${RVR}${3}${NORM} /" -e "s/^/ /" 16 fi PEREMENNYE SREDY VYPOLNENIYA RVR Upravlyayushchij simvol inversnogo otobrazheniya dlya vashego terminala BLNK Upravlyayushchij simvol mercaniya dlya vashego terminala, esli takovoj imeetsya NORM Upravlyayushchij simvol dlya vozvrata terminala v obychnyj rezhim OPISANIE ZACHEM NAM NUZHEN today? Vsegda priyatno imet' instrumental'nye sredstva, predostavlyayushchie nam informaciyu o nashej srede. Tip informacii, kotoryj my zdes' rassmatrivaem - eto modificirovannyj vyvod kalendarya. Standartnaya ko- manda cal vyvodit dni mesyaca, no ne soobshchaet vam, kakoj den' segodnya. Kak my eto uznaem? My dolzhny zapustit' komandu date dlya opredeleniya tekushchego dnya. Dovol'no trivial'naya zadacha, odnako nashe reshenie mozhet dat' nekotoruyu cennuyu grafiku, kotoraya mozhet dobavit' dejstvitel'no poleznuyu informaciyu k kalendaryu. Dlya vypolneniya takoj modifikacii nam neobhodimo vypolnit' postob- rabotku rezul'tata komandy cal. Poskol'ku ne vse terminaly obladayut odinakovymi vozmozhnostyami, eta programma dolzhna byt' prisposoblena k vashej mashine. CHTO DELAET today? Today - eto postprocessor dlya komandy cal, kotoryj delaet ee re- zul'tat bolee informativnym i graficheski naglyadnym. Vypolnenie modifi- kacii komandy cal zavisit ot togo, v kakoj sisteme vy rabotaete. Esli vy v sisteme UNIX System V (versiya 2 ili starshe), to u vas est' utili- ta terminfo. Terminfo yavlyaetsya zamenoj dlya fajla termcap i postavlya- etsya s neskol'kimi utilitami, kotorye vozvrashchayut znacheniya s informaci- ej o PRIEMY PROFESSIONALXNOJ RABOTY V UNIX nal'nyh harakteristik. Esli vash komp'yuter rabotaet ne s sistemoj System V, to vam neobhodimo nemnogo poissledovat' tip vashih konkretnyh terminalov i vnesti poluchennye znacheniya v vashu programmu. Vsya istoriya s utilitami termcap i terminfo illyustriruet evolyuciyu raboty v srede UNIX. UNIX s samyh pervyh dnej stremilsya byt' nezavisi- mym ot tipov ustrojstv. Pervym shagom yavilos' ispol'zovanie fajlov ust- rojstv i drajverov. Sleduyushchim shagom byl fajl termcap, kotoryj pre- dostavil edinoobraznyj sposob polucheniya informacii o terminalah. Poslednim etapom yavlyaetsya utilita terminfo, predostavlyayushchaya etu infor- maciyu takim sposobom, kotoryj luchshe obespechivaet funkcional'nyj dostup iz programm. Poskol'ku v predelah komandnogo fajla ne tak legko opredelit', s kakoj sistemoj rabotaet vash komp'yuter, ispol'zovana peremennaya SYSV. |tu peremennuyu mozhno izmenit' pri pomoshchi redaktora, poetomu today mo- zhet rabotat' v raznyh sistemah. Sposobami vyyasneniya sistemy mogli by sluzhit' programma uname, sushchestvovanie opredelennyh shell-programm v kataloge /bin ili kakoj-nibud' sistemnyj fajl, soderzhashchij nomer versii. Po umolchaniyu peremennaya SYSV ustanovlena tak, chtoby utilita today rabotala NE v sisteme System V. S etim svyazano sushchestvovanie fragmenta programmy, kotoryj nuzhno izmenyat' vruchnuyu. Kak vy mozhete samostoyatel'no poluchit' informaciyu o terminale? Kazhdyj terminal imeet svoi specificheskie osobennosti. Vse terminaly harakterizuyutsya v osnovnom fajlom opisaniya terminala termcap. V etom fajle kazhdaya harakteristika daetsya pod svoim imenem vmeste s apparat- nym kodom etoj funkcii. Takim obrazom, my mozhem, naprimer, redaktorom vi zaglyanut' v termcap i uvidet', kak upravlyat' terminalom, na kotorom my rabotaem. Fajl termcap sil'no zashifrovan i zagadochen. Po dannomu voprosu ne ochen' mnogo dokumentacii, chto porozhdaet mnozhestvo eksperi- mentov i oshibok. Peremennymi, kotorye nas interesuyut, yavlyayutsya "so" dlya vydeleniya informacii (inversnyj rezhim) i "se" dlya zaversheniya vydeleniya (obychnyj rezhim), a takzhe rezhim mercaniya, esli on est' u vashego terminala. Termcap, pohozhe, ne soderzhit informaciyu o tom, kak vklyuchit' rezhim mer- caniya, poetomu vam, veroyatno, nuzhno budet dlya etogo posmotret' doku- mentaciyu na terminal. V sisteme System V (versiya 2) komanda tput vozv- rashchaet sootvetstvuyushchee znachenie. Po umolchaniyu v today vypolneny ustanovki dlya ANSI terminala, yav- lyayushchegosya konsol'nym v sisteme XENIX. |ti kody byli vruchnuyu izvlecheny iz fajla /etc/termcap i vstavleny v tekst programmy. Esli vashi kody otlichayutsya, vy dolzhny vyyasnit' ih. Obratite vnimanie, chto v fajle /etc/termcap simvol ESCAPE predstavlen kak \E. |to ne goditsya dlya today, i vy dolzhny izmenit' takoe predstavlenie na nastoyashchij ESCAPE. Poskol'ku ESCAPE yavlyaetsya simvolom vyhoda iz rezhima vvoda v redaktore vi, vy dolzhny ispol'zovat' komandu control-V v etom redaktore dlya vvo- da upravlyayushchih simvolov. Posledovatel'nost' control-V vyzyvaet pechat' simvola ^, a ESCAPE - pechat' simvola [. Takim obrazom, real'naya koman- da vhoda v inversnyj rezhim v redaktore vi predstavlena posledovatel'- nost'yu ^[[7m. |ta komanda vklyuchaet simvoly ^[ v kachestve ESCAPE i za- tem obychnye simvoly [7m dlya izmeneniya rezhima. Teper', kogda harakteristiki terminala uchteny, cel' utility today - vydelit' tekushchij den' kalendarya v inversnom vide, a vse ostal'noe ostavit' v obychnom vide. |to delaetsya putem peredachi po konvejeru vy- hoda komandy cal komande sed. Utilita sed nahodit chislo v vyhodnyh dannyh i podstavlyaet special'nuyu graficheskuyu ESC-posledovatel'nost'. Poskol'ku vash terminal ispol'zuet special'nye simvoly dlya izmeneniya rezhima, vy ne uvidite ih vydachi na ekran. Dannaya programma ne imeet opcij ili kakogo-to osobogo vhoda. Ona raspechatyvaet kalendar' s otmechennym segodnyashnim dnem.

    POYASNENIYA

V stroke 4 vypolnyaetsya inicializaciya peremennoj SYSV znacheniem "n". |to zastavlyaet programmu perehodit' k osoboj oblasti, v kotoroj zhestko zakodirovany upravlyayushchie kody terminala, opredelennye vruchnuyu. Esli vy rabotaete s poslednimi versiyami sistemy System V, to vam nuzh- no, chtoby eta peremennaya imela znachenie "y". V stroke 6 pozicionnym parametram prisvaivaetsya rezul'tat komandy date. My obratimsya k etim znacheniyam pozzhe. Stroki 8-16 - eto ostal'naya chast' programmy. Oni predstavlyayut so- boj odin operator if-then-else. Stroki 9-12 podderzhivayut prinyatyj v System V metod tput dlya polucheniya harakteristik terminala, a stroki 13-15 upravlyayut ruchnym sposobom ih polucheniya. V oboih sluchayah peremennym shell prisvaivayutsya ESC-posledovatel'- nosti. |ti znacheniya ispol'zuyutsya pozzhe. V oboih sluchayah vypolnyaetsya vyzov komandy cal s ispol'zovaniem znachenij mesyaca i goda, poluchennyh ot komandy date. |tot obraz kalendarya propuskaetsya po konvejeru cherez utilitu sed, kotoraya ishchet ukazannyj den' "segodnya", takzhe poluchennyj ot komandy date. Kogda etot den' najden, sed zamenyaet cifry dnya na posledovatel'nost' vklyucheniya inversnogo rezhima, posledovatel'nost' vklyucheniya rezhima mercaniya, esli on est', i simvoly dnya, a zatem posle- dovatel'nost' vozvrata v obychnyj rezhim raboty terminala. Poslednyaya ko- manda sed zapolnyaet probelami nachalo stroki dlya razmeshcheniya ee v centre ekrana.

    UPRAVLENIE DELOPROIZVODSTVOM

Mnogo rabochego vremeni tratitsya na zapominanie vazhnoj informacii, takoj kak delovye vstrechi, adresa, nomera telefonov, raspisaniya, uchet- nye svedeniya o proektah i tak dalee. Bol'shinstvo iz takoj informacii mozhet byt' sohraneno v sisteme UNIX v vide prostyh strukturirovannyh tekstovyh fajlov, kotorymi mozhno manipulirovat' s pomoshch'yu sootvetstvu- yushchih sredstv. Avtomatizaciya etoj oblasti mozhet osvobodit' mnogo vreme- ni dlya vypolneniya "nastoyashchej" raboty. Hotya moshchnye kommercheskie programmy dlya sohraneniya takoj informa- cii imeyutsya v srede MS-DOS, eti programmy ne imeyut shirokogo rasprost- raneniya v UNIX. CHasto u vas net neobhodimosti v otdel'noj bol'shoj programme dlya vypolneniya takih rabot v UNIX. UNIX obespechivaet horoshij kompromiss mezhdu legkimi v primenenii, no ne gibkimi kommercheskimi programmami i programmirovaniem na moshchnyh, no neprostyh v ispol'zova- nii tradicionnyh yazykah programmirovaniya. Vozmozhnosti yazyka shell plyus bogatyj assortiment vstroennyh komand UNIX dayut moshchnyj, gibkij i SRAV- NITELXNO prostoj v ispol'zovanii kompromiss. V dannom razdele my predstavlyaem shirokij nabor sredstv upravleniya lichnoj informaciej, ko- torye vy mozhete prisposobit' dlya svoih nuzhd. Dlya shutki nachnem s programmy po imeni jargon - generatora tehni- cheskih terminov, konstruiruyushchego zamyslovatye frazy. S ego pomoshch'yu mozhno udivlyat' lyudej tem, kak mnogo vy znaete, ili nachat' pribyl'nuyu vtoruyu kar'eru v kachestve sostavitelya reklamy. Kombinirovanie slov po- rozhdaet sotni fraz. Zatem my rassmotrim programmu phone. Phone - eto komandnyj fajl, upravlyaemyj s pomoshch'yu menyu, kotoryj podderzhivaet bazu telefonnyh nome- rov i soputstvuyushchej informacii. Ona svodit voedino raznoobraznye aspekty soprovozhdeniya bazy dannyh i obsluzhivaniya zaprosov k nej. Poslednee instrumental'noe sredstvo nazyvaetsya office. |to uprav- lyaemaya pri pomoshchi menyu utilita, kotoraya daet odnoklavishnyj dostup ko vsem funkciyam deloproizvodstva. Syuda otnosyatsya pochta, novosti, kalen- dar', nomera telefonov i avtomaticheskie napominaniya. ------------------------------------------------------- IMYA: jargon -------------------------------------------------------

    NAZNACHENIE

Komp'yuterizovannaya versiya starogo nastol'nogo generatora tehni- cheskih terminov.

    FORMAT VYZOVA

jargon

    PRIMER VYZOVA

jargon Esli vvesti 125 v otvet na zapros, to na vyhode 125 poluchitsya fraza Total Monitored Concept TEKST PROGRAMMY jargon 1 : 2 # @(#) jargon v1.0 Technical jargon generator Author: Russ Sage 2a Generator tehnicheskogo zhargona 4 echo "\n\t\tThe Jargon Generator" 5 while : 6 do 7 echo "\nEnter a 3 digit number (000-999), ? , or : \c" 8 read NUM 10 case $NUM in 11 "") exit;; 12 \?) cat < /dev/ null || 27 { echo "\nNot a valid number, try again "; continue; };; 28 *) echo "\nInvalid input, try again" 29 continue;; 30 esac 32 N1=`echo $NUM|cut -c1` 33 N2=`echo $NUM|cut -c2` 34 N3=`echo $NUM|cut -c3` 35 SEN="" 37 case $N1 in 38 0) SEN="${SEN}Integrated ";; 39 1) SEN="${SEN}Total ";; 40 2) SEN="${SEN}Systematized ";; 41 3) SEN="${SEN}Parallel ";; 42 4) SEN="${SEN}Functional ";; 43 5) SEN="${SEN}Responsive ";; 44 6) SEN="${SEN}Optional ";; 45 7) SEN="${SEN}Synchronized ";; 46 8) SEN="${SEN}Compatible ";; 47 9) SEN="${SEN}Balanced ";; 48 esac 50 case $N2 in 51 0) SEN="${SEN}Management ";; 52 1) SEN="${SEN}Organizational ";; 53 2) SEN="${SEN}Monitored ";; 54 3) SEN="${SEN}Reciprocal ";; 55 4) SEN="${SEN}Digital ";; 56 5) SEN="${SEN}Logistical ";; 57 6) SEN="${SEN}Transitional ";; 58 7) SEN="${SEN}Incremental ";; 59 8) SEN="${SEN}Operational ";; 60 9) SEN="${SEN}Third-Generation ";; 61 esac 63 case $N3 in 64 0) SEN="${SEN}Options";; 65 1) SEN="${SEN}Flexibility";; 66 2) SEN="${SEN}Capability";; 67 3) SEN="${SEN}Mobility";; 68 4) SEN="${SEN}Programming";; 69 5) SEN="${SEN}Concept";; 70 6) SEN="${SEN}Time-Phase";; 71 7) SEN="${SEN}Projection";; 72 8) SEN="${SEN}Hardware";; 73 9) SEN="${SEN}Contingency";; 74 esac 76 echo "\n\"$SEN\"" 77 done

    PEREMENNYE SREDY VYPOLNENIYA

N1 Pervaya cifra chisla N2 Vtoraya cifra chisla N3 Tret'ya cifra chisla NUM CHislo, vvedennoe pol'zovatelem s klaviatury SEN Predlozhenie, poluchennoe iz najdennyh slov OPISANIE ZACHEM NAM NUZHEN jargon? V nashem skorostnom, zapolnennom tehnikoj mire na nas okazyvaetsya bol'shoe davlenie s cel'yu polucheniya kakih-to rezul'tatov. K sozhaleniyu, bystrota sovremennoj tehniki otnositsya k vypolneniyu programm, a ne k ih sozdaniyu. Kogda my sdelali vsego lish' tret'yu chast' programmy, a uzhe pora ee pred座avlyat' na rynok - kak my mozhem sozdat' vpechatlenie, chto nash produkt delaet bol'she, chem na samom dele? Neobhodimo nemnogo pustit' pyl' v glaza zakazchiku. Puskanie pyli sostoit iz fraz, kotorye vyglyadyat i zvuchat vpechatlyayushche. Pri strogoj proverke my mozhem uvidet', chto fraza sostavlena iz nastoyashchih anglijskih slov, znachenie kotoryh mozhno posmotret' v slovare. |ta fraza v celom sovershenno bessmyslenna, no esli nam povezet, to chitatel' etogo ne zametit! Odnim iz prostyh sposobov polucheniya takih veshchej yavlyaetsya nalichie tablicy vzaimozamenyaemyh slov, kotorye mozhno ispol'zovat' dlya sostav- leniya predlozhenij. Esli u vas sistema BSD, to vy mozhete zapustit' jargon vmeste s programmoj fortune, kotoraya imitiruet sluchajnye podar- ki sud'by. Mudrost' vekov mozhet prinadlezhat' vam! CHTO DELAET jargon? Jargon - eto instrument dlya generacii fraz, sostoyashchih iz tehni- cheskih terminov. Stroitsya fraza, kotoraya yavlyaetsya kombinaciej treh slov. Pervye dva slova yavlyayutsya prilagatel'nymi, ispol'zuemymi dlya opisaniya tret'ego slova, imeni sushchestvitel'nogo. Kazhdoe slovo vybira- etsya iz stolbca, soderzhashchego desyat' vozmozhnyh slov. Imenno eto pridaet programme jargon ee tvorcheskie sposobnosti. Ona mozhet ob容dinyat' slovo iz odnogo stolbca s lyubym slovom iz drugogo stolbca dlya postroeniya mnogih poleznyh fraz. Esli vy hotite uvidet' vsyu tablicu slov, vvedite simvol ?. Vot primer tablicy: ----------------------------- | | The Jargon Generator | | Enter a 3 digit number (000-999), ?, or : ? | | 0. Integrated 0. Management 0. Options | 1. Total 1. Organizational 1. Flexibility | 2. Systematized 2. Monitored 2. Capability | 3. Parallel 3. Reciprocal 3. Mobility | 4. Functional 4. Digital 4. Programming | 5. Responsive 5. Logistical 5. Concept | 6. Optional 6. Transitional 6. Time-Phase | 7. Synchronized 7. Incremental 7. Projection | 8. Compatible 8. Operational 8. Hardware | 9. Balanced 9. Third-Generation 9. Contingency | Imeetsya tri vozmozhnyh varianta vvoda. Vy mozhete vvesti trehznach- noe chislo, znak voprosa dlya pechati tablicy ili vozvrat karetki dlya vy- hoda iz programmy. Proveryaetsya, yavlyaetsya li stroka iz treh cifr do- pustimym chislom. Esli vse v poryadke, to vvedennoe chislo razbivaetsya na tri sostavlyayushchie ego cifry. Kazhdaya cifra ispol'zuetsya kak klyuch poiska v massive iz desyati slov dlya polucheniya kuska predlozheniya. Zatem vse slova ob容dinyayutsya dlya formirovaniya zhargonnoj frazy. Posle etogo vam vydaetsya zapros na dal'nejshij vvod. Esli vy vveli znak voprosa, pechataetsya tablica slov, kak pokazano v predydushchem primere, i vam snova vydaetsya zapros. Esli byl vveden tol'ko vozvrat karetki, to cikl, vydavavshij zaprosy, zavershaetsya i za- kanchivaetsya vypolnenie programmy. Vnutri samoj programmy vypolnyaetsya tol'ko proverka na oshibki. Programma jargon organizovana analogichno programme, upravlyaemoj s po- moshch'yu menyu, odnako nikakogo menyu net. |to prosto cikl, kotoryj vypol- nyaetsya do teh por, poka ne budet nazhat vozvrat karetki.

    PRIMERY

1. $ jargon 898 Otkryvaetsya sekret, chto u menya personal'nyj komp'yuter 898, to est' Compatible Third-Generation Hardware (sovmestimaya apparatura tret'ego pokoleniya). 2. $ jargon 187 Okazyvaetsya eto Total Operational Projection (vseob容mlyushchij raz- rabatyvaemyj proekt).

    POYASNENIYA

Stroka 4 pechataet zagolovok pri nachal'nom zapuske programmy. Otobrazhaetsya vozvrat karetki, dve tabulyacii i soobshchenie. Stroki 5-77 predstavlyayut soboj odin bol'shoj beskonechnyj cikl while. V nem imeetsya vsego odna tochka vyhoda, nahodyashchayasya vnutri ope- ratora case. Stroka 7 vyvodit priglashenie, a stroka 8 chitaet vvodimyj otvet v peremennuyu NUM. Stroki 10-30 yavlyayutsya operatorom case, kotoryj proveryaet informa- ciyu, vvedennuyu s klaviatury. Esli byl vveden tol'ko vozvrat karetki, stroka 11 rassmatrivaet eto kak nulevoj vvod. V etom sluchae vypolnya- etsya vyhod iz programmy. |to i est' normal'naya tochka vyhoda. Vvod voprositel'nogo znaka sootvetstvuet stroke 12. Obratite vni- manie, chto znak voprosa ekranirovan. |to vypolneno po toj prichine, chto simvol ? imeet dlya shell special'noe znachenie. On ispol'zuetsya kak predstavitel' lyubogo odinochnogo simvola pri porozhdenii imeni fajla. Dlya togo, chtoby sdelat' znak voprosa obychnym simvolom, my dolzhny ekra- nirovat' ego dlya otmeny special'nogo znacheniya. V strokah 12-24 komanda cat poluchaet tekst iz posleduyushchego frag- menta samoj programmy. Takogo roda fajl inogda nazyvayut "vstroennym dokumentom". Vozmozhnost' obrabotki vstroennogo dokumenta aktiviruetsya posledovatel'nost'yu simvolov <<. Slovo, kotoroe sleduet za nej, yavlya- etsya priznakom nachala-okonchaniya, v dannom sluchae EOF. Posle togo, kak tekst budet vyveden na ekran, stroka 25 prodolzhaet vypolnenie sleduyu- shchej iteracii vneshnego cikla while. Poputno otmetim: dlya togo, chtoby uvidet', kak shell upravlyaet vstroennymi dokumentamm, posmotrite vo vremya raboty komandnogo fajla katalog /tmp. V nem nahoditsya fajl s imenem "shXXXX", gde XXXX - iden- tifikator shell, sozdavshego etot fajl. Ves' vstroennyj dokument celi- kom pomeshchaetsya v etot vremennyj fajl. Zatem shell vypolnyaet peread- resaciyu svoego vhoda na etot vremennyj fajl. Dovol'no prostoj metod. Stroka 26 sootvetstvuet vsem sluchayam vvoda, kogda imeetsya tri simvola. |ti simvoly mogut byt' bukvami i/ili ciframi. V etom meste shell eshche ne znaet, est' li tam bukvy. Dlya proverki togo, chto vse vve- dennye simvoly yavlyayutsya ciframi, my dolzhny ispol'zovat' komandu expr, vypolnyayushchuyu dopolnitel'nyj analiz. Operator expr ukazyvaet, chto nuzhno sravnit' stroku NUM s posledovatel'nost'yu "nachalo stroki, cifra, cif- ra, cifra, konec stroki". Esli sopostavlenie uspeshno, expr vozvrashchaet status uspeshnogo vozvrata i programma idet dal'she. Poskol'ku expr vozvrashchaet chislo sovpavshih simvolov, etot rezul'tat dolzhen byt' pere- napravlen v katalog /dev/null. Esli sravnenie zavershilos' neudachej, aktiviziruetsya operator || (my uzhe videli takogo roda upravlyayushchuyu strukturu ranee), kotoryj pecha- taet soobshchenie ob oshibke i vyzyvaet sleduyushchuyu iteraciyu cikla while. Takoj sintaksis predstavlyaet soboj to zhe samoe, chto i operator if-then-else. Poskol'ku za simvolami || mozhet sledovat' spisok komand, to vnutr' prostyh razdelitelej spiska {} mozhno vstavit' bolee odnoj komandy. Bud'te vnimatel'ny. Esli otsutstvuyut simvoly-razdeliteli, to operator continue vypolnitsya kak posle soobshcheniya ob oshibke, TAK I pri uspeshnom vypolnenii komandy expr. |to mozhet zastavit' vas zanimat'sya otladkoj, poka vy ne obnaruzhite, chto zhe proizoshlo na samom dele. Tochno takuyu zhe proverku chisla mozhno bylo by vypolnit' s pomoshch'yu operatora case. Sintaksis byl by takim zhe, za isklyucheniem zacepochnyh simvolov ^ i $. SHablon dlya operatora case vyglyadel by tak: [0-9][0-9][0-9] statement;; YA ispol'zoval operator expr dlya togo, chtoby pokazat', kakim obra- zom expr mozhet byt' ispol'zovan dlya vypolneniya takogo roda proverki. Lyuboj drugoj vvod perehvatyvaetsya v stroke 28 putem proverki na sovpadenie s universal'nym simvolom-zamenitelem *. Vyvoditsya soobshchenie ob oshibke, i operator continue vyzyvaet sleduyushchuyu iteraciyu cikla while, kotoryj zaprashivaet novyj vvod. Obratite vnimanie, kak shell rassmatrivaet stroki. Komanda test fakticheski vypolnyaet sravnenie znacheniya stroki. Nesmotrya na to, chto komande test(1) posvyashchena svoya stranica spravochnogo rukovodstva, ona yavlyaetsya vstroennoj funkciej shell. Esli pri vyzove komandy test ispol'zovan sintaksis =, !=, to dva argumenta rassmatrivayutsya kak stroki. No esli v komande test ispol'zuetsya sintaksis vida -lt, -eq, to proizvoditsya sravnenie dvuh argumentov-strok kak chisel i vypolnya- etsya ih chislovaya obrabotka. |ti dva razlichnyh rezhima nel'zya smeshivat', t.e. nel'zya sravnivat' stroki pri pomoshchi chislovogo operatora, naprimer str1 -eq str2. V strokah 32-34 kazhdaya cifra vyrezaetsya iz chisla i pomeshchaetsya v svoyu sobstvennuyu peremennuyu. Zatem eti peremennye ispol'zuyutsya v ka- chestve indeksa v operatore case, kotoryj soderzhit magicheskie slova. Stroka 35 inicializiruet peremennuyu SEN dlya sbora predlozheniya. (Pred- varitel'noe zamechanie pered tem, kak my nachnem poluchat' pis'ma ot rev- nitelej chistoty grammatiki - da, my znaem, chto to, chto my generiruem, yavlyaetsya frazoj, a ne nastoyashchim predlozheniem, poskol'ku otsutstvuet glagol.) Nachinaem my s pustogo predlozheniya i dobavlyaem k nemu kazhdyj raz po odnomu slovu. Stroki 37-48 predstavlyayut soboj pervyj operator case. Operator case beret znachenie peremennoj N1 i dobavlyaet slovo s takim nomerom k predlozheniyu. Na samom dele net neobhodimosti vklyuchat' znachenie pere- mennoj SEN v pravuyu chast' prisvaivaniya, poskol'ku eshche nichego net. Od- nako eto delaet tekst programmy bolee gibkim, esli my reshim predvari- tel'no sgenerirovat' pervonachal'noe predlozhenie nekotorymi drugimi sredstvami. Analogichnye operatory case obrabatyvayut dve sleduyushchie cif- ry. Poluchennoe predlozhenie vyvoditsya v stroke 76 posle togo, kak naj- deny vse slova. Vy mogli by skazat', chto vsya eta shtuka predstavlyaet soboj 754 podvig, ili Synchronized Logistical Programming (Sinhronizi- rovannoe logicheskoe programmirovanie).

    MODIFIKACII

Mozhno nemnogo poigrat'sya s etoj programmoj. Vy mogli by poluchat' sluchajnoe chislo, zavisyashchee ot tekushchego sistemnogo vremeni (ispol'zuya izvlechenie i komandu expr) i osnovyvat' poisk na etom chisle, a ne na chisle, vvedennom pol'zovatelem. Vy takzhe mogli by ispol'zovat' kazhduyu cifru sluchajnogo chisla dlya upravleniya vyborom slova iz razlichnyh baz s zhargonnymi terminami, imeya, vozmozhno, po odnomu fajlu dlya kazhdoj iz treh pozicij slova i organizuya cikl na sluchajnoe znachenie dlya chteniya kazhdogo slova. Slova mogli by chitat'sya i udalyat'sya iz fajla do teh por, poka ne prochitaetsya slovo, kotoroe sootvetstvuet sluchajnoj cifre. Imeetsya mnozhestvo drugih vozmozhnostej. Esli vy vovremya ne ostanovi- tes', to obnaruzhite, chto vy napisali komp'yuternuyu igru! -------------------------------------------------------- IMYA: phone -------------------------------------------------------- phone Baza dannyh s telefonnymi nomerami

    NAZNACHENIE

Upravlyaemoe menyu sredstvo, podderzhivayushchee bazu dannyh s telefon- nymi nomerami

    FORMAT VYZOVA

phone

    PRIMER VYZOVA

phone Vyzov telefonnoj bazy dannyh s Vvod opcii poiska russ Poisk nomera telefona Rassa TEKST PROGRAMMY phone 1 : 2 # @(#) phone v1.0 Maintain telephone database Author: Russ Sage 2a Soprovozhdenie telefonnoj bazy dannyh 4 if [ $# -gt 0 ] 5 then echo "phone: argument error" >&2 6 echo "usage: phone" >&2 7 exit 1 8 fi 10 BASE="$HOME/.phone.list" 12 while : 13 do 14 echo " 16 phonebase = $BASE 18 PHONE MENU 19 ---------- 20 add name to list 21 delete name from list 22 edit list 23 search for name in list 24 view complete list 25 - exit program 27 Press a,d,e,s,v or : \c" 28 read RSP 30 case $RSP in 31 "") exit 0 32 ;; 33 a|A) echo "\nEnter name to add ( to exit ): \c" 34 read NAME 35 if [ "$NAME" = "" ] 36 then continue 37 fi 38 echo "Enter description of person: \c" 39 read DESC 40 echo "Enter number to add: \c" 41 read NUM 42 echo "$NAME\t$DESC\t\t\t$NUM" >> $BASE 43 sort -t" " +1 -1.3b -o $BASE $BASE 44 ;; 45 d|D) echo "\nEnter name to delete ( to exit ): \c" 46 read NAME 47 if [ "$NAME" = "" ] 48 then continue 49 fi 50 sed -e "/$NAME/d" $BASE.new 51 mv $BASE.new $BASE 52 ;; 53 e|E) vi $BASE 54 ;; 55 s|S) echo "\nEnter name to search: \c" 56 read NAME 57 echo "\n----------------------------------" 58 grep -y "$NAME" $BASE 59 echo "------------------------------------" 60 ;; 61 v|V) echo "\n\tPhone List\n\t---------" & 62 more $BASE 63 echo "\nhit \c" 64 read RSP 65 ;; 66 *) echo "Not a valid command" 67 ;; 68 esac 69 done

    PEREMENNYE SREDY VYPOLNENIYA

BASE Fakticheskoe imya fajla telefonnoj bazy dannyh DESC Opisanie, vvodimoe v bazu dannyh NAME Imya, vvodimoe v bazu dannyh NUM Nomer telefona, vvodimyj v bazu dannyh RSP Otvet pol'zovatelya na priglashenie OPISANIE ZACHEM NAM NUZHEN phone? Telefony predstavlyayut soboj ochen' vazhnuyu chast' nashego rabochego dnya. My ispol'zuem ih dlya soobshcheniya svoih planov, otdachi rasporyazhenij i dlya mnogih drugih celej. Nemnogo porazmyshlyaem. Esli pochti na kazhdom rabochem meste v SSHA ustanovlen telefon, to telefonnyh nomerov millio- ny. Kakim obrazom vy hranite vse vashi telefonnye nomera? Nam neobhodima ocherednaya baza dannyh. |ta baza dannyh dolzhna up- ravlyat' vvodom dannyh, ih izvlecheniem, modifikaciej i udaleniem. U nas teper' est' opyt v realizacii programm, upravlyaemyh s pomoshch'yu menyu, poetomu imeet smysl ispol'zovat' menyu i zdes'. CHTO DELAET phone? Phone - eto universal'naya utilita dlya ispol'zovaniya i upravleniya bazoj dannyh telefonnyh nomerov. Polnost'yu upravlyaemaya pri pomoshchi me- nyu, phone soderzhit vse neobhodimye funkcii, svyazannye s upravleniem bazoj dannyh: dobavlenie, udalenie, prosmotr, redaktirovanie i poisk. Fajl, predstavlyayushchij soboj bazu dannyh, razmeshchen v vashem regist- racionnom kataloge. |to fajl $HOME/.phone.list. Phone ispol'zuet vash registracionnyj katalog, tak chto odin i tot zhe ispolnyaemyj modul' ra- botaet dlya lyubogo pol'zovatelya. Nezavisimo ot togo, gde razmeshchaetsya komandnyj fajl phone ili kto i otkuda ego zapustil v vashej sisteme, vy vsegda poluchite imenno vash fajl telefonnyh nomerov, poskol'ku on podk- lyuchen k vashemu registracionnomu katalogu posredstvom vstroennoj pere- mennoj shell s imenem HOME. Imeetsya vsego odno glavnoe menyu. Ono vyvoditsya na ekran, i vnizu poyavlyaetsya priglashenie. Bol'shinstvo variantov vybora zaprashivayut do- polnitel'nuyu informaciyu. Menyu vyglyadit tak: ------------------------ | | | phonebase = /usr/russ/.phone.list | | PHONE MENU | ---------- | add name to list (dobavit' imya k spisku) | delete name from list (udalit' imya iz spiska) | edit list (redaktirovat' spisok) | search for name in list (poisk imeni v spiske) | view complete list (prosmotr spiska) | - exit program (vyhod iz programmy) | | Press a,d,e,s,v or : | V verhnej stroke menyu vyvoditsya imya telefonnoj bazy dannyh, koto- ruyu vy ispol'zuete. Esli eto ne vash fajl, vy tochno znaete, chto proi- zoshla oshibka. Opcii vybirayutsya nazhatiem klavishi, sootvetstvuyushchej per- voj bukve slova. Esli byl nazhat tol'ko vozvrat karetki, programma za- vershaetsya.

    PRIMERY

1. $ phone a russ sage unix master 123-4567 Takaya posledovatel'nost' dejstvij ispol'zuetsya dlya dobavleniya eshche odnogo nomera v bazu dannyh. Vyzyvajte menyu, vybirajte opciyu dobavle- niya i v otvet na zaprosy utility phone vvodite imya, opisanie i nomer telefona. 2. $ phone V Prosmotr vseh zapisej v vashej baze dannyh.

    POYASNENIYA

Stroki 4-8 vypolnyayut nekotoruyu proverku na nalichie oshibok. Esli vy vyzvali phone s kakimi-libo argumentami, vyvoditsya soobshchenie ob oshibke i programma zavershaetsya. Poskol'ku phone upravlyaetsya pri pomoshchi menyu, ona ne ispol'zuet argumenty. Stroka 10 inicializiruet peremennuyu BASE imenem fajla telefonnoj bazy dannyh. |to naznachenie vypolnyaetsya s pomoshch'yu peremennoj HOME dlya polucheniya vashego registracionnogo kataloga. Stroki 12-69 predstavlyayut soboj odin bol'shoj beskonechnyj cikl while. Vsya eta struktura podobna strukture drugih programm, upravlyae- myh s pomoshch'yu menyu, kotorye my rassmotreli. Samo menyu vyvoditsya opera- torom echo. Tekst menyu NE vydelen otstupami podobno ostal'noj chasti programmy, poskol'ku operator echo vosprinimaet etot tekst kak lite- ral'nye dannye, vklyuchaya probely. Stroka 28 chitaet otvet pol'zovatelya, a stroki 30-68 predstavlyayut soboj operator case, kotoryj proveryaet znachenie otveta. Esli byl nule- voj vvod, programma zavershaetsya. Esli byla vvedena bukva a, vybiraetsya opciya dobavleniya. (V dejstvitel'nosti kazhdaya opciya proveryaetsya i na verhnem, i na nizhnem registre dlya obespecheniya gibkosti). Tekst programmy, sootvetstvuyushchij dobavleniyu, zaprashivaet imya, opisanie i nomer telefona. Esli vy okaza- lis' v opcii dobavleniya sluchajno, ispol'zujte vozmozhnost' vozvrata pu- tem nazhatiya vozvrata karetki v otvet na zapros imeni. Odnako posle to- go, kak vy vveli imya, vyjti uzhe nel'zya. Vam neobhodimo v etom sluchae pomestit' v bazu fiktivnuyu zapis' ili nazhat' klavishu avarijnogo zaver- sheniya dlya vyhoda iz programmy voobshche. Opisanie mozhet byt' proizvol'noj dliny, odnako ono ne smotritsya, esli ochen' dlinnoe. Posle togo kak vse polya vvedeny, vsya stroka pomeshchaetsya v konec bazy dannyh. Otmetim, chto dobavlyayutsya simvoly tabulyacii dlya razbieniya zapisi na polya. Posle eto- go baza dannyh peresortirovyvaetsya, chtoby novaya zapis' zanyala svoe mesto v alfavitnom poryadke. Esli byla vvedena bukva d, to ona raspoznaetsya v stroke 45. Zap- rashivaetsya udalyaemoe imya. Esli vvoditsya tol'ko vozvrat karetki, opera- tor continue vozvrashchaet nas obratno v cikl while i snova vyvoditsya glavnoe menyu. Dlya udaleniya zapisi ispol'zovana komanda sed, poetomu vvodimoe imya dolzhno ukazyvat'sya tochno v takom zhe vide, kak ono hra- nitsya v fajle. Rezul'tat udaleniya pomeshchaetsya vo vremennyj fajl, koto- ryj zatem v stroke 51 pereimenovyvaetsya v ishodnyj fajl bazy dannyh. Odnoj iz modifikacij mozhet byt' pokaz pol'zovatelyu togo, chto on sobi- raetsya udalyat', i zapros podtverzhdeniya. Esli podtverzhdenie polucheno, to dannye udalyayutsya okonchatel'no. Sejchas sdelano tak, chto vy na samom dele ne znaete, chto imenno sobiraetes' udalyat'. Poetomu neobhodimo tochno ukazyvat' udalyaemoe imya. Zdes' vybran otnositel'no bystryj i ne sovsem chestnyj podhod. A voobshche vy dazhe mogli by ispol'zovat' ne- posredstvenno redaktor vi dlya poiska i udaleniya. Opciya redaktirovaniya v stroke 53 vypolnyaet tol'ko odno - vyzyvaet redaktor vi dlya raboty s bazoj telefonnyh nomerov. Ispol'zuya redaktor vi, vy mozhete vruchnuyu sdelat' fajl bazy dannyh takim, kak vam nuzhno. Zachastuyu format vhodnyh dannyh "plyvet" iz-za raznoj dliny. Vse dannye hranyatsya v svobodnom formate i poetomu ih mozhno kak ugodno smeshchat' vdol' stroki. Kogda vy redaktiruete vash fajl redaktorom vi, vse ego komandy ak- tivny. Dejstvuet dazhe vyhod v shell i vypolnenie obychnyh dejstvij s sistemoj. Poetomu ne zabud'te prekratit' rabotu etogo shell'a, inache vy budete ves'ma udivleny v konce rabochego dnya pri vyhode iz sistemy. Dlya vyhoda iz redaktora i vozvrata k utilite phone ispol'zujte obychnye metody, takie kak ZZ, :x i :wq. Opciya poiska v stroke 55 zaprashivaet imya, kotoroe nuzhno iskat', chitaet eto imya, vyvodit dekorativnye elementy do i posle dannyh i ispol'zuet utilitu grep dlya nahozhdeniya trebuemoj zapisi. Utilita grep v stroke 58 ispol'zuet komandu -y, vyzyvayushchuyu nechuvstvitel'nost' k re- gistru. |to oznachaet, chto vy mozhete proizvodit' vvod iskomogo elementa kak na verhnem, tak i na nizhnem registre. Esli ne najdeno nichego, to nichego i ne vyvoditsya na ekran. Opciya prosmotra nachinaetsya so stroki 61. Snachala vyvoditsya zago- lovok v fonovom rezhime. |to delaetsya dlya bystroty. Na samom dele eto prosto eksperiment dlya togo, chtoby uvidet', budut li asinhronnye soby- tiya proizvodit' vyvod na ekran sinhronno. V dannom sluchae eto imenno tak. Fajl vyvoditsya komandoj more. Poka utilita more postranichno vyvo- dit fajl, vse ee komandy nam dostupny. (Nash komandnyj fajl m v glave 4 illyustriruet, chto my mozhem delat' s pomoshch'yu more.) V stroke 63 vyvoditsya soobshchenie pol'zovatelyu o tom, chto on dolzhen nazhat' vozvrat karetki. Stroka 64 vypolnyaet chtenie. |ta posledovatel'- nost' priderzhivaet raspechatannyj fajl dannyh na ekrane, chtoby ego stroki ne propali pri sdvige vverh. Esli by etih operatorov ne bylo, napechatalos' by glavnoe menyu i my poteryali by to, chto nahodilos' v verhnej chasti ekrana. Stroka 66 vypolnyaet proverku na oshibki dlya menyu v celom. Esli vy vveli dannye, kotorye ne sootvetstvuyut ni odnomu iz predydushchih shablo- nov, to im sopostavlyaetsya shablon *. V etom sluchae pechataetsya soobshchenie ob oshibke, upravlenie perehodit iz operatora case v konec cikla while i pri sleduyushchej iteracii etogo cikla snova pechataetsya glavnoe menyu. ---------------------------------------------------------- IMYA: office ---------------------------------------------------------- office Deloproizvoditel'

    NAZNACHENIE

Obespechivaet prostoj dostup ko mnogim utilitam upravleniya delop- roizvodstvom, kotorye my uzhe rassmotreli.

    FORMAT VYZOVA

office

    PRIMER VYZOVA

office Proveryaet moj pochtovyj yashchik i soobshchaet, pust li on m TEKST PROGRAMMY office 1 : 2 # @(#) office v1.0 Office Manager Author: Russ Sage 2a Deloproizvoditel' 4 if [ $# -gt 0 ] 5 then echo "office: argument error" >&2 6 echo "usage: office" >&2 7 exit 1 8 fi 10 while : 11 do 12 c 13 set `date` 14 echo " 15 $1, $2 $3 $4 17 Office Menu 18 ----------- 19 Mail 20 News 21 Calendar 22 Phone 23 Automatic Reminders 24 Shell Command 25 to exit 27 press m,n,c,p,a,s or : \c" 29 read CMD 31 case $CMD in 32 "") exit;; 33 m|M) if [ -s /usr/spool/mail/$LOGNAME ] 34 then echo 35 ll /usr/spool/mail/$LOGNAME 36 echo "\nWould yuo like to see it ( y/n): \c" 37 read CMD 38 if [ "$CMD" = "y" ] 39 then echo 40 mail 41 fi 42 else echo "\nNo mail today" 43 fi 44 echo "\nhit \c" 45 read CMD;; 46 n|N) PWD=`pwd` 47 cd /usr/news 48 echo "\nThe following files are news item in /usr/news:\n" 49 lc 50 echo "\nEnter filename or to exit: \c" 51 read NAME 52 while [ "$NAME" != "" ] 53 do 54 if [ -s $NAME ] 55 then echo "\n-------------------" 56 cat $NAME 57 echo "---------------------" 58 else echo "$NAME is not a news file" 59 fi 60 echo "\nEnter filename or to exit: \c" 61 read NAME 62 done 63 cd $PWD;; 64 c|C) echo "\n" 65 today 66 if [ -s $HOME/calendar ] 67 then echo "Calendar file:\n`ll $HOME/ calendar`" 68 echo "\nCalendar notifications:" 69 PWD=`pwd` 70 cd $HOME 71 calendar 72 cd $PWD 73 echo "\nCheck your mail for calendar notifications" 74 else echo "\nYou do not have a calendar file at $HOME" 75 fi 76 echo "\nhit \c" 77 read CMD;; 78 p|P) phone;; 79 a|A) greet 80 $HB/at 11:45 echo ^GLunch in 15 minutes 81 $HB/at 16:45 echo ^GShift change in 15 minutes 83 echo "\nYou will receive notices at 11:45 & 4:45" 84 echo "\nWould you like to leave some reminders (y/n): \c" 85 read CMD 86 if [ "$CMD" = "y" ] 87 then echo "\nThe syntax is: at HR:MN executable_phrase" 88 echo "The time now : `date '+%T'`" 89 echo "\n\ncmd ( to exit): \c" 90 read CMD 91 while [ "$CMD" != "" ] 92 do 93 eval $CMD 94 echo "cmd ( to exit ): \c" 95 read CMD 96 done 97 fi;; 98 s|S) echo "\nenter command: \c" 99 read CMD 100 eval $CMD 101 echo "\nhit \c" 102 read CMD;; 103 *) echo "\nInvalid command" 104 echo "\nhit \c" 105 read CMD;; 106 esac 107 done

    PEREMENNYE SREDY VYPOLNENIYA

CMD Soderzhit razlichnye komandy na raznyh urovnyah menyu HOME Eshche odna eksportiruemaya peremennaya, vzyataya iz sredy vypolneniya LOGNAME Shell-peremennaya, predvaritel'no eksportirovannaya NAME Soderzhit imya fajla s novostyami OPISANIE ZACHEM NAM NUZHEN office? Mnogie instrumental'nye sredstva v sisteme UNIX mogut vypolnyat' poleznye funkcii, otnosyashchiesya k deloproizvodstvu. V silu sposoba orga- nizacii UNIX, eto otdel'nye i samostoyatel'nye sredstva. Dlya togo chtoby uznat' o nih, neobhodimo najti vse eti sredstva v spravochnyh ruko- vodstvah, izuchit' kazhdoe iz nih i vse vremya pomnit', kak s nimi rabo- tat'. |to ochen' neudobno. Krome, togo, nam neobhodimo dobavit' ryad moshchnyh komand k nashemu UNIX, vklyuchaya neskol'ko otdel'nyh upravlyaemyh s pomoshch'yu menyu utilit. Kakim obrazom my mozhem vse eto ob'edinit'? Nam neobhodim mehanizm, s pomoshch'yu kotorogo my mozhem poluchit' dostup ko vsem funkciyam, imeyushchim otnoshenie k deloproizvodstvu. Esli ispol'zovat' menyu, my smozhem vyzyvat' kazhduyu funkciyu nazhatiem odnoj klavishi. CHTO DELAET office? Office predstavlyaet soboj popytku sobrat' naibolee chasto ispol'- zuemye funkcii deloproizvodstva v odin paket, upravlyaemyj s pomoshch'yu menyu. Tem samym office uproshchaet vyzov etih funkcij, poskol'ku vam ne obyazatel'no znat', gde eti utility razmeshchayutsya i kak k nim obrashchat'sya. Esli u vas est' pomoshchnik-sekretar' bez vsyakogo opyta raboty v sisteme UNIX, vy mozhete poruchit' emu vypolnenie mnogih iz etih funkcij. Vy mo- zhete dobavit' novye funkcii i urovni menyu, esli eto neobhodimo. V office imeyutsya kak neot容mlemye obshchie funkcii deloproizvodstva, tak i specificheskie dobavki. Dannaya utilita pytaetsya upravlyat' kak osnovnymi funkciyami, tak i krugom zadach po vashemu vkusu. K bazovym funkciyam otnosyatsya pochta, novosti, kalendar' i baza telefonnyh nome- rov. Dobavlyaemye osobennosti vklyuchayut v sebya sistemu napominanij, osnovannuyu na utilite at, i vozmozhnost' zapuska eshche odnogo komandnogo interpretatora shell, ne vyhodya iz programmy office. Blagodarya vsem etim kachestvam, vse nahoditsya v odnom meste i obespechivaetsya prostota dostupa i soprovozhdeniya. Glavnoe menyu soderzhit vse dostupnye funkcii. Ono vyglyadit tak: ----------------------- | | Fri, Jun 20 16:18:23 | | Office Menu | ----------- | Mail (Pochta) | News (Novosti) | Calendar (Kalendar') | Phone (Telefony) | Automatic Reminders (Avtomaticheskie napominaniya) | Shell Command (Perehod v shell) | to exit (Vyhod) | | press m,n,c,p,a,s or : | Den' i data v levom verhnem uglu polucheny komandoj UNIX date. Kazhdyj raz pri vyvode menyu pechataetsya novoe znachenie vremeni. Ono soobshchaet vam o tom, kogda vy nachali rabotat' s etim menyu, i kak dolgo vy rabotali. Pervym variantom vybora yavlyaetsya pochta. Zdes' vash pochtovyj fajl proveryaetsya na nenulevoj razmer. Esli razmer nulevoj (ili takoj fajl otsutstvuet), vyvoditsya soobshchenie "no mail today" (segodnya pochty net). Esli dlya vas est' pochta, to informaciya iz fajla pochtovogo yashchika raspe- chatyvaetsya v dlinnom formate komandoj ls i vyvoditsya zapros o tom, ho- tite li vy prochitat' vashu pochtu. Esli vy skazali "yes" (da), vypolnya- etsya obychnaya komanda UNIX mail. Vtorym variantom vybora yavlyayutsya novosti. Fajly novostej hranyatsya v odnom kataloge, gde kazhdaya porciya novostej predstavlyaet soboj neza- visimyj fajl. Vse porcii novostej hranyatsya v special'nom kataloge s imenem /usr/news. Office vyvodit spisok vseh fajlov novostej i zatem sprashivaet, hotite li vy prosmotret' odin iz nih. Esli da, vvedite imya fajla - i on raspechataetsya komandoj more. My predpolagaem, chto u vas est' setevaya svyaz' mezhdu pol'zovatelyami ili kakoe-to drugoe sredstvo dlya polucheniya novostej. Tretij variant vybora - kalendar'. Poskol'ku s kalendarem svyazana raznoobraznaya informaciya, dannaya opciya podrazdelyaetsya na razlichnye funkcii. Snachala vyvoditsya polnost'yu kalendar' na tekushchij mesyac s vy- delennoj segodnyashnej datoj. |to delaetsya s pomoshch'yu utility today, rassmotrennoj ranee. Zatem vypolnyaetsya obrashchenie k sistemnoj utilite raboty s kalendarem. Esli v vashem registracionnom kataloge est' fajl s imenem calendar, to utilita calendar (vypolnyaemaya komandoj cron dlya prosmotra kazhdogo registracionnogo kataloga) prosmatrivaet zapisi va- shego kalendarya. Esli kakie-libo zapisi otnosyatsya k segodnyashnemu ili zavtrashnemu dnyu, eta utilita posylaet ih vam po pochte. Komandnyj fajl office ispol'zuet neskol'ko inoj podhod. Snachala vash fajl kalendarya proveryaetsya na sushchestvovanie i nenulevoj razmer. Esli fajl sushchestvuet, to on vyvoditsya na ekran v dlinnom formate, tak chto vy mozhete uvidet' sam fajl i informaciyu, otnosyashchuyusya k nemu. Posle etogo vypolnyaetsya funkciya calendar. Pri takom vyzove na standartnoe ustrojstvo vyvoda pechatayutsya vse zapisi, podhodyashchie po vremeni. Utili- ta calendar, vyzyvaemaya komandoj cron, obespechivaet svyaz' tol'ko pri pomoshchi pochty. Esli kalendarnogo fajla net, to vyvoditsya soobshchenie, in- formiruyushchee ob etom. Sleduyushchim variantom vybora yavlyayutsya telefony. Dlya upravleniya ba- zoj dannyh telefonnyh nomerov ispol'zuetsya utilita phone, rassmotren- naya v predydushchem razdele. Poskol'ku pri vyzove phone ne vypolnyaetsya nikakoj predvaritel'noj ili posleduyushchej obrabotki dannyh, vy mozhete perechitat' etot razdel, chtoby vspomnit', kak rabotaet eta utilita. Pyatyj variant vybora - avtomaticheskie napominaniya. |ta opciya prednaznachena dlya togo, chtoby pomogat' vam v slezhenii za vazhnymi mo- mentami vremeni v techenie dnya. Pervym delom ona privetstvuet vas v du- he utility greet. Zatem zapuskayutsya v fonovom rezhime dva komandnyh fajla at. Oni srabatyvayut v 11:45 dlya ob座avleniya o lenche i v 16:45 dlya ob座avleniya o konce rabochego dnya. Esli vy hotite zapustit' nekotorye iz vashih sobstvennyh komandnyh fajlov v fonovom rezhime vypolneniya, ot- vet'te "yes" (da) na sleduyushchij vopros. Dlya napominaniya vyvoditsya sin- taksis utitlity at, pechataetsya tekushchee vremya, i ozhidaetsya vash vvod ko- mand dlya at. Krasivo i prosto v primenenii! (Esli v vashej sisteme ime- etsya vstroennaya vozmozhnost' at, a vy realizovali nashu versiyu at pod drugim imenem ili v drugom kataloge, prosledite za sootvetstvuyushchimi izmeneniyami v tekste komandnogo fajla.) Blagodarya sposobu vypolneniya vvedennoj vami komandy at, vy mozhete vvesti lyubuyu komandu, no ne samu at. Cikl sdelan tak, chto on prinimaet stol'ko komand, skol'ko vam nuzhno. Dlya vyhoda iz cikla vvedite vozvrat karetki. Poslednyaya opciya prednaznachena dlya vypolneniya lyuboj zhelaemoj ko- mandy vne programmy office, ostavayas' tem ne menee v office. Vy dazhe mozhete by zapustit' eshche odin shell vne programmy office (vvedya s kla- viatury sh), a zatem po control-D vernut'sya v office. Net pochti nichego nevozmozhnogo. Dlya vyhoda iz office dostatochno prosto nazhat' vozvrat karetki. Tem samym proizojdet vyhod iz beskonechnogo cikla i vozvrat k predydu- shchemu shell.

    PRIMERY

$ office s sh $ Zapusk office i vybor raboty s shell. Zatem zapusk shell-komandy s imenem sh, t.e. samogo shell. Pri etom vy zapuskaete novyj shell i poluchaete ego simvol priglasheniya. Po okonchanii raboty s etim shell vvedite ^d dlya vyhoda iz nego i vozvrata k glavnomu menyu utility office.

    POYASNENIYA

Stroki 4-8 vypolnyayut proverku na oshibki. Esli vy vyzvali office s kakimi-libo opciyami, to vy sozdali situaciyu oshibki. Stroki 10-107 - eto odin bol'shoj cikl while. Ego struktura podob- na ranee rassmotrennym utilitam, upravlyaemym s pomoshch'yu menyu. Stroka 12 ochishchaet ekran komandoj c (sm. glavu 7). Esli vy ne hotite chitat' s za- beganiem vpered i vklyuchat' v tekst etu komandu, vy mozhete poka pro- pustit' etu stroku ili, esli u vas sistema BSD, ispol'zovat' komandu clear. V stroke 13 pozicionnym parametram prisvaivaetsya rezul'tat ko- mandy date. Stroki 14-27 vyvodyat samo menyu, a stroka 29 chitaet vvodimuyu pol'- zovatelem komandu. Stroki 31-106 predstavlyayut soboj operator case, ko- toryj raspoznaet vvedennuyu komandu i vypolnyaet sootvetstvuyushchie dejstviya. Stroka 32 vypolnyaet vyhod iz programmy office, esli byl vveden tol'ko vozvrat karetki. Stroki 33-45 upravlyayut komandoj mail. Vnachale s pomoshch'yu komandy test proveryaetsya, imeet li fajl s pochtovymi soobshche- niyami razmer bol'she nulya. Esli da, vyvoditsya pustaya stroka i pochtovyj fajl pechataetsya v dlinnom formate komandy ls. Zatem vam zadaetsya vop- ros o tom, hotite li vy prosmotret' pochtu. Esly vy vvodite "y", vyzy- vaetsya komanda mail. Pri lyubom drugom vvode vypolnyaetsya vozvrat v glavnoe menyu. Stroki 46-63 obrabatyvayut komandu novostej. Snachala peremennaya PWD ustanavlivaetsya na nash tekushchij rabochij katalog. |to delaetsya dlya togo, chtoby pri perehode komandoj cd v kakoe-to drugoe mesto, my smog- li po okonchanii obrabotki vernut'sya tuda, gde my nachali rabotat'. Za- tem po komande cd my perehodim v katalog /usr/news. |to katalog, v ko- torom hranyatsya fajly novostej. V sisteme Berkeley dostupen katalog /usr/msgs. |tot katalog ochen' pohozh na /usr/news i mozhet ispol'zo- vat'sya vmesto nego, esli u vas est' takoe zhelanie. Vyvoditsya v vide stolbcov spisok fajlov iz kataloga /usr/news (stroka 49), i vam zada- etsya vopros o tom, hotite li vy posmotret' kakie-nibud' iz etih faj- lov. Esli vy vvodite vozvrat karetki, komanda test vosprinimaet eto kak nulevoj vvod i vypolnyaetsya vyhod iz operatora while. Cikl while vypolnyaetsya do teh por, poka znachenie peremennoj NAME ne ravno nulyu (stroka 52). Vvedennoe imya proveryaetsya na sushchestvovanie. Esli takoj fajl sushchestvuet, to on raspechatyvaetsya komandoj cat, obram- lennoj strokami iz chertochek. Esli fajl ne sushchestvuet, to vyvoditsya soobshchenie o tom, chto takogo fajla novostej net. Zatem vas prosyat vvesti imya drugogo fajla. |tot process prodolzhaetsya v cikle, poka vy ne vvedete tol'ko vozvrat karetki. Kogda vy vyhodite iz cikla v stroke 62, vypolnyaetsya komanda cd dlya vozvrata v tot katalog, otkuda vy nacha- li rabotat'. |ta komanda cd ne okazyvaet nikakogo vliyaniya posle za- puska utility office. Vy dolzhny ukazat' komandu cd vashemu registraci- onnomu shell. Nikakaya drugaya programma, zapushchennaya iz porozhdennogo shell, ne mozhet vypolnit' dlya vas komandu cd. Stroki 64-77 vypolnyayut funkcii kalendarya. Snachala vyvodyatsya dve pustye stroki. Pochemu dve? Potomu chto obychno komanda echo vstavlyaet simvol novoj stroki v konce kazhdoj vyvodimoj stroki, a vyvodimoj v dannyj moment strokoj yavlyaetsya eshche odin simvol novoj stroki. Zatem v stroke 65 zapuskaetsya programma today. Ona pechataet izobrazhenie kalen- darya na mesyac. Stroka 66 proveryaet, imeetsya li kalendarnyj fajl v va- shem registracionnom kataloge. Esli da, on vyvoditsya v dlinnom formate komandy ls v stroke 67. Pechataetsya takzhe soobshchenie-zagolovok "Calendar Notifications" (kalendarnye izveshcheniya). Stroka 69 zapominaet tekushchij rabochij katalog peremennoj PWD. Za- tem my perehodim komandoj cd v katalog $HOME, chtoby nahodit'sya v tom zhe kataloge, chto i kalendarnyj fajl. V stroke 71 vyzyvaetsya komanda UNIX calendar. Ona prosmatrivaet kalendarnyj fajl i vyvodit vse podho- dyashchie po vremeni soobshcheniya. Po komande cd my vozvrashchaemsya v nash ishod- nyj katalog dlya togo, chtoby vosstanovit' poryadok. Stroka 73 vyvodit soobshchenie, chtoby vy proverili vashu pochtu na nalichie kalendarnyh za- pisej. Kak ukazyvalos' ranee, komanda calendar rabotaet dvumya sposoba- mi. Operator else v stroke 74 vyvodit vam soobshchenie, esli u vas net kalendarnogo fajla. Po zavershenii operatora if, v strokah 76 i 77 pe- chataetsya soobshchenie o tom, chto nuzhno nazhat' vozvrat karetki, i vypolnya- etsya operator read. |to blokiruyushchee chtenie, kotoroe oznachaet ostanovku i ozhidanie kakogo-libo vvoda. |to protivopolozhnost' neblokiruyushchemu chteniyu, ili bolee shiroko izvestnoj tehnike chteniya s oprosom. Opros vozmozhen v programmah, napisannyh na Si, no zapusk oprosa v shell mo- zhet potrebovat' nemnogo bol'shih usilij. Dlya izucheniya chteniya s oprosom oznakom'tes' s glavoj, opisyvayushchej terminal'nye ustrojstva. Stroka 78 upravlyaet komandoj phone. Ona vyzyvaet utilitu phone, kotoruyu my rassmotreli ranee, posle chego upravlenie peredaetsya v konec cikla while. Pechataetsya glavnoe menyu, i vse nachinaetsya snachala. Stroki 79-97 upravlyayut avtomaticheskimi napominaniyami. Snachala za- puskaetsya programma greet. Ona byla opisana ranee v etoj glave. Zatem v strokah 80 i 81 v rezhime fonovogo vypolneniya vyzyvayutsya dva komand- nyh fajla at, kotorye vypolnyatsya pozzhe v techenie dnya. V stroke 84 vam zadaetsya vopros, zhelaete li vy ostavit' kakie-to svoi napominaniya. Esli vy otvechaete "y", vypolnyayutsya stroki 87-96. Esli vy ne vveli "y", operator else ne vypolnyaetsya, poetomu upravlenie peredaetsya glavnomu menyu. Vy vidite, chto eta vozmozhnost' predpolagaet odnokratnoe ispol'- zovanie v techenie dnya. Stroki 87-89 vyvodyat nekotoruyu informaciyu, neobhodimuyu dlya togo, chtoby vy zaveli dlya sebya napominaniya. Vyvoditsya sintaksis programmy at, tekushchaya data (tol'ko vremya) i zatem priglashenie vvodit' vashu ko- mandu. Stroka 90 chitaet vashu komandu. Stroka 91 oznachaet, chto esli byl vveden ne tol'ko vozvrat karetki, to nuzhno vypolnit' etot cikl. Poeto- mu cikl while prodolzhaetsya, poka vy ne nazhmete tol'ko vozvrat karetki. Stroka 93 pytaetsya vypolnit' komandu, kotoruyu vy vveli. Komanda eval ispol'zuetsya dlya togo, chtoby raskryt' znacheniya teh peremennyh, kotorye mogli byt' ne raskryty ranee. Stroka 94 prosit vvesti sleduyushchuyu koman- du, a stroka 95 chitaet ee. Poskol'ku chtenie stoit v samom konce cikla, operator while vypolnyaet proverku novogo vvoda s klaviatury. Stroki 98-102 upravlyayut vyhodom v shell. |ta chast' programmy poch- ti identichna ciklu, ispol'zovannomu dlya napominanij. Nam vydaetsya priglashenie na vvod komandy, ona zachityvaetsya v peremennuyu, zatem de- laetsya sintaksicheskij razbor etoj peremennoj s pomoshch'yu komandy eval. Esli vy hotite perejti v shell, vypolnite komandu sh - i ona porodit shell. Stroki 101 i 102 ne dayut poyavit'sya na ekrane glavnomu menyu do teh por, poka vy ne nazhmete vozvrat karetki. Stroki 103-105 vypolnyayut proverku na oshibki vvoda. Lyubaya nepra- vil'naya komanda popadaet syuda. Vyvoditsya soobshchenie ob oshibke i vyda- etsya priglashenie "hit " (nazhmite vozvrat karetki).

    * GLAVA 6. UPRAVLENIE LICHNOJ INFORMACIEJ II: *

    OSVEDOMLENNOSTX POLXZOVATELYA

    I ZASHCHITA LICHNOJ INFORMACII

    OSVEDOMLENNOSTX POLXZOVATELYA

activ pokazat' aktivnost' terminalov info pokazat' informaciyu o parolyah pol'zovatelej uchk posmotret' processy drugih pol'zovatelej watch nablyudat' za registraciej v sisteme whox komanda who s dopolnitel'nymi vozmozhnostyami

    ZASHCHITA LICHNOJ INFORMACII

acme pokazat' uchetnuyu informaciyu inuse zapretit' ispol'zovanie terminala lock blokirovat' i razblokirovat' fajly UPRAVLENIE LICHNOJ INFORMACIEJ II:

    OSVEDOMLENNOSTX POLXZOVATELYA

    I ZASHCHITA LICHNOJ INFORMACII

    VVEDENIE

My uzhe razrabotali celyj ryad instrumental'nyh sredstv, kotorye pomogayut nam bolee effektivno upravlyat' nashej lichnoj informaciej. Od- nako my rabotaem ne v vakuume. Kazhdyj iz nas rabotaet s drugimi lyud'mi i obychno ispol'zuet sistemu vmeste s drugimi pol'zovatelyami. Po neskol'kim prichinam vazhno imet' predstavlenie o tom, chto delayut v sisteme drugie lyudi. Vo-pervyh, u nas mozhet vozniknut' neobhodimost' nametit' rabotu, intensivno ispol'zuyushchuyu processor, na to vremya, kogda zagruzka sistemy nevelika. Izuchenie tipichnyh variantov zagruzki siste- my mozhet pomoch' nam splanirovat' takuyu rabotu i sotrudnichat' s drugimi pol'zovatelyami so vzaimnoj vygodoj. Nam takzhe mozhet ponadobit'sya znat', nahoditsya li kto-to na svoem rabochem meste, chtoby my mogli pogovorit' s nim, ili znat', chto kto-to ochen' zanyat i byl by nedovolen, esli ego prervut. Nakonec, sushchestvuyut voprosy zashchity informacii, kotorym my udelim bol'she vnimaniya v posleduyushchih glavah. Osnovoj zashchity informacii yavlya- etsya osvedomlennost' o tom, chto delayut drugie - i, vozmozhno, o tom, chto oni ne dolzhny delat'. Poetomu my zdes' predstavim dve gruppy instrumental'nyh sredstv. Sredstva OSVEDOMLENNOSTI POLXZOVATELYA pomogayut nam sledit' za tem, chto delayut drugie, i tem samym uprostit' svyaz' s nimi. Sredstva LICHNOJ ZA- SHCHITY vazhny dlya zashchity nashej uchetnoj informacii i nashih dannyh i dlya polucheniya informacii o nashih sobstvennyh dejstviyah. Pervaya gruppa rassmatrivaemyh zdes' sredstv, otnositsya k "osve- domlennosti pol'zovatelya". |timi sredstvami yavlyayutsya activ, info, uchk, watch i whox. Komandnyj fajl activ predstavlyaet soboj modifikaciyu komandy who, pokazyvayushchuyu imya kazhdogo pol'zovatelya, nomer terminala i svedeniya o tom, naskol'ko davno dannoe lico vvodilo chto= libo s klaviatury. Po etoj informacii my mozhem skazat', kto eshche rabotaet v sisteme, aktivno li oni rabotayut i, esli oni ispol'zuyut zakreplennye linii, to gde oni nahodyatsya. Sleduyushchee sredstvo - info. Ono predostavlyaet vozmozhnost' poluchit' informaciyu o parolyah vseh ukazannyh v spiske pol'zovatelej. S pomoshch'yu etoj utility vy mozhete poluchit' obshchuyu informaciyu ob etih pol'zovatelyah i uvidet', gde razmeshchayutsya ih registracionnye katalogi. Eshche odno informativnoe sredstvo - uchk. |tot komandnyj fajl pole- zen dlya vyyasneniya togo, chto delaet ukazannyj pol'zovatel' v nastoyashchee vremya. Po etoj informacii vy mozhete skazat', prostaivayut li oni ili zhe delayut chto-to vazhnoe i ih nel'zya preryvat'. Sleduyushchee sredstvo - watch. |ta programma pohozha na "demon", ko- toryj vypolnyaetsya v fonovom rezhime i postoyanno sledit za registraciej opredelennyh pol'zovatelej. Kogda nuzhnoe vam lico registriruetsya, na vash terminal posylaetsya soobshchenie o tom, chto dannyj pol'zovatel' voshel v sistemu. Takim obrazom, vy mozhete prodolzhat' rabotu vmesto togo, chtoby postoyanno preryvat' ee. Poslednyaya utilita v dannom razdele - eto whox. Whox daet vam ischerpyvayushchie svedeniya obo vseh pol'zovatelyah, zaregistrirovavshihsya na mashine. Vy mozhete poluchit' informaciyu, pohozhuyu na rezul'tat komandy who, kotoraya otsortirovana razlichnym obrazom, otobrazit' informaciyu o terminalah ili dazhe peredat' pochtovoe soobshchenie lyubomu pol'zovatelyu.

    OSVEDOMLENNOSTX POLXZOVATELYA

------------------------------------------------------------ IMYA: activ ------------------------------------------------------------- activ Pokazyvaet aktivnost' terminalov

    NAZNACHENIE

Pokazyvaet imena vseh zaregistrirovannyh pol'zovatelej, nomera ih terminalov i vremya, kogda oni poslednij raz rabotali s klaviaturoj.

    FORMAT VYZOVA

activ

    PRIMER VYZOVA

activ Vyvodit na ekran informaciyu ob aktivnosti pol'zovatelej na svoih terminalah

    TEKST PROGRAMMY

1 : 2 # @(#) activ v1.0 Display terminal activity Author: Russ Sage 2a Pokazat' aktivnost' terminalov 4 if [ $# -gt 0 ] 5 then echo "activ: argument error" >&2 6 echo "usage: activ" >&2 7 exit 1 8 fi 10 who -u | cut -c1-17,38-42 OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL activ? Pervonachal'no komp'yutery ispol'zovalis' isklyuchitel'no dlya zapuska zamknutyh, nezavisimyh zadach obrabotki informacii. Poyavlenie mnogo- pol'zovatel'skih sistem sdelalo vozmozhnym po krajnej mere elementarnoe obshchenie pol'zovatelej mezhdu soboj. Takoe obshchenie v nastoyashchee vremya yav- lyaetsya aspektom vozrastayushchej vazhnosti pri rabote s komp'yuterom. Sistema UNIX predostavlyaet komandy mail i write dlya paketnogo i interaktivnogo dialoga sootvetstvenno. S pomoshch'yu telefona my ne mozhem skazat', dostupen li kto-libo dlya obshcheniya s nami, poka ne pozvonim i ne pogovorim, vozmozhno, s odnim ili neskol'kimi drugimi lyud'mi. Poskol'ku sistema UNIX postoyanno zapisyvaet informaciyu o deyatel'nosti pol'zovatelej, bylo by poleznym umet' ispol'zovat' etu informaciyu, chtoby uznat', kto dostupen dlya obshcheniya, i poluchit' obshchee predstavlenie o tom, chem oni zanimayutsya. Posle etogo my mozhem reshat', kak i kogda my hotim svyazat'sya s nimi. Activ mozhet rasskazat' nam o tom, skol'ko vremeni proshlo s teh por, kogda kto-libo nazhimal klavishi na svoej klaviature. Esli v vashej mashine est' vydelennye linii, to vy takzhe mozhete uznat', nahoditsya li dannoe lico na svoem rabochem meste. CHTO DELAET activ? Activ pechataet informaciyu ob aktivnosti vseh pol'zovatelej siste- my. Raspechatka soderzhit imya pol'zovatelya, nomer terminala, na kotorom on zaregistrirovalsya, i vremya poslednego obrashcheniya k klaviature. Esli klaviatura byla ispol'zovana v techenie poslednej minuty, etot terminal otmechaetsya tochkoj. Esli terminal ne byl ispol'zovan v techenie posled- nih 24 chasov, naprotiv nego pechataetsya slovo "old". Vo vseh ostal'nyh sluchayah vyvoditsya vremya poslednego ispol'zovaniya terminala v minutah i sekundah. Vot primer takoj raspechatki: ------------------------ | | root tty01 01:23 | sage tty05 . | batch tty12 old | nuucp tty16 . | Vazhnym voprosom yavlyaetsya to, kak sistema uznaet, kogda kto-libo rabotaet s klaviaturoj? Poskol'ku terminal'nye ustrojstva yavlyayutsya fajlami, my mozhem sobrat' informaciyu o terminale putem prosmotra sostoyaniya fajla, svyazannogo s nim. V dannom sluchae iskomaya informaciya - vremya poslednego ispol'zovaniya klaviatury. To, chto my ishchem, uzhe est' v sisteme. |to opciya -u komandy who. |ta opciya, odnako, sushchestvuet tol'ko v sisteme AT&T UNIX System V, po- etomu komanda activ, po krajnej mere v predstavlennom vide, mozhet byt' realizovana tol'ko v etoj sisteme. Activ beret vyhod komandy "who -u" i "otrezaet" nekotorye dannye, ne imeyushchie otnosheniya k nashej celi. Putem prob i oshibok, a zatem proverki ishodnogo koda ya obnaruzhil, chto znachenie, ispol'zuemoe v komande "who -u", yavlyaetsya vremenem "mo- difikacii" fajla ustrojstva, kotoroe soobshchaet sistemnyj vyzov stat(2). Na stranicah rukovodstva po stat daetsya polnaya tablica sistemnyh vyzo- vov, kotorye izmenyayut vremennye harakteristiki fajlov. V tabl. 6.1 predstavleny eti harakteristiki: Tablica 6.1 Vremennye harakteristiki fajla -------------------------------------------------------------- Vremennye Sistemnye vyzovy, izmenyayushchie vremennye harakteristiki harakteristiki -------------------------------------------------------------- Vremya dostupa creat, mknod, pipe, utime, read Vremya modifikacii creat, mknod, pipe, utime, write Vremya sozdaniya creat, mknod, pipe, utime, write, chmod, chown, link -------------------------------------------------------------- Davajte na nekotoroe vremya otvlechemsya i pogovorim o tom, chto eti vremennye harakteristiki oznachayut i kak oni mogut byt' modificirovany. Odno interesnoe zamechanie: UNIX daet vam kak obychnomu pol'zovatelyu vozmozhnost' ustanovit' lyuboe vremya dostupa i vremya modifikacii fajla po vashemu zhelaniyu. |to i horosho, i ploho. |to obespechivaet gibkost', kogda delo kasaetsya informacii indeksnogo deskriptora fajla, no takzhe pozvolyaet skryvat' sledy pri narushenii zashchishchennoj informacii. Voz'mem, naprimer, fajl login. Kto-nibud' mog by vstavit' novuyu stroku regist- racii pered staroj i zatem vernut' vremya dostupa i vremya modifikacii v ishodnye znacheniya. Togda by nikto, prosmatrivaya fajl /bin/login koman- doj ls, ne smog by skazat', chto fajl byl izmenen. Odnako v sisteme UNIX imeetsya tret'e vremya - vremya sozdaniya. Sistema ne pozvolyaet vam izmenit' eto vremya pri pomoshchi obychnyh komand. Sistemnyj vyzov utime(2) obespechivaet izmenenie tol'ko vremeni dostupa i modifikacii. Komanda touch(1) takzhe mozhet izmenit' vremya dostupa i modifikacii, no ne vremya sozdaniya. Komanda touch stroitsya tol'ko na sistemnom vyzove. Ona mozhet delat' ne bol'she togo, chto obespechivaet sistemnyj vyzov. Komanda fsdb(1) (otladchik fajlovoj sistemy) yavlyaetsya edinstvennym sposobom preodoleniya zashchity ot izmeneniya vremeni sozda- niya. No dazhe fsdb ne mozhet upravlyat' vremenem sozdaniya. Vy dolzhny vyj- ti za predely podderzhivaemyh fsdb trebovanij bezopasnosti. Kak eto sdelat', pokazano v posleduyushchih glavah. V sluchae izmeneniya registracionnoj zapisi, rassmotrennom vyshe, vy mogli by posmotret' na vremya sozdaniya i uvidet', chto ono ochen' blizko k tekushchemu vremeni. Esli zhe kto-libo ispol'zoval fsdb dlya poddelki vremeni sozdaniya, vy nikogda ne budete imet' uverennosti v tom, chto fajl ne byl izmenen. Kakoe zhe vse eto imeet otnoshenie k opredeleniyu togo, delal li pol'zovatel' chto-libo nedavno za svoim terminalom? Vremya modifikacii izmenyaetsya vyzovom write(2). Poetomu predstavlyaetsya razumnym, chto za- pis' na terminal budet imet' mesto, kogda drajver chitaet simvol, a za- tem posylaet ego obratno na ekran. Po mere togo, kak kto-to nazhimaet na klavishi, vremya modifikacii postoyanno obnovlyaetsya pri eho-otobrazhe- nii simvolov. Kogda simvoly perestayut postupat' s klaviatury, priosta- navlivaetsya zapis' v fajl terminala. Formula dlya opredeleniya posledne- go vremeni raboty za terminalom (last_activity) takova: last_activity = time(NULL) - mod_time, gde mod_time - vremya modifikacii. |ta formula zakodirovana vnutri ko- mandy who(1). Otmetim, chto vyzov komandy time so znacheniem NULL vozv- rashchaet istinnoe tekushchee vremya. Komanda activ ne imeet opcij. Esli vy ispol'zuete opcii, napecha- taetsya soobshchenie ob oshibke.

    POYASNENIYA

V strokah 4-8 vypolnyaetsya proverka na nalichie oshibok. Esli chislo argumentov komandnoj stroki bol'she nulya, na standartnoe ustrojstvo re- gistracii oshibok vyvoditsya soobshchenie i programma zavershaetsya s neudach- nym statusom. Stroka 10 - eto komanda, vypolnyayushchaya vyvod. Komanda who vyzvana s opciej -u dlya polucheniya osnovnyh dannyh. Zatem ee vyhod po konvejeru peredaetsya komande cut, kotoraya otobrazhaet kolonki 1-17 i 38-42. Tem samym pechataetsya tol'ko tri polya, kak pokazano v nashem predydushchem pri- mere. ------------------------------------------------------------ IMYA: info ------------------------------------------------------------ info Vyvod na ekran informacii o parole pol'zovatelya

    NAZNACHENIE

Pechataet informaciyu polya kommentariya iz fajla /etc/ passwd dlya ukazannogo pol'zovatelya.

    FORMAT VYZOVA

info login_name [ login_name ... ]

    PRIMER VYZOVA

info russ Pechataet informaciyu, kotoraya hranitsya o pol'zovatele russ

    TEKST PROGRAMMY

1 : 2 # @(#) info v1.0 Display password info on a user Author: Russ Sage 2a Otobrazit' parol'nuyu informaciyu pol'zovatelya 4 for NAME in $@ 5 do 6 USER=`grep "^${NAME}:" /etc/passwd` 7 echo "$NAME:\t`echo ${USER}|cut -d: -f6`\t` echo ${USER}|cut -d: -f5`" 8 done

    PEREMENNYE SREDY VYPOLNENIYA

NAME Kazhdoe imya, ukazannoe v komandnoj stroke USER Polnaya zapis' v fajle /etc/passwd dlya dannogo imeni OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL info? Sistema UNIX ispol'zuet konfiguracionnye fajly dlya hraneniya osnovnoj informacii o pol'zovatelyah i drugoj sistemnoj informacii. Od- nimi iz naibolee populyarnyh konfiguracionnyh fajlov yavlyayutsya /etc/group, /etc/passwd i /etc/inittab. Dlya polucheniya informacii o pol'zovatelyah nam neobhodimo zaglyanut' v eti fajly. V sisteme Berkeley imeetsya komanda finger, kotoraya poluchaet in- formaciyu o pol'zovatelyah iz ih registracionnyh katalogov i iz fajla parolej. V System V ne tak mnogo programm, vypolnyayushchih takogo roda ra- botu, poetomu nam neobhodimo razrabotat' ih. CHTO DELAET info? Info - eto komandnyj fajl, kotoryj poluchaet informaciyu iz regist- racionnogo kataloga i kommentarij o pol'zovatele iz fajla /etc/passwd. Rezul'tat vyglyadit tak: ------------------- | | name: home dir comments | imya: registracionnyj katalog kommentarii | Esli v vashej sisteme ispol'zuetsya eto pole kommentariev, to eta informaciya mozhet byt' poleznoj. "Vruchnuyu" vypolnit' prosmotr pol'zova- telej v fajle parolej mozhno sleduyushchim obrazom: grep login_name /etc/passwd Pri etom raspechatyvaetsya vsya stroka so vsemi polyami dannyh. Info beret eti neobrabotannye dannye i vydelyaet iz nih katalog registracii pol'zovatelya i pole kommentariya. V komandnoj stroke mozhno ukazat' neskol'ko registracionnyh imen. Kazhdoe imya beretsya po poryadku iz komandnoj stroki.

    PRIMER

$ for NAME in `cat /etc/passwd | cut -d: -f1` > do > NAMELIST="$NAMELIST $NAME" > done; info $NAMELIST Imya kazhdogo pol'zovatelya v fajle parolej dobavlyaetsya k spisku imen. Zatem etot spisok peredaetsya v komandnuyu stroku info, kotoraya pechataet vse dannye. Smysl komandy: "Daj mne informaciyu obo vseh pol'- zovatelyah sistemy".

    POYASNENIYA

Stroki 4-8 - eto cikl for, kotoryj obrabatyvaet vse imena, pere- dannye v komandnoj stroke. Dlya kazhdogo peredannogo imeni vypolnyayutsya stroki 6 i 7. V stroke 6 v peremennuyu USER zanositsya rezul'tat komandy grep, zaklyuchennoj mezhdu simvolami udareniya (`). Nachinaya s nachala stroki (oboznacheno simvolom ^), grep ishchet imya, za kotorym sleduet simvol dvo- etochiya (:). Takoe ukazanie zastavlyaet vypolnyat' poisk obrazca tol'ko v pervom pole fajla parolej. V stroke 7 my otobrazhaem nashu vyhodnuyu stroku komandoj echo, vnutri kotoroj vlozheny drugie komandy echo. My mogli by poluchat' ele- menty informacii otdel'no, prisvaivaya ih znacheniya otdel'nym peremen- nym, i zatem sozdavat' neobhodimyj format vyvoda, ispol'zuya znacheniya etih peremennyh. Odnako pomeshchenie vsej informacii v komandnuyu stroku rabotaet bystree, i tekst programmy bolee kompaktnyj, hotya i ne ochen' chitabel'nyj. My mozhem takzhe ispol'zovat' simvoly formatirovaniya v ko- mande echo dlya formatirovaniya nashej raspechatki. Snachala otobrazhaetsya imya v tom zhe vide, kak ono polucheno iz ko- mandnoj stroki. Zatem vyvoditsya tabulyaciya (\t). Za pervoj tabulyaciej sleduet pole nomer shest' iz fajla parolej. Poskol'ku my eshche ne imeem etih dannyh, my dolzhny vydelit' ih iz znacheniya peremennoj USER, koto- ruyu my uzhe imeem iz predydushchej stroki. CHtoby sdelat' eto, my komandoj echo vyvodim vsyu stroku i vydelyaem shestoe pole, ispol'zuya razdelyayushchie dvoetochiya. Posle etogo polya my vyvodim eshche odnu tabulyaciyu i zatem pya- toe pole fajla parolej. My poluchili eto pole takim zhe obrazom, kak i shestoe pole - eho-otobrazheniem i vydeleniem. Takaya tehnika polucheniya dannyh medlennaya, poskol'ku vovlecheny vse processy, no eto samyj bystryj put' sdelat' eto na yazyke shell. Koman- da awk byla by ponyatnee i, vozmozhno, bystree, no nasha realizaciya de- monstriruet gibkost' yazyka shell. YAzyk shell mozhet vypolnyat' pochti vse, no ne vsegda luchshim obrazom. Vot pochemu v nekotoryh sluchayah my ispol'zuem yazyk Si, v chem vy ubedites' po mere prodvizheniya po nashej knige. ----------------------------------------------------------- IMYA: uchk ----------------------------------------------------------- uchk Proverka processov, zapushchennyh drugim pol'zovatelem

    NAZNACHENIE

Otobrazit' vse processy kazhdogo pol'zovatelya, ukazannogo v ko- mandnoj stroke

    FORMAT VYZOVA

uchk [-a] login_name [...]

    PRIMER VYZOVA

uchk -a Vyvod vseh processov, zapushchennyh administratorami

    TEKST PROGRAMMY

1 : 2 # @(#) uchk v1.0 Check processes of another user Author: Russ Sage 2a Proverka processov drugogo pol'zovatelya 4 trap "rm /tmp/ps$$ 2> /dev/null" 0 1 2 3 15 6 if [ $# -eq 0 ] 7 then echo "uchk: argument error" >&2 8 echo "usage: uchk [-a] login_name [ ... ]" >&2 9 exit 1 10 fi 12 if [ "`echo $1 | cut -c1`" = "-" -a "$1" != "-a" ] 13 then echo "uchk: invalid argument $1" >&2 14 echo "usage: uchk [-a] login_name [ ... ]" >&2 15 exit 1 16 fi 18 ADMIN="administrators names go here" 19 if [ "$1" = "-a" ] 20 then shift 21 set $ADMIN $@ 22 fi 24 ps -ef > /tmp/ps$$ 25 for NAME 26 do 27 echo 28 fgrep "$NAME" /tmp/ps$$ 29 done

    PEREMENNYE SREDY VYPOLNENIYA

ADMIN Stroka s imenami pol'zovatelej, yavlyayushchihsya administratorami v vashej sisteme NAME Soderzhit kazhdoe imya, schityvaemoe iz komandnoj stroki OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL uchk? Poskol'ku UNIX yavlyaetsya mnogopol'zovatel'skoj sistemoj, mnozhestvo zadach vypolnyayutsya odnovremenno. Edinstvennyj sposob sledit' za takimi zadachami - s pomoshch'yu komandy ps. Ps - eto dovol'no specifichnaya komanda v tom smysle, chto ona dolzhna obrashchat'sya k pamyati (/dev/mem) i proho- dit' po svyazannomu spisku struktur processa. |to tyazhelaya veshch', poetomu nelegko sdelat' svoyu sobstvennuyu komandu dlya vyvoda takogo roda infor- macii. Vdobavok pamyat' zashchishchena, i dostup k nej imeet tol'ko pol'zova- tel' root. Tak chto my dolzhny ili udovletvorit'sya opciyami, kotorye daet ko- manda ps, ili modificirovat' vyvod etoj komandy. Uchk skoree otnositsya k poslednej kategorii. Mne hotelos' poluchit' spisok sostoyanij pro- cessov po imeni pol'zovatelya, a ne smes' informacii, otnosyashchejsya k raznym pol'zovatelyam. Hotya to, chto ya hotel, ne sootvetstvuet ni odnoj iz standartnyh opcij komandy ps, ya smog modificirovat' ee vyhod dlya polucheniya togo, chto mne nado. CHTO DELAET uchk? Uchk - eto sredstvo, kotoroe generiruet, analiziruet i soobshchaet o processah, zapushchennyh kazhdym ukazannym pol'zovatelem. Za odin raz vy mozhete proverit' stol'ko pol'zovatelej, skol'ko vam nuzhno. Vse pro- cessy dlya kazhdogo pol'zovatelya pechatayutsya vmeste. CHtoby delat' eto, uchk dolzhen rabotat' s vremennymi fajlami. Sistema UNIX ves'ma elegantno upravlyaet vremennymi fajlami. Shell poz- volyaet ispol'zovat' identifikator processa dlya sozdaniya unikal'nyh imen fajlov dlya kazhdogo zapuska. Posle togo kak utilita zapushchena, vre- mennye fajly ochishchayutsya putem ispol'zovaniya komandy trap v shell'e. Ko- manda trap udalyaet fajl, esli chto-libo prervalo vypolnenie komandnogo fajla ili kogda programma zavershaetsya. |to prekrasnaya osobennost', ko- toraya isklyuchaet nakoplenie sluchajnyh fajlov v sisteme. Esli uchk byla vyzvana bez argumentov ili byla ispol'zovana nedo- pustimaya opciya, to pechataetsya soobshchenie ob oshibke i vypolnenie zaver- shaetsya. Uchk imeet peremennuyu ADMIN, kotoraya opredelyaet vseh administra- torov vashej sistemy. Otredaktirujte simvol'nuyu stroku, prisvaivaemuyu peremennoj ADMIN, ukazav imena administratorov, kotoryh vy hotite pro- verit'. Imena dolzhny byt' razdeleny probelami. |to pozvolit vam prove- ryat' processy vashih administratorov, ukazyvaya opciyu -a v komandnoj stroke. Vse ostal'nye imena dolzhny byt' ukazany v komandnoj stroke. Estestvenno, vy takim zhe obrazom mogli by ustanovit' drugie gruppy pol'zovatelej. Slezhenie za administratorami pomozhet vam ocenit', kak oni upravlyayut sohrannost'yu informacii, a takzhe raspoznat' administra- tivnye zadachi, kotorye imeyut sklonnost' zagruzhat' processor.

    PRIMER

$ uchk -a russ uucp Pokazyvaet processy vseh administratorov, moi sobstvennye, i pro- cessy uucp po poryadku. Vse soobshcheniya ob oshibkah vyvodyatsya na standart- noe ustrojstvo registracii oshibok, a spiski processov vyvodyatsya na standartnoe ustrojstvo vyvoda.

    POYASNENIYA

Stroka 4 - eto operator trap. Simvol'naya stroka mezhdu dvojnymi kavychkami soderzhit komandy, kotorye dolzhny byt' vypolneny, kogda pro- ishodit preryvanie. V etom sluchae my udalyaem vremennyj fajl i peread- resovyvaem vse vyhodnye dannye na nulevoe ustrojstvo. Kogda komanda rm pytaetsya udalit' nesushchestvuyushchij fajl, vyvodyatsya soobshcheniya ob oshibkah. Poskol'ku my ne znaem, kakie fajly mogut byt' v nalichii v tot moment, kogda vozniknet preryvanie, to my hotim izbavit'sya ot soobshchenij ob oshibkah. Operator trap aktiviziruetsya po vyhodu iz programmy (program exit, signal 0), razryvu linii (hangup, signal 1), preryvaniyu (interrupt, signal 2), vyhodu (quit, signal 3) ili programmnomu zaver- sheniyu (software termination, signal 15). V strokah 6-10 proveryaetsya, peredany li kakie-libo argumenty. Esli vy vyzvali uchk bez argumentov, vyvoditsya soobshchenie ob oshibke i uchk zavershaetsya. V strokah 12-16 proveryaetsya, ukazana li kakaya-to opciya so znakom minus i yavlyaetsya li ona opciej -a - edinstvenno dopustimoj opciej. Ko- mandnyj fajl delaet eto, primenyaya komandy proverki dlya sravneniya dvuh razlichnyh sluchaev. Pervaya proverka vyrezaet pervyj simvol pervogo po- zicionnogo parametra i smotrit, yavlyaetsya li on simvolom "-". Sleduyushchaya proverka delaetsya dlya togo, chtoby uvidet', chto pervyj pozicionnyj pa- rametr ne yavlyaetsya opciej -a. Poskol'ku obe proverki soedineny opera- ciej AND, to dlya polucheniya znacheniya "istina" oni obe dolzhny byt' istinnymi. Esli oni obe istinny, vyvoditsya soobshchenie ob oshibke i uchk zavershaetsya. Pochemu my dolzhny vypolnyat' takuyu slozhnuyu proverku? Problema v tom, chto u nas net inogo sposoba opredelit', yavlyaetsya pervyj pozicion- nyj parametr opciej ili net. On mozhet byt' opciej, a mozhet byt' ime- nem, kotoroe nuzhno iskat'. Takim obrazom, my dolzhny zadat' vopros: "YAvlyaetsya li eto opciej, i esli da, to dopustima li eta opciya?" V stroke 18 peremennaya ADMIN inicializiruetsya simvol'noj strokoj, sleduyushchej za nej. |to stroka, kotoruyu vy dolzhny modificirovat' v soot- vetstvii s vashej sistemoj. Vse, chto vy dolzhny sdelat' - eto ispol'zo- vat' redaktor vi i vstavit' v etu stroku imena administratorov, razde- lennye probelami. Nizhe my ispol'zuem peremennuyu ADMIN dlya obrabotki argumentov komandnoj stroki. V strokah 19-22 proveryaetsya, byla li ukazana v komandnoj stroke opciya -a. Esli da, eta opciya udalyaetsya iz komandnoj stroki s cel'yu iz- bavleniya ot nee. Stroka 21 ispol'zuet komandu set dlya togo, chtoby po- mestit' simvol'nuyu stroku ADMIN v pozicionnye parametry. Komanda set vstavlyaet znachenie peremennoj ADMIN, nachinaya s pervogo pozicionnogo parametra, i sdvigaet vse nastoyashchie parametry vpravo. Tem samym v cikl for peredaetsya mnozhestvo imen, kotorye dolzhny byt' obrabotany. V stroke 24 vypolnyaetsya komanda ps dlya vseh pol'zovatelej. |ta komanda ispol'zuet opciyu f dlya vyvoda bol'shogo kolichestva dannyh. Re- zul'tat pomeshchaetsya vo vremennyj fajl, v imeni kotorogo primenyaetsya identifikacionnyj nomer processa. |tot odin bol'shoj fajl predstavlyaet soboj istochnik dlya ostal'nyh raspechatok. Vozmozhno, vse eto nemnogo otstaet ot real'nogo vremeni, no programma vypolnyaetsya gorazdo byst- ree, chem pri mnogokratnom vyzove komandy ps. Stroki 25-29 predstavlyayut soboj cikl for, kotoryj vypolnyaetsya ot $1 do $x, gde x - poslednij pozicionnyj parametr. Dlya kazhdogo imeni vypolnyaetsya sleduyushchee: pechataetsya pustaya stroka dlya razdeleniya listin- ga (stroka 27), zatem komandoj fgreps (dlya uskoreniya) vybirayutsya iz vremennogo fajla vse processy, prinadlezhashchie dannomu pol'zovatelyu. Blagodarya primeneniyu komandy fgrep dlya kazhdogo imeni pol'zovatelya, vse processy dannogo pol'zovatelya pechatayutsya za odin raz. Kogda zakonchitsya proverka vseh imen, ukazannyh v komandnoj stroke, cikl zavershitsya, za- vershitsya komandnyj fajl i srabotaet operator trap, kotoryj udalyaet vre- mennyj fajl. ------------------------------------------------------------- IMYA: watch ------------------------------------------------------------- watch Nablyudenie za registraciej ukazannyh pol'zovatelej

    NAZNACHENIE

Sledit za tem, kto rabotaet v sisteme, i soobshchaet o registracii ukazannyh pol'zovatelej.

    FORMAT VYZOVA

watch [-k] [login_name ...]

    PRIMER VYZOVA

watch Nablyudenie za registraciej vseh pol'zovatelej, ukazannyh vo vnutrennej peremennoj LIST

    TEKST PROGRAMMY

1 : 2 # @(#) watch v1.0 Watch for specific logins Author: Russ Sage 2a Nablyudenie za registraciej pol'zovatelej 4 if [ "`echo $1 | cut -c1`" = "=" -a "$1" != "-k" ] 5 then echo "watch: invalid argument $1" >&2 6 echo "usage: watch [-k] [login_name ...]" >&2 7 echo " -k kill background process" 8 exit 1 9 fi 11 if [ "$1" = "-k" ] 12 then if [ -s $HOME/.watch ] 13 then echo "killed `cat $HOME/.watch`" 14 kill `cat $HOME/.watch` 15 rm $HOME/.watch 16 exit 0 17 fi 18 fi 20 echo $$ > $HOME/.watch 22 LIST="root sys bin administrator1 administrator2 $*" 24 while : 25 do 26 for NAME in `who | cut -d" " -f1` 27 do 28 for PERSON in $LIST 29 do 30 if [ "$NAME" = $PERSON" ] 31 then echo ONLINE: $NAME 32 fi 33 done 34 done 35 sleep 10 36 done &

    PEREMENNYE SREDY VYPOLNENIYA

HOME Polnyj marshrut k vashemu registracionnomu katalogu LIST Spisok imen pol'zovatelej sistemy, razdelennyh probelami NAME Soderzhit imena zaregistrirovannyh v nastoyashchij moment pol'zovatelej PERSON Otdel'noe imya iz spiska imen v peremennoj LIST OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL watch? V techenie rabochego dnya mnozhestvo lyudej vhodyat v sistemu i vyhodyat iz nee. Inogda edinstvennyj sposob svyazat'sya s chelovekom - cherez mashi- nu. Nam nuzhno sredstvo, kotoroe avtomaticheski soobshchit nam, chto nuzhnoe lico na svyazi. CHTO DELAET watch? Podrazumevaetsya, chto watch yavlyaetsya fonovoj zadachej, kotoraya postoyanno sledit za tem, kto zaregistrirovalsya. Kogda lico ili lica, predvaritel'no vami otmechennye, registriruyutsya v sisteme, na vash ekran vyvoditsya soobshchenie o tom, chto oni na svyazi. Kolichestvo imen, za kotorymi vy mozhete sledit', ne ogranicheno. Obshchij perechen' imen - eto ob容dinenie imen, ukazannyh v komandnoj stroke, i spiska sistemnyh pol'zovatelej, t.e. pol'zovatelya root i vseh soprovozhdayushchih ego administratorov. V komandnom fajle watch spisok sistemnyh imen VSEGDA vklyuchen. |to vyzvano tem, chto eto vazhnye pol'zovateli i vy hotite vsegda znat' ob ih vhode v sistemu i vyhode iz nee. |to otlichaet watch ot uchk, poskol'ku poslednij trebuet ukaza- niya opcii -a dlya vklyucheniya spiska s sistemnymi imenami. Hotya my ustanavlivaem watch s tochki zreniya pol'zovatelya, kotoryj zhelaet sledit' za administratorami i drugimi pol'zovatelyami, administ- ratory tozhe mogut imet' spisok "kriticheskih pol'zovatelej" ili predpo- lagaemyh narushitelej zashchity informacii i ispol'zovat' watch dlya polu- cheniya signala o registracii takih pol'zovatelej. Za kem by my ni sledili, my stalkivaemsya s odnoj problemoj. Posle registracii v sisteme ukazannogo lica soobshchenie ob etom postupaet na vash ekran, ne obrashchaya vnimaniya na to, chem vy v dannoe vremya zanima- lis', chto ne ochen' priyatno. Edinstvennyj sposob ostanovit' vyvod soob- shcheniya - avarijno zavershit' watch komandoj kill. |to legko sdelat' pu- tem pomeshcheniya identifikatora etogo processa v fajl $HOME/.watch. Zatem etot nomer mozhet byt' ispol'zovan v operatore kill dlya ostanovki vy- polneniya komandnogo fajla. Dlya togo chtoby poproshche izbavit'sya ot watch, vozmozhnost' avarijnogo zaversheniya oformlena v vide opcii -k dannogo komandnogo fajla.

    PRIMERY

1. $ LIST="root bin" watch daemon Esli peremennaya LIST ne byla inicializirovana vnutri samogo ko- mandnogo fajla watch, to my mozhem inicializirovat' ee na komandnom urovne shell'a, a zatem vyzvat' watch. Spisok pol'zovatelej dlya watch budet takoj: root, bin i daemon po poryadku, poskol'ku watch dobavlyaet imena, ukazannye v ee komandnoj stroke k imenam, imeyushchimsya v peremen- noj LIST. Takoj sposob ukazaniya imen bolee gibok, chem zhestkoe program- mirovanie chasti spiska v tekste komandnogo fajla watch, no on trebuet pomnit' bol'she informacii i bol'she nuzhno nabirat' na klaviature. 2. echo "Watch (y/n): \c" read ANS if [ "$ANS" = "y" ] then watch fi |to fragment, kotoryj vy mozhete vstavit' v vash .profile. Kogda vy registriruetes', vam avtomaticheski predlagaetsya zapustit' watch. Esli vy otvetite "y", watch stanet fonovoj zadachej i zapustitsya po umolcha- niyu (prosmatrivaya pol'zovatelej soglasno spisku v peremennoj LIST). Esli budet vveden lyuboj simvol, otlichnyj ot y, watch ne zapustitsya.

    POYASNENIYA

Stroki 4-9 vypolnyayut proverku na nalichie oshibok v opciyah komand- noj stroki. Dlya pervogo pozicionnogo parametra proveryaetsya, chto on imeet tire i ne yavlyaetsya edinstvennoj dopustimoj opciej "-k". Esli re- zul'tatom proverki yavlyaetsya istina, pechataetsya soobshchenie ob oshibke i komandnyj fajl zavershaetsya. Stroki 11-16 proveryayut, chto pervyj pozicionnyj parametr - eto -k. Esli eto tak, znachit pol'zovatel' hochet unichtozhit' uzhe zapushchennyj pro- cess watch. V etom sluchae vyvoditsya soobshchenie, ukazyvayushchee identifika- tor processa, kotoryj budet unichtozhen, i vypolnenie prodolzhaetsya. V stroke 12 my smotrim, sushchestvuet li v nashem registracionnom kataloge fajl s imenem .watch. Esli net, to eto oznachaet, chto predydushchij ek- zemplyar watch predpolozhitel'no uzhe unichtozhen i net neobhodimosti py- tat'sya sdelat' eto snova, poetomu proishodit perehod k ostavshejsya chasti programmy i vypolnenie watch proishodit tak, kak budto opciya "-k" ne byla ukazana. Esli zhe fajl .watch imeetsya, to v stroke 14 ispol'zuetsya komanda kill dlya unichtozheniya fonovogo processa watch. Napomnim, chto pri ispol'zovanii opcii -k my podrazumevaem, chto watch byl vyzvan ranee, poetomu fajl $HOME/.watch imeet identifikacionnyj nomer samogo pro- cessa watch. V stroke 15 udalyaetsya vremennyj fajl watch i v stroke 16 proishodit vyhod iz programmy. Teper' komandnyj fajl watch bolee ne vypolnyaetsya kak fonovyj. Stroka 20 vypolnyaetsya, esli opciya -k ne byla ukazana ili esli net fajla .watch. (Poslednee mozhet proizojti, esli pol'zovatel' pytaetsya unichtozhit' process, zabyv, chto on uzhe byl unichtozhen.) Esli opciya -k ne byla ukazana, my mozhem schitat', chto watch byl vyzvan, chtoby stat' fo- novym processom i vypolnyat' svoyu rabotu. Dlya togo chtoby sdelat' eto, tekushchij process otobrazhaet svoj identifikator processa v fajl .watch. |tot fajl ostaetsya v vashem registracionnom kataloge do teh por, poka on ne budet udalen vruchnuyu ili zhe izmenen putem povtornogo zapuska watch. V stroke 22 inicializiruetsya peremennaya LIST. Ee znacheniem yavlya- etsya simvol'naya stroka s imenami, razdelennymi probelami. Vam nuzhno vruchnuyu otredaktirovat' peremennuyu LIST pered zapuskom v vashej siste- me. Prosto uberite ee nyneshnee soderzhimoe i vstav'te tuda imena admi- nistratorov vashej sistemy. Esli v komandnoj stroke budut ukazany do- polnitel'nye imena pol'zovatelej, oni budut dobavleny v peremennuyu LIST posredstvom simvolov rasshireniya parametrov $*. Tem samym peremen- naya LIST stanet osnovnym spiskom vseh imen pol'zovatelej, za kotorymi budet vestis' nablyudenie. Stroki 24-36 vypolnyayut cikl postoyannogo nablyudeniya. V nachale kazh- doj iteracii s pomoshch'yu komandy who sozdaetsya spisok imen pol'zovate- lej, kotoryj peredaetsya ciklu for v stroke 26. Cikl for ispol'zuet ko- mandnuyu podstanovku dlya polucheniya spiska slov, obrazovannogo iz pervo- go polya komandy who. Kazhdoe zaregistrirovannoe imya sravnivaetsya so spiskom predvaritel'no opredelennyh imen, za kotorymi my nablyudaem. Obratite vnimanie, chto vneshnij cikl while sam sebya pomeshchaet na vypol- nenie v fonovom rezhime. |to oznachaet, chto vam net neobhodimosti vvo- dit' eto s klaviatury. Stroki 29-33 upravlyayut vnutrennim ciklom, kotoryj prohodit po imenam, soderzhashchimsya v nashem osnovnom spiske, i sravnivaet ih s imena- mi, poluchennymi ot komandy who. Kogda imya, poluchennoe ot komandy who (imya zaregistrirovannogo pol'zovatelya) sovpadaet s imenem v nashem spiske, na ekran vyvoditsya soobshchenie o tom, chto dannoe lico zaregist- rirovalos'. Posle togo kak vse imena provereny, komandnyj fajl watch priosta- navlivaetsya na 10 sekund (stroka 35). Kogda on snova probuzhdaetsya, vy- polnyaetsya sleduyushchaya iteraciya vechnogo cikla while. Vse zaregistrirovan- nye imena vnov' sravnivayutsya so spiskom. |to budet prodolzhat'sya do teh por, poka vy ne prekratite vypolnenie watch. Kak otmechalos' ranee, watch mozhno legko unichtozhit' s pomoshch'yu opcii -k ili zhe vruchnuyu putem vvoda komandy "kill `cat $HOME/.watch`".

    MODIFIKACII

Watch vypolnyaet dovol'no malo raboty i ispol'zuet kakuyu-to chast' vremeni central'nogo processora. Vy mozhete poeksperimentirovat' s uve- licheniem intervala pauzy (sleep), chtoby watch zapuskalsya ne tak chasto. Bol'shinstvo pol'zovatelej nahodyatsya v sisteme po krajnej mere minutu, poetomu vy mozhete poprobovat' znachenie sleep(60). Vy po-prezhnemu mozhe- te obnaruzhit' registraciyu vseh interesuyushchih vas pol'zovatelej? --------------------------------------------------------------- IMYA: whox --------------------------------------------------------------- whox Komanda who s dopolnitel'nymi vozmozhnostyami

    NAZNACHENIE

Predostavlyaet mnogo dopolnenij k vyhodu komandy who i pozvolyaet primenyat' dannye who dlya drugih prilozhenij.

    FORMAT VYZOVA

whox [-f] [-n] [-m] [-p] [-t] [-w] [-x] gde -f ukazyvaet kazhdogo zaregistrirovannogo pol'zovatelya -n sortiruet vyhod komandy who po imenam -m peredaet pochtu kazhdomu pol'zovatelyu -p vyvodit informaciyu o parolyah pol'zovatelej -t sortiruet vyhod komandy who po vremeni (umolchanie) -w pokazyvaet vozmozhnost' zapisi na zaregistrirovannye terminal'nye ustrojstva -x dopolnitel'naya informaciya o registracionnom kataloge i parolyah

    PRIMER VYZOVA

whox -w Pokazyvaet prava dostupa k fajlu (vozmozhnost' chteniya i zapisi) dlya kazhdogo zaregistrirovannogo terminal'nogo ustrojstva

    TEKST PROGRAMMY

1 : 2 # @(#) whox v1.0 Who with expanded options Author: Russ Sage 2a Komanda who s dopolnitel'nymi opciyami 4 XTRA="no" 5 SORT="sort -b +2" 6 DISPLAY="norm" 8 CUT1="cut -d' ' -f1" 9 CUT5="cut -d: -f5" 10 CUT6="cut -d: -f6" 12 for ARG in $@ 13 do 14 case $ARG in 15 -f) DISPLAY="finger" 16 COMMAND="finger \$NAME; echo";; 17 -n) SORT="sort";; 18 -m) DISPLAY="mail";; 19 -p) DISPLAY="pass" 20 COMMAND="grep \"^\$NAME:\" /etc/passwd";; 21 -t) SORT="sort -b +2";; 22 -w) DISPLAY="write";; 23 -x) XTRA="yes";; 24 *) echo "whox: invalid option $ARG" 25 echo "usage: whox [-f] [-n] [-m] [-p] [-t] [-w] [-x]" 26 echo " -f finger users" 27 echo " -n sort by name" 28 echo " -m mail to each user" 29 echo " -p password info on users" 30 echo " -t sort by time (default)" 31 echo " -w show writeability of devices" 32 echo " -x extra home dir and gcos info" 33 exit 1;; 34 esac 35 done 37 if [ "$XTRA" = "yes" ] 38 then EXTRA="| while read LINE; do \ 39 NAME=\`echo \$LINE | cut -d' ' -f1\`;\ 40 ENTRY=\`grep \"^\$NAME:\" /etc/passwd\`;\ 41 echo \"\$LINE\t\`echo \$ENTRY|\$CUT6\`\t\`echo \$ENTRY|\$CUT5\` \";done" 42 else EXTRA="" 43 fi 45 case $DISPLAY in 46 norm) eval "who | $SORT $EXTRA";; 47 finger|pass) for NAME in `who | $SORT | cut -d' ' -f1` 48 do 49 eval $COMMAND 50 done;; 51 mail) who | cut -d' ' -f1 | while read NAME 52 do 53 echo "mail to $NAME (y/n): \c" 54 KB=`line < /dev/tty` 55 if [ "$KB" = "y" ] 56 then mail $NAME < /dev/tty 57 fi 58 done;; 59 write) ls -il `who | sed "s/...........\(.......\).* /\/dev\/\1/"`;; 60 esac

    PEREMENNYE SREDY VYPOLNENIYA

ARG Argumenty komandnoj stroki COMMAND Komanda, kotoruyu sleduet vypolnit' pri ispol'zovanii komandy who so spiskom imen CUT1 Soderzhit sintaksis dlya vydeleniya pervogo polya stroki CUT5 Soderzhit sintaksis dlya vydeleniya pyatogo polya stroki CUT6 Soderzhit sintaksis dlya vydeleniya shestogo polya stroki DISPLAY Opredelyaet, kakoj rezhim otobrazheniya ispol'zovat' ENTRY Zapis' v fajle parolej dlya ukazannogo pol'zovatelya EXTRA Dannaya peremennaya soderzhit polnyj cikl shell-komand, hranimyh v vide odnoj stroki KB Vhodnye dannye ot klaviatury, poluchennye v cikle NAME Soderzhit v kazhdyj dannyj moment vremeni odno imya iz spiska vseh registracionnyh imen SORT Soderzhit vypolnyaemyj tip sortirovki XTRA Flag, opredelyayushchij, dolzhny li byt' aktivizirovany dopolnitel'nye opcii OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL whox? Kak uzhe ranee obsuzhdalos' v drugih mestah etoj knigi, sistema UNIX stremitsya obespechit' minimum vozmozhnostej v lyuboj zadannoj ob- lasti interesov. |to ne znachit, chto UNIX plohaya sistema. Naoborot, ona delaet gorazdo bol'she, chem bol'shinstvo drugih operacionnyh sistem. No ochen' chasto my hotim sdelat' nemnogo bol'she togo, chto nam predostavlya- et bazovaya sistema. Poluchenie informacii o tom, kto ispol'zuet mashinu, mozhet byt' primeneno dlya mnogih celej. Osnovnaya informaciya predostavlyaetsya koman- doj who, no ona mozhet byt' ne v tom vide, kotoryj vam nuzhen dlya konk- retnoj celi. V lyubom sluchae, vse, chto delaet komanda who - daet vam momental'nuyu informaciyu o tom, kto zaregistrirovalsya. Nam neobhodim nekotoryj sposob avtomaticheskogo dostupa k etomu spisku zaregistriro- vannyh imen i ispol'zovaniya ego dlya nablyudeniya, obshcheniya ili drugih ce- lej. CHTO DELAET whox? Whox - eto instrumental'noe sredstvo, rasshiryayushchee vozmozhnosti ko- mandy who. Ono ne tol'ko mozhet pereuporyadochit' v sootvetstvii s vashimi trebovaniyami spisok, poluchennyj ot komandy who, no takzhe mozhet ukazat' kazhdogo zaregistrirovannogo pol'zovatelya, peredat' pochtovoe soobshchenie lyubomu zaregistrirovannomu pol'zovatelyu, prosmotret' parol'nuyu infor- maciyu vseh zaregistrirovannyh pol'zovatelej i pokazat' informaciyu, vzyatuyu iz indeksnogo deskriptora fajla, sootvetstvuyushchego terminal'nomu ustrojstvu kazhdogo zaregistrirovannogo pol'zovatelya. Po umolchaniyu dejstvie whox zaklyuchaetsya v pechati obychnogo vyhoda komandy who v poryadke vremeni registracii ot bolee rannego do bolee pozdnego. Opciya -x dobavlyaet k etomu spisku informaciyu iz registraci- onnogo kataloga i pole kommentariya iz fajla parolej. Esli eta opciya -x kazhetsya vam znakomoj, to tak ono i est', poskol'ku eto to zhe samoe, chto i komanda info, predstavlennaya ranee. Whox imeet chetyre razlichnyh rezhima otobrazheniya. Pervyj eto format obychnogo vyhoda komandy who. Whox pozvolyaet vam sortirovat' ego dvumya raznymi sposobami. Opciya -n sortiruet po imenam, a opciya -t (kotoruyu ne nuzhno ukazyvat', poskol'ku ona ispol'zuetsya po umolchaniyu) sortiruet po vremeni registracii. Vtoroj rezhim otobrazheniya sostoit iz rezhimov ukazaniya i parolej, vklyuchaemyh opciyami -f i -p. Osnovnoe otlichie ot pervogo rezhima zaklyu- chaetsya v tom, chto vyhod komandy who ne pechataetsya, a ispol'zuetsya dlya generacii spiska imen pol'zovatelej, kotoryj primenyaetsya dlya drugih celej. My ukazyvaem kazhdogo pol'zovatelya ili pechataem parol'nuyu zapis' kazhdogo pol'zovatelya. Vypolnyaemaya komanda hranitsya v peremennoj, poe- tomu my mozhem imet' obshchij cikl, ispol'zuyushchij osobym obrazom peremen- nye. (Komanda finger imeetsya v sisteme Berkeley UNIX i v nekotoryh drugih, no ne vo vseh realizaciyah. Posmotrite rukovodstvo, chtoby vy- yasnit', chto vyvoditsya na ekran po etoj komande.) Tretij rezhim - eto pochtovyj rezhim, v kotorom vy imeete vozmozh- nost' posylki pochtovogo soobshcheniya kazhdomu zaregistrirovannomu pol'zo- vatelyu. Vam zadaetsya vopros o tom, dejstvitel'no li vy hotite sdelat' eto. Bol'she ot vas nichego ne trebuetsya. |tot rezhim vybiraet opciya -m. Poslednij rezhim - eto rezhim zapisi na terminal. Rezhim zapisi (op- ciya -w) pokazyvaet informaciyu o fajle terminala dlya kazhdogo zaregist- rirovannogo terminal'nogo ustrojstva. |ta informaciya polezna, esli vy hotite ispol'zovat' komandu UNIX'a write. Posmotrev na prava dostupa k fajlu ustrojstva pol'zovatelya, vy mozhete skazat', imeetsya li u vas vozmozhnost' zapisat' tekst na ego ekran. Nekotorye pol'zovateli, koto- rye ne hotyat, chtoby ih preryvali, zakryvayut pravo zapisi na ih termi- nal, vypolnyaya komandu "mesg n". Vopros o prave zapisi kasaetsya lyubogo sposoba posylki teksta v drugoj fajl, a ne tol'ko s ispol'zovaniem ko- mandy write. Pravo zapisi takzhe zashchishchaet ot takih veshchej, kak "echo hello > /dev/tty00". Sposob obrabotki argumentov v komandnoj stroke privodit k neskol'ko strannomu obrashcheniyu s dannoj utilitoj. Kazhdyj argument pro- veryaetsya po poryadku i ustanavlivaet vnutrennie flagi. Esli vy postavi- te v konce spiska kakuyu-libo opciyu, menyayushchuyu flag, ustanovlennyj odnoj iz predydushchih opcij, to vy poluchite dejstvie poslednej opcii. (Drugimi slovami, nekotorye opcii vzaimno isklyuchayut drug druga. Luchshij sposob izuchit' eto - vnimatel'no prochitat' ishodnyj tekst komandnogo fajla i vypolnit' neskol'ko eksperimentov s razlichnymi naborami opcij.) Naprimer, my hotim ukazat' kazhdogo pol'zovatelya. My ispol'zuem opciyu -f. Opciya -f ustanavlivaet v kachestve rezhima otobrazheniya rezhim ukazaniya. Esli my pomestim opciyu -w sprava ot -f, kak v komande "whox -f -w", to ustanovitsya rezhim zapisi na terminal. Komanda whox budet schitat', chto vy voobshche ne ukazyvali opciyu -f. Na samom dele eto ne predstavlyaet bol'shuyu problemu, esli vy znaete, chto delaet kazhdaya op- ciya. Sluchajno smeshivaya ih v odnoj komande, vy mozhete poluchit' neskol'- ko strannye vyhodnye dannye.

    PRIMERY

1. $ sh -x whox -x Zapusk interpretatora shell v otladochnom rezhime vypolneniya, poda- cha emu komandnogo fajla whox v kachestve dannyh, peredacha opcii -x dlya whox. Otladochnyj rezhim pokazyvaet prisvoenie znachenij peremennym i vy- zovy komand. (My videli eto ranee.) 2. $ whox -n -x Pechat' vyhodnyh dannyh komandy who, otsortirovannyh po imenam i vydacha dopolnitel'nyh dannyh.

    POYASNENIYA

V strokah 4-10 vypolnyaetsya inicializaciya peremennyh. Peremennaya XTRA ustanavlivaetsya v znachenie "no". |ta peremennaya ispol'zuetsya dlya postroeniya komandnoj stroki pri ispol'zovanii opcii -x. Ustanovka XTRA v znachenie "no" oznachaet, chto dejstvie po umolchaniyu - ne poluchat' do- polnitel'nuyu informaciyu. Umolchaniem dlya sortirovki yavlyaetsya sortirovka po vremeni regist- racii. |to ukazyvaetsya sortirovkoj po kolonke, stoyashchej posle vtoroj (+2) i ignorirovaniem vedushchih probelov (-b) v stroke 5. Takoj zhe sin- taksis primenen nizhe s opciej -t. Opciya -t zdes' lishnyaya, no ona delaet bolee ponyatnoj komandnuyu stroku. Opciya -n takzhe izmenyaet sintaksis sortirovki, chtoby prosmatrivat' pervuyu kolonku, kotoraya yavlyaetsya spiskom imen. Stroka 6 inicializiruet obychnyj rezhim otobrazheniya, kotorym yavlya- etsya pechat' standartnogo vyhoda komandy who. Esli prisutstvuyut drugie opcii, sootvetstvenno izmenyaetsya peremennaya DISPLAY. Stroki 8,9 i 10 inicializiruyut nekotorye peremennye dlya komand vyrezki, chto delaet bolee kompaktnymi posleduyushchie komandy. Esli neko- torye komandnye stroki okazyvayutsya slishkom dlinnymi, vy mozhete po- mestit' nuzhnyj tekst v peremennye i podstavit' ih pri neobhodimosti. Peremennaya CUT1 vyglyadit tak, kak budto ona dolzhna rabotat', no ona ne rabotaet v moej sisteme. Pochemu ona ne rabotaet, ob座asnyaetsya nizhe. Prosto zapomnite, chto eta stroka nikogda ne ispol'zuetsya v dannoj programme. My poka ostavlyaem ee, chtoby pogovorit' o nej pozzhe. Vy mo- zhete ubrat' ee, esli hotite. Stroki 12-35 obrabatyvayut argumenty komandnoj stroki. Cikl for podstavlyaet v peremennuyu ARG kazhdyj parametr po poryadku i vypolnyaet operator case po znacheniyu ARG. Esli opciej yavlyaetsya -f, stroka 15 izmenyaet peremennuyu DISPLAY v rezhim ukazaniya. Ona takzhe podstavlyaet v peremennuyu COMMAND komandu finger, kotoraya vypolnitsya v sleduyushchem cikle. Prichina, po kotoroj nam nuzhno imet' peremennuyu, soderzhashchuyu komandu, zaklyuchaetsya v tom, chto dannyj cikl yavlyaetsya obshchim ciklom, primenyaemym dlya dvuh raznyh celej. Dlya togo chtoby odin i tot zhe cikl spravilsya s dvumya razlichnymi zadacha- mi, my pomeshchaem eti zadachi v peremennuyu i vypolnyaem etu peremennuyu. |to znachitel'no sokrashchaet obshchee kolichestvo teksta, hotya privnosit ne- kotoruyu dopolnitel'nuyu rabotu. Obratite vnimanie v stroke 16, chto sim- vol $ ekranirovan v operatore prisvaivaniya. |to neobhodimo, ved' my hotim, chtoby peremennaya COMMAND soderzhala simvol'nuyu stroku $NAME, a ne znachenie, kotoroe imeet peremennaya NAME posle prisvaivaniya. Znache- nie NAME rasshifrovyvaetsya v cikle vo vremya ego vypolneniya. Stroka 17 obrabatyvaet opciyu -n. Vse, chto zdes' trebuetsya - izme- nit' sposob sortirovki vyhoda komandy who, chtoby otrazit' poryadok po imenam. Poskol'ku imya nahoditsya v pervoj kolonke vyhoda komandy who, a komanda sort sortiruet po umolchaniyu po pervoj kolonke, to ispol'zuetsya komanda sort bez opcij. Stroka 18 obrabatyvaet opciyu -m dlya peredachi pochtovyh soobshchenij. Zdes' my dolzhny izmenit' rezhim otobrazheniya na pochtovyj. Vse, chto nuzhno dlya etogo, nahoditsya v cikle mail, i ne trebuetsya inicializirovat' ni- kakie peremennye. Stroki 19 i 20 spravlyayutsya s opciej -p. Opciya parolej izmenyaet rezhim otobrazheniya na parol'nyj rezhim i ustanavlivaet komandu, kotoruyu my vyzyvaem, nahodyas' v obshchem cikle. V dannom sluchae my ispol'zuem ko- mandu grep dlya polucheniya parol'noj zapisi iz fajla /etc/passwd. Obra- tite vnimanie, chto v stroke 20 my ispol'zuem vnutrennie dvojnye kavych- ki. Dlya etogo my vynuzhdeny ekranirovat' ih simvolami obratnoj kosoj cherty. Napomnim, chto obratnaya kosaya cherta ispol'zuetsya dlya otmeny spe- cial'nogo znacheniya osobyh shell-simvolov. Stroka 21 upravlyaet opciej -t. Kak uzhe upominalos' ranee, opciya -t v dejstvitel'nosti ne trebuetsya v dannoj programme. Poskol'ku ona yavlyaetsya umolchaniem, trebuemye dlya nee dejstviya uzhe byli predprinyaty v nachale programmy - byla vypolnena tochno takaya zhe inicializaciya. Sin- taksis komandy sort tochno takoj zhe, kak i v stroke 5. Stroka 22 obrabatyvaet opciyu -w dlya pokaza vozmozhnosti zapisi v fajly terminalov. Edinstvennoe, chto nuzhno zdes' sdelat' - izmenit' re- zhim raboty terminala. Stroka 23 upravlyaet opciej -x. Poskol'ku dlya polucheniya dopolni- tel'noj informacii trebuetsya dovol'no slozhnaya inicializaciya, to my tol'ko ustanavlivaem v etom meste flag XTRA, pokazyvayushchij, chto my ho- tim vypolnit' etu inicializaciyu pozzhe. Stroka 24 - eto ulavlivatel' dlya obrabotki oshibok. Simvol * soot- vetstvuet lyubomu simvolu, kotoryj ne byl raspoznan ranee. Pechataetsya soobshchenie ob oshibke i sintaksicheskaya podskazka, i whox zavershaetsya. Stroki 37-43 ustanavlivayut peremennye, ispol'zuemye v opcii do- polnitel'noj informacii. Stroka 37 proveryaet, ustanovlena li peremen- naya XTRA v sostoyanie "yes", chto imeet mesto tol'ko togda, kogda v ko- mandnoj stroke imelas' opciya -x. Esli eto tak, to v peremennuyu EXTRA zanositsya mnogo vsyakih veshchej, kotorye my rassmotrim pozzhe. V protivnom sluchae v peremennuyu EXTRA zanositsya pustaya stroka, tak chto ona nikak ne proyavlyaetsya na stadii fakticheskogo vypolneniya. Peremennaya EXTRA zdes' ochen' vazhna i na samom dele delaet nebol'- shoj fokus. My sobiraemsya pomestit' v peremennuyu nekotoryj kod, trebue- myj dlya obrabotki opcii -x. Poskol'ku dopolnitel'naya informaciya, koto- ruyu my hotim poluchit', trebuet predvaritel'no nekotoroj obrabotki, to my pomeshchaem v peremennuyu nekotoryj komandnyj tekst. Kak tol'ko eta pe- remennaya nachinaet vypolnyat'sya, vypolnyaetsya i etot komandnyj tekst. |to pohozhe na makrokomandu, tol'ko ee tekst nahoditsya fakticheski v ispol- nyaemoj programme. Stroki 38-41 vstavleny vnutr' peremennoj EXTRA. |to sdelano putem vzyatiya v dvojnye kavychki vseh chetyreh strok. Vse special'nye simvoly, kotorye dolzhny byt' chast'yu dannyh v etoj peremennoj, dolzhny byt' ekra- nirovany simvolami obratnoj kosoj cherty. V stroke 38 v peremennuyu EXTRA zanositsya simvol konvejera (|) i nachalo cikla while. V konce stroki 38 imeetsya simvol kosoj cherty, ukazyvayushchij interpretatoru shell, chto prisvaivanie prodolzhaetsya posle simvola konca stroki (vozv- rata karetki ili perevoda stroki). Stroka 39 prisvaivaet peremennoj NAME znachenie polya, vyrezannogo iz dannyh, chitaemyh v cikle while. Napomnim, chto ves' dannyj operator pomeshchaetsya vnutr' peremennoj EXTRA. Kogda ya vyshe upominal, chto v stro- ke s peremennoj CUT1 est' problemy, to kak odno iz takih problemnyh mest ya imel v vidu imenno eto. Kogda ya popytalsya ispol'zovat' peremen- nuyu CUT1 v etom operatore vmesto ukazaniya komandy cut, shell ne smog pravil'no raspoznat' etot operator. Odinarnye kavychki, otmechayushchie sim- vol-razdelitel' dlya vyrezki, ne byli raspoznany. V rezul'tate komanda cut schitala, chto simvolom-razdelitelem yavlyaetsya simvol ' i posle etogo avarijno zavershalas', poskol'ku vtoroj simvol ' predstavlyal soboj ne- dopustimoe opisanie spiska dlya opcii -f. Stroka s opciej -f shla pozzhe, no komanda cut etogo nikogda ne uznavala, poskol'ku avarijno zaversha- las' do etogo. Kogda ya zamenil peremennuyu CUT1 prosto komandoj cut, eta problema ischezla. Davajte rassmotrim, kak ya otlazhival etu chast'. YA ispol'zoval shell s opciej -x, poetomu ya mog sledit' za tem, chto proishodit. Kak vy mozhete videt', kogda peremennaya CUT1 byla inicializirovana, odinar- nye kavychki nahodilis' vse eshche v operatore, no kogda vypolnyalas' nastoyashchaya komanda cut, odinarnye kavychki uhodili pri sintaksicheskom rasshirenii. Dlya generacii takogo spiska dannyh ya vypolnil sleduyushchij vyzov: sh -x whox -x. Vot chto ya uvidel: XTRA=no SORT=sort -b +2 DISPLAY=norm CUT1=cut -d' ' -f1 <- Odinarnye kavychki vse eshche zdes'. Osnovnaya problema. CUT5=cut -d: -f5 CUT6=cut -d: -f6 XTRA=yes + who + read LINE + sort -b +2 + echo russ console Jun 20 14:11 + cut -d -f1 <- Teper' vypolnyaetsya pravil'no. Kavychek net. |to sokrashchennaya raspechatka. Ona pokazyvaet, chto kogda vypolnyalas' komanda cut, ona ne imela odinarnyh kavychek. Kogda zhe zapuskalas' pe- remennaya CUT1, ona imela odinarnye kavychki. YA ne mog predstavit', kak izbavit'sya ot kavychek, poetomu ya prosto vstavil vyzov samoj komandy cut obratno na eto mesto. Mozhet byt' kakoj-nibud' molodoj rastushchij master smozhet sebe eto predstavit'. Vo vsyakom sluchae, vy mozhete videt' poleznost' otladki. Cikl, vypolnyayushchij takoe zhe prisvaivanie, imeet takoj vid pri obychnom stile zapisi na yazyke shell: | while read LINE do NAME=`echo $LINE | cut -d' ' -f1` ENTRY=`grep "^$NAME:" /etc/passwd` echo "$LINE\t\`echo $ENTRY|$CUT6\`\t\`echo $ENTRY|$CUT5\`\" done Dlya togo chtoby pomestit' takoj zhe cikl v peremennuyu, my dolzhny ekranirovat' v etom tekste vse special'nye simvoly. Stroki 45-60 - eto operator case, kotoryj realizuet razlichnye re- zhimy otobrazheniya. Stroka 46 vypolnyaet obychnyj rezhim otobrazheniya koman- dy who. Poskol'ku v obychnom rezhime imeetsya vozmozhnost' ispol'zovat' peremennuyu EXTRA, nam neobhodimo proizvesti povtornyj razbor komandnoj stroki komandoj eval, chtoby eta peremennaya prinyala svoe istinnoe zna- chenie vo vremya ispolneniya. Obratite vnimanie, chto v komande eval ime- yutsya kavychki, zaklyuchayushchie vsyu komandnuyu stroku. |to neobhodimo potomu, chto vsya stroka yavlyaetsya odnim naborom vhodnyh dannyh dlya komandy eval. Bez kavychek komanda eval ne rabotala by. Peremennaya EXTRA ne podverga- etsya povtornomu razboru. Stroki 47-50 upravlyayut rezhimami ukazaniya pol'zovatelya i vydachi informacii iz fajla parolej. Oba eti rezhima ispol'zuyut odin i tot zhe cikl. Cikl for ispol'zovan dlya ustanovki peremennoj NAME v znachenie pervogo polya kazhdoj stroki, poluchennoj ot komandy who. Dlya kazhdogo imeni, vyrezannogo iz rezul'tata raboty komandy who, vypolnyaetsya pov- tornyj sintaksicheskij razbor komandoj eval peremennoj COMMAND (kotoraya byla ustanovlena v operatore case, vypolnyavshem razbor argumentov). Tem samym povtorno analiziruyutsya i vypolnyayutsya komandy, nahodyashchiesya v pe- remennoj COMMAND. Dlya rezhima ukazaniya pol'zovatelya peremennaya COMMAND soderzhit komandu finger, a dlya rezhima parolej v COMMAND hranitsya ko- manda grep. Stroki 51-58 pohozhi na rezhim ukazaniya pol'zovatelya. |tot cikl to- zhe trebuet imena ot komandy who, no vmesto ispol'zovaniya operatora for my ispol'zuem metod pryamoj peresylki po konvejeru. Rezul'tat raboty komandy who po konvejeru peredaetsya komande cut (peremennaya CUT1 i zdes' by ne rabotala), kotoraya po konvejeru peredaet dannye v cikl chteniya while. Obratite vnimanie, chto v etom meste net nikakoj sorti- rovki. Po umolchaniyu rezul'tat komandy who vyvoditsya v poryadke nomerov terminal'nyh ustrojstv. YA ne dumayu, odnako, chto poryadok vyvoda etih dannyh imeet bol'shoe znachenie. Dlya kazhdogo imeni pol'zovatelya vyvoditsya zapros o tom, hotite li vy peredat' emu pochtovoe soobshchenie. Pri chtenii otveta v stroke 54 dolzhna byt' ispol'zovana komanda UNIX'a line. Pochemu? Potomu chto ves' cikl ispol'zuet operator read dlya chteniya imen. Operator read chitaet tol'ko so standartnogo vvoda, kotoryj v dannom sluchae privyazan k kon- vejeru. Dlya polucheniya vhodnyh dannyh s klaviatury my dolzhny ispol'zo- vat' komandu line, kotoraya poluchaet ih iz fajla /dev/tty. |to rasp- rostranennyj sposob chteniya dannyh s klaviatury iz pereadresovannogo cikla. Stroka 55 proveryaet, yavlyaetsya li otvetom simvol y. Esli da, vyzy- vaetsya komanda UNIX'a mail, i snova vvod pereadresovyvaetsya iz fajla /dev/tty (poskol'ku stroki pochtovogo soobshcheniya my dolzhny vvodit' s klaviatury.) V dannom sluchae my fakticheski pereadresovyvaem standart- nyj vvod dlya vyzova podchinennogo shell-processa, vypolnyayushchego komandu mail. Bez vypolneniya pereadresacii komanda mail chitaet iz fajla /dev/null, chto narushaet vypolnenie vsego cikla whox. Stroka 59 upravlyaet rezhimom pokaza vozmozhnosti zapisi na termi- nal. Cel' zdes' takova - ispol'zovat' odnu komandu ls i, primenyaya pod- chinennyj process, izvlech' fajly terminal'nyh ustrojstv iz vyhodnyh dannyh komandy who. |ti fajly yavlyayutsya vtorym polem rezul'tata komandy who. Snachala zapuskaetsya komanda who, kotoraya po konvejeru peredaet svoi dannye komande sed. Zatem sed ispol'zuet komandu podstanovki dlya otbrasyvaniya vsego, krome togo, chto ogranicheno simvolami \( i \). Posleduyushchaya chast' koman- dy podstanovki ssylaetsya na etot ogranichennyj uchastok s pomoshch'yu oboz- nacheniya \1. Ispol'zuya simvol . kak sootvetstvuyushchij lyubomu simvolu raspechatki, my dolzhny vsego lish' poschitat' stolbcy, kotorye nam nuzhno vyrezat'. Krome togo, imena ustrojstv v komande who ne imeyut prefiksa /dev/, kotoryj nam neobhodim. Komanda sed vstavlyaet ego pered tekstom, vyrezannym iz komandy who. V rezul'tate komande ls daetsya spisok pol- nyh marshrutnyh imen ko vsem fajlam ustrojstv zaregistrirovannyh pol'- zovatelej. Zatem eto vyvoditsya na ekran.

    ZASHCHITA LICHNOJ INFORMACII

Drugoj storonoj osvedomlennosti pol'zovatelya yavlyaetsya obespechenie razumnoj stepeni bezopasnosti. Vasha potrebnost' v zashchite informacii zavisit ot roda vypolnyaemoj vami raboty i ot chuvstvitel'nosti informa- cii, kotoroj vy upravlyaete. Odnako vse hotyat sekretnosti i chuvstva be- zopasnosti, kotoroe poyavlyaetsya vmeste s obosnovannoj uverennost'yu v tom, chto oni ne mogut stat' zhertvoj narusheniya zashchity informacii. Tak zhe, kak vy mozhete izgotavlivat' prisposobleniya, pomogayushchie sdelat' vash dom menee privlekatel'nym dlya grabitelej, tak i kazhdyj pol'zovatel' mozhet sdelat' prisposobleniya, kotorye pomogayut podderzhivat' sekretnost' i bezopasnost' ego raboty. Podobno policii, sistemnye administratory obychno imeyut delo tol'ko s narusheniem zashchity uzhe posle svershivshegosya fakta. Vy mozhete ispol'zovat' sredstva, predstavlennye nami v dannom razdele, chtoby pomoch' uberech' vashi fajly ot nesankcionirovannogo prosmotra ili razrusheniya. Lyubaya komp'yuternaya sistema trebuet nekotorogo roda zashchity. Urovni zashchity vklyuchayut v sebya fizicheskuyu zashchitu (central'nogo processora, diskov i terminalov), zashchitu fajlov, zashchitu processov i vsej rabotayu- shchej sistemy. V mnogopol'zovatel'skoj srede eshche bolee vazhno usilivat' zashchitu. Kazhdyj pol'zovatel' imeet pravo zasekrechivat' i zashchishchat' svoyu sredu i svoi fajly. Ni odin komp'yuter ne imeet stoprocentnoj zashchity. Vasha sreda lish' nastol'ko zashchishchena, naskol'ko vy sdelali ee takovoj. Zashchitnye meropriyatiya mogut dostigat' takoj stepeni, chto nachinayut me- shat' svobodnomu obmenu ideyami i zatrudnyat' ispol'zovanie gibkosti sistemy ili issledovanie ee novyh aspektov. Lichno ya schitayu, chto pol'- zovateli dolzhny imet' svobodu delat' vse, chto oni hotyat, poka eto ne vredit sisteme ili drugim pol'zovatelyam. Bol'shinstvo informacii, pri- vedennoj v dannoj knige, podtverzhdaet eto ubezhdenie. Tip zashchity, kotoryj obsuzhdaetsya v dannoj glave, kasaetsya lichnogo aspekta zashchity pol'zovatelya sistemy UNIX. YA hochu, chtoby mesto, gde fi- zicheski nahodyatsya moi razrabotki, moj registracionnyj katalog i lyubye processy, kotorye ya zapuskayu v sisteme, byli zashchishcheny. Dlya polnogo komforta mne nuzhno znat', chto nikto ne vlezet v moi veshchi (posredstvom obychnyh metodov dostupa ili vzloma) i ne budet zaglyadyvat' mne cherez plecho, chtoby nablyudat', chem ya zanimayus'. V dannom razdele my rassmotrim instrumental'nye sredstva acme, inuse i lock. Acme - eto preprocessor k komande UNIX'a acctcom. Acctcom vypolnyaet dovol'no neplohuyu rabotu po otobrazheniyu uchetnoj in- formacii, no nekotorye opcii trebuetsya ukazyvat' vse vremya. Acme usta- navlivaet ih dlya nas. Napomnim, chto uchetnye zapisi hranyatsya v vide struktury, a ne v tekstovom vide, i poetomu my zastavlyaem acctcom po- kazyvat' ih dlya nas. Sleduyushchee sredstvo, inuse, pozvolyaet vam ustanovit' vash terminal kak "zanyatyj", kogda vy kuda-nibud' uhodite. |to effektivno blokiruet ego i ne pozvolyaet nikomu ispol'zovat' ego. Dlya realizacii takogo blo- kirovaniya predstavleny programmy kak na yazyke Si, tak i na yazyke in- terpretatora shell. Poslednee sredstvo, lock, ispol'zuetsya dlya blokirovaniya i razblo- kirovaniya prav dostupa k fajlu i yavlyaetsya na samom dele prostym inter- fejsom s komandoj chmod. ------------------------------------------------------------ IMYA: acme ------------------------------------------------------------ acme Otobrazhenie uchetnoj informacii obo mne

    NAZNACHENIE

Generiruet opcii, neobhodimye dlya vyvoda na ekran informacii obo mne, kotoraya hranitsya v uchetnom fajle.

    FORMAT VYZOVA

acme [-l] [-u]

    PRIMER VYZOVA

acme -u Vyvodit vsyu uchetnuyu informaciyu o pol'zovatele s imenem $LOGNAME

    TEKST PROGRAMMY

1 : 2 # @(#) acme v1.0 Give accounting info on me Author: Russ Sage 2a Dat' uchetnuyu informaciyu obo mne 4 if [ "$1" != "-l" -a "$1" != "-u" ] 5 then echo "usage: acme [-l] [-u]" >&2 6 echo " -l for ttyline" >&2 7 echo " -u for user name" >&2 8 exit 0 9 fi 11 OPT="" 12 for ARG in $* 13 do 14 case $ARG in 15 -l) OPT="$OPT -l `basename \`tty\``";; 16 -u) OPT="$OPT -u $LOGNAME";; 17 *) OPT="$OPT $ARG";; 18 esac 19 done 21 echo "acctcom $OPT" 22 acctcom $OPT

    PEREMENNYE SREDY VYPOLNENIYA

ARG Kazhdoe znachenie, ukazannoe v komandnoj stroke LOGNAME Peremennaya sredy, soderzhashchaya moe registracionnoe imya OPT Ob容dinennyj spisok vseh opcij i ih argumentov OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL acme? Bol'shinstvo bol'shih sistem UNIX zapuskayut standartnoe programmnoe obespechenie dlya sbora uchetnoj informacii ob ispol'zovanii sistemy. Re- zul'taty uchetnyh tranzakcij peredayutsya obychno v fajl /usr/adm/pacct. Fakticheski sbor uchetnoj informacii vypolnyaetsya yadrom sistemy. Kazhdyj raz pri zavershenii processa programmy sbora uchetnoj informacii v yadre proizvodyat odnu zapis'. Pereklyuchatelem, kotoryj vklyuchaet i vyklyuchaet etu operaciyu, yavlyaetsya acct(2). Komandy pol'zovatel'skogo urovnya takzhe vzaimodejstvuyut s sistemnym vyzovom (accton(1M)) i pechatayut rezul'taty sbora uchetnoj informacii (acctcom(1)). Teper', kogda my znaem, gde nahodyatsya uchetnye zapisi i kak oni tuda popadayut, nam nuzhno napechatat' etu informaciyu. Acctcom mozhet pe- chatat' tablicy s informaciej, no vam neobhodimo znat', kakoj ispol'zo- vat' indeks. Prosmotr mozhet proizvoditsya po nomeru terminal'noj linii (eto polezno, esli identifikator processa byl izmenen komandoj setuid), po imeni pol'zovatelya, po gruppe, po vremeni i t.d. YA naibo- lee chasto ispol'zuyu opcii poiska informacii po nomeru linii terminala i po imeni pol'zovatelya. S ih pomoshch'yu vy mozhete poluchit' spisok vseh osnovnyh dannyh, imeyushchih otnoshenie k vam. Kogda vy vyzyvaete acctcom s etimi opciyami, vam neobhodimo ukazat' dopolnitel'nuyu informaciyu, takuyu kak imya vashego terminala i vashe pol'zovatel'skoe imya. Bylo by horosho, esli by my mogli umen'shit' kolichestvo nazhatij na klavishi i ob容m vy- chislenij, trebuemyh dlya polucheniya informacii. Dlya etogo i prednaznachen acme. CHTO DELAET acme? Acme - eto interfejsnyj processor dlya komandy acctcom(1). On slu- zhit dlya vydachi informacii, kotoraya trebuetsya soglasno ukazannym opci- yam. Vy dolzhny tol'ko dat' komandnomu fajlu acme opcii v sokrashchennom vide, a vse ostal'noe on sdelaet sam. Esli acme vyzyvaetsya bez argu- mentov, programma acctcom vyvedet po umolchaniyu vse zapisi. Komanda acctcom imeet mnogo opcij. V dejstvitel'nosti my ispol'- zuem odnu ili dve, no zato ispol'zuem ih chasto. Dvumya opciyami, kotorye ponimaet acme, yavlyayutsya -l i -u. Kogda ukazana opciya -l, acme poluchaet imya vashego terminala i pomeshchaet ego v komandnuyu stroku. Esli ukazana opciya -u, acme poluchaet vashe pol'zovatel'skoe imya i tozhe vstavlyaet ego v komandnuyu stroku. Vremya ot vremeni ispol'zuyutsya drugie opcii dlya bavleniya specificheskoj informacii ili nebol'shogo izmeneniya vyhodnogo formata. Dlya togo chtoby byla vozmozhnost' ispol'zovat' drugie opcii ko- mandy acctcom, acme vklyuchaet v komandnuyu stroku, formiruemuyu dlya fcctcom, lyubye dopolnitel'nye korrektnye opcii acctcom, peredannye v komandnoj stroke dlya acme. Takim obrazom, acme podderzhivaet bazovye vozmozhnosti, a krome togo pozvolyaet vam podgonyat' komandu pod vash vkus. Pered tem, kak nachnetsya vypolnenie komandy acctcom, na ekran vy- voditsya rasshirennyj vid komandnoj stroki, tak chto vy mozhete videt' ko- mandnuyu stroku, sgenerirovannuyu acme. Bez etogo mozhet poluchit'sya puta- nica, poskol'ku vy ne budete znat', chto sobiraetsya delat' programma.

    PRIMERY

1. $ acme Vydacha VSEH moih uchetnyh dannyh. |to posledovatel'nyj spisok vseh komand, kotorye byli zapushcheny nachinaya s momenta zagruzki po nastoyashchee vremya. Schastlivogo chteniya! 2. $ acme -u -b Pechat' v obratnom poryadke vseh uchetnyh zapisej s moim pol'zova- tel'skim imenem. Obratnyj poryadok oznachaet - ot samoj poslednej iz predydushchih komand do moej pervoj komandy. 3. $ acme -l Vyvod vseh uchetnyh zapisej dlya terminal'noj linii, kotoruyu ya sej- chas zanimayu. Syuda mogut byt' vklyucheny fonovye processy, ostavshiesya v sisteme ot predydushchih pol'zovatelej moej terminal'noj linii ili dazhe processy, imeyushchie drugie identifikacionnye nomera pol'zovatelej (iz-za programm tipa setuid, kotorye ya mog zapustit'), kotorye zapushcheny s etoj zhe terminal'noj linii.

    POYASNENIYA

V strokah 4-9 vypolnyaetsya proverka na nalichie oshibok. Esli per- vyj pozicionnyj parametr ne -l i ne -u, to eto oshibka. Vyvoditsya soob- shchenie ob etom i programma zavershaetsya. V stroke 11 peremennaya OPT inicializiruetsya pustoj strokoj. |ta peremennaya soderzhit vse dopolnitel'nye opcii acctcom i ih argumenty. Stroki 12-19 predstavlyayut soboj cikl for, kotoryj povtoryaetsya po vsem pozicionnym parametram. Kazhdyj argument sveryaetsya v operatore case s dopustimymi opciyami. Esli opciej yavlyaetsya -l (stroka 15), v pe- remennuyu OPT zanositsya to znachenie, kotoroe ona uzhe imeet, opciya -l i dobavlyaetsya imya terminal'nogo ustrojstva, poluchennoe ot komandy UNIX'a tty. Komanda tty vyvodit i prefiks /dev, kotoryj ne nuzhen. Dlya togo chtoby izbavit'sya ot etogo prefiksa, my berem iz etoj simvol'noj stroki tol'ko osnovnoe imya. Esli ukazana opciya -u, v peremennuyu OPT dobavlyaetsya -u i nashe re- gistracionnoe imya. Esli argumentom yavlyayutsya lyubye drugie dannye, to oni prosto dobavlyayutsya v peremennuyu OPT. Postupaya takim obrazom, my mozhem peredat' v komandnoj stroke acme drugie opcii komande acctcom. Obratite vnimanie, chto zdes' ne vypolnyaetsya proverka na oshibki v argu- mentah komandnoj stroki. Vy mozhete vvesti nevernoe znachenie, kotoroe narushit rabotu komandy acctcom. Odnako eto ta cena, kotoruyu my vynuzh- deny platit' za gibkost' pri peredache argumentov v komandnoj stroke, inache nam pridetsya znachitel'no uvelichivat' tekst komandnogo fajla. Posle togo obrabotki vseh opcij stroka 21 vyvodit na ekran ko- mandnuyu stroku, kotoraya dolzhna byt' vypolnena, tak chto my znaem, chto my zadavali. V stroke 22 vypolnyaetsya sama komanda acctcom. Vyhodnoj rezul'tat sootvetstvuet opisaniyu acctcom(1). ------------------------------------------------------------- IMYA: inuse ------------------------------------------------------------- inuse Zapretit' ispol'zovanie terminala

    NAZNACHENIE

Blokiruet vash terminal putem perevoda v sostoyanie zanyatosti. Esli kto-libo popytaetsya vtorgnut'sya, vy eto zametite.

    FORMAT VYZOVA

inuse

    PRIMERY VYZOVA

inuse Perevod terminala v sostoyanie zanyatosti mypasswd Vvoditsya moj parol', no ne otobrazhaetsya na ekran

    TEKST PROGRAMMY

1 : 2 # @(#) inuse v1.0 Disable terminal and alert if used Author: Russ Sage 2a Zapretit' ispol'zovanie terminala i soobshchit' o popytke ispol'zovaniya 4 trap "echo you\'re BUSTED!!; stty echo; kill $$" 2 15 6 PATH=/bin:/usr/bin 7 SECRET="secret" 9 stty -echo 10 echo "Lock string: \c" 11 read BUF1 12 echo 14 while : 15 do 16 BUF2=`line < /dev/tty` 17 if [ "$BUF2" = "$BUF1" ] 18 then break 19 elif [ "$BUF2" = "$SECRET" ] 20 then break 21 fi 22 echo "^G\c" 23 done 24 stty echo OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL inuse? Rabochij den' vsegda zagruzhen: mnogo lyudej, eshche bol'she bumag, vsya- kie porucheniya i tak dalee i tak dalee. Kogda vy pokidaete svoe rabochee mesto, chto vy sobiraetes' delat' so svoim zaregistrirovannym termina- lom? Kazhdyj raz vhodit' v sistemu i vyhodit' iz nee slishkom dolgo, no vy ne hotite ostavlyat' vashu rabotu otkrytoj dlya vseh. Vam neobhodima programma, kotoruyu vy mozhete zapustit' na vremya vashego otsutstviya i kotoraya ne pozvolit drugim lyudyam ispol'zovat' to, chto vy delaete. Konechno, ne dostatochno imet' nekij process, kotoryj vypolnyaetsya v fonovom rezhime, sozdavaya vpechatlenie, chto terminal ispol'zuetsya. My dolzhny perehvatyvat' preryvaniya v sluchae, esli kto-nibud' vvedet sim- voly "preryvaniya" ili "vyhoda" s vashej klaviatury. Edinstvennym sposo- bom razblokirovaniya terminala dolzhen byt' vvod parolya ili zaranee op- redelennogo slova, kotoroe v lyubom sluchae razblokiruet ego. CHTO DELAET inuse? Inuse perevodit vash terminal v rezhim vechnoj raboty. |to oznachaet, chto terminal ne otvechaet na vashi zaprosy ili zaprosy kogo-to drugogo. Kogda vy gotovy razblokirovat' vash terminal, vvedite sekretnyj parol' ili parol', kotoryj vy pridumali. Kogda vy pervyj raz vyzyvaete inuse, u vas zaprashivaetsya parol'. |ho-otobrazhenie na terminal otklyucheno, poetomu parol' ne vyvoditsya na ekran. Dlya garantii togo, chto nikto ne pytaetsya pereadresovat' komand- nomu fajlu inuse kakoj-libo fajl dannyh, vse operacii chteniya proizvo- dyatsya neposredstvenno iz fajla terminal'nogo ustrojstva /dev/tty, a ne cherez fajlovyj deskriptor standartnogo vvoda. |to pozvolyaet zashchitit'sya ot popytok drugih pol'zovatelej vtorgnut'sya v rabotu terminala putem posylki na standartnyj vvod fajla bol'shogo razmera, soderzhashchego raznye slova. Posle chteniya vashego parolya inuse popadaet v beskonechnyj cikl, ko- toryj chitaet simvoly s klaviatury i sravnivaet poluchennye vhodnye dan- nye s dvumya parolyami. Kazhdyj raz, kogda kto-to vvodit chto-to nekor- rektnoe, vydaetsya zvukovoj signal. Kogda zhe vveden odin iz dopustimyh parolej, programma ostanavlivaetsya i terminal razblokiruetsya. My predlagaem dve realizacii inuse: komandnyj fajl interpretatora shell, privedennyj vyshe, i programmu na yazyke Si. Oni vypolnyayut odnu i tu zhe rabotu dovol'no pohozhimi sposobami. Oni demonstriruyut, naskol'ko pohozhi eti dva podhoda, a ih nebol'shie otlichiya rassmatrivayutsya nizhe. Snachala obsuzhdaetsya komandnyj fajl, a zatem Si-programma.

    POYASNENIYA

Stroka 4 inicializiruet operator trap. Pri aktivizacii obrabotchi- ka trap vypolnyayutsya tri komandy. Cel'yu primeneniya lovushki trap yavlyaetsya reagirovanie na lyubuyu po- pytku prervat' rabotu komandnogo fajla i prorvat'sya na vash terminal. Pervaya komanda vydaet preduprezhdenie o tom, chto vy vtorgaetes'. Vtoraya komanda pereklyuchaet terminal obratno v rezhim eho-otobrazheniya, tak chto vse, chto budet vposledstvii vvedeno s klaviatury, otobrazitsya na ekra- ne. i poslednyaya komanda zastavlyaet programmu sovershit' samoubijstvo. Kak my uvidim pozzhe, eto samoubijstvo yavlyaetsya osobym rodom prekrashche- niya raboty programmy. Obrashchenie k "samomu sebe" v operatore kill vy- polnyaetsya s ispol'zovaniem metasimvolov $$, kotorye predstavlyayut soboj identifikacionnyj nomer vypolnyayushchegosya shell-processa. Obrabotchik lo- vushek vklyuchaetsya signalami 2 i 15, kotorymi yavlyayutsya preryvanie i programmnoe zavershenie sootvetstvenno. Otmetim, chto signal vyhoda iz programmy (signal 3) zdes' ne ispol'zuetsya. Prichinu etogo my ob座asnim pozzhe. Stroka 6 ustanavlivaet marshrut, po kotoromu mozhet obrashchat'sya inuse. Tem samym inuse nikogda ne smozhet byt' "zastignut vrasploh" kem-nibud', kto pronik nezametno (v "troyanskom kone"). Stroka 7 inici- aliziruet sekretnyj parol' znacheniem "secret", kotoroe sovsem ne sek- retno. Vy mozhete izmenit' parol' na lyuboe slovo pered ustanovkoj ko- mandnogo fajla v vashej sisteme. V pravah dostupa k fajlu, v kotorom hranitsya tekst dannoj shell-programmy, vy dolzhny zapretit' vozmozhnost' chteniya. V protivnom sluchae drugie pol'zovateli smogut uvidet' sekret- noe slovo. Stroka 9 otklyuchaet eho-otobrazhenie, stroka 10 pechataet zapros pa- rolya, a stroka 11 chitaet parol', kotoryj vy vvodite, i zanosit ego v peremennuyu BUF1. Stroki 14-23 predstavlyayut soboj vechnyj cikl while, kotoryj mozhno prervat' tol'ko vvodom pravil'nogo parolya. Stroka 16 chitaet vvod s klaviatury. Pri nazhatii vozvrata karetki stroka 17 proveryaet, soot- vetstvuet li to, chto vvedeno s klaviatury, parolyu pol'zovatelya. Esli net, peremennaya BUF2 sravnivaetsya s sekretnym parolem. Esli kakoj-to iz parolej sovpadaet, operator break proizvodit vyhod iz cikla while, tem samym prekrashchaya vypolnenie programmy. Esli vvedennye dannye ne sootvetstvuyut ni odnomu iz parolej, to v stroke 22 vydaetsya zvukovoj signal i snova nachinaet vypolnyat'sya operator chteniya klaviatury. Esli parol' vveden pravil'no, v stroke 24 vklyuchaetsya eho-otobra- zhenie na terminal i programma zavershaetsya. Esli proishodit preryvanie, aktiviziruetsya operator trap. Dannaya operaciya podrobno rassmatrivaetsya nizhe.

    PODROBNEE O LOVUSHKAH

Nam nuzhno rassmotret' smysl klavishi vyhoda iz programmy. Ona pro- izvodit preryvanie, pohozhee na vse drugie preryvaniya, no krome togo vyvodit damp pamyati dlya zapushchennogo processa. My ostavlyaem klavishu vy- hoda netronutoj operatorom trap, poskol'ku ona stanovitsya nashej poslednej nadezhdoj na priostanovlenie komandnogo fajla inuse. Kogda vash terminal zablokirovan, on eho-otobrazhaet vvodimye s klaviatury simvoly, no ne reagiruet na nih. Tot, kto nazhimaet na klavishi, vidit eto i pytaetsya vyjti iz situacii, nazhimaya na klavishu preryvaniya (obych- no eto klavisha DEL). Kogda on eto delaet, na ekran vyvoditsya soobshchenie "you're busted", eho-otobrazhenie snova vklyuchaetsya i programma sama se- bya unichtozhaet (signal 15). Kogda signal unichtozheniya prinimaetsya prog- rammoj, etot signal lovitsya, pechataetsya soobshchenie i programma snova sama sebya unichtozhaet. |ta posledovatel'nost' vypolnyaetsya snova i sno- va, kak v vechnom cikle. Kazhdyj raz, kogda lovushka unichtozhaetsya i snova zapuskaetsya, ispol'zuetsya stek. Esli vse eto budet vypolnyat'sya dosta- tochno dolgo, to ves' stek zapolnitsya zapisyami ob aktivizacii i pere- polnitsya, avarijno zavershaya ves' seans raboty. Esli klavisha vyhoda budet nazhata do aktivizacii operatora trap, to programma zavershitsya chisto. Esli zhe klavisha vyhoda budet nazhata posle nachala raboty operatora trap, to proizojdet vydacha dampa pamyati processa i programma zavershitsya. |to ne sovsem chestnyj priem, no prog- rammirovanie na yazyke shell vynuzhdeno byt' imenno takim, i eto predup- rezhdaet vas o tom, chto chto= to ne v poryadke. Tekushchie znacheniya klavish dlya signalov preryvaniya i vyhoda otobra- zhayutsya komandoj stty(1). |ti znacheniya mozhno pereustanovit' v lyubye po vashemu zhelaniyu. U menya tekushchie ustanovki takie: speed 9600 baud; intr = DEL; quit = ^|; erase = ^h; kill = ^u; eof = ^d; Nabrav na klaviature "stty intr z", vy mozhete ustanovit' simvol z v kachestve signala preryvaniya vashih processov, poetomu takoe izmenenie klavishi preryvaniya i zapusk beskonechnogo cikla predstavlyaet soboj eshche odin sposob zashchity vashego seansa raboty. Poskol'ku vam potom nuzhno bu- det vernut' staroe znachenie, vy dolzhny zapomnit' to, chto vy delali. Takoj nastrojkoj signalov vy mozhete delat' s vashim terminalom pochti vse, chto hotite. |tot podhod daet men'shuyu stepen' zashchity, chem perehvat preryvanij, no mozhet obespechit' vas minimal'noj zashchitoj, ne privodya k vydache dampa pamyati. Teper' my predstavlyaem versiyu na yazyke Si. TEKST PROGRAMMY inuse NA YAZYKE SI 1 char id[] = "@(#) inuse v1.0 Disable terminal Author: Russ Sage"; 3 #include 4 #include 5 #include 7 #define SSIZ 7 8 #define BSIZ 512 9 #define BELL "\07" 10 #define LF "\n" 12 main() 13 { 14 register int fd, sig, n; 15 char secret[SSIZ]; 16 char buf1[BSIZ], buf2[BSIZ]; 17 struct sgttyb sav_tty, chg_tty; 19 secret[0] = 's'; 20 secret[1] = 'e'; 21 secret[2] = 'c'; 22 secret[3] = 'r'; 23 secret[4] = 'e'; 24 secret[5] = 't'; 25 secret[6] = '\n'; 27 buf1[0] = buf2[0] = '\0'; 28 if ((fd = open("/dev/tty",O_RDONLY)) == -1) 29 exit(1); 31 for (sig = 2; sig <= 15; sig++) 32 signal(sig, SIG_IGN); 34 if (gtty(0, &sav_tty)) 35 exit(2); 36 chg_tty = sav_tty; 37 chg_tty.sg_flags &= ~ECHO; 38 if (stty(0, &chg_tty)) 39 exit(3); 41 write(1,"Lock string: ",13); 42 read(fd, buf1, BSIZ); 43 write(1, LF, 1); 45 for (;;) { 46 n = read(fd, buf2, BSIZ); 47 buf2[n] = '\0'; 49 if (strcmp(buf2, buf1) == 0) 50 break; 51 if (strcmp(buf2, secret) == 0) 52 break; 53 write(1, BELL, 1); 54 } 55 stty(0, &sav_tty); 56 close(fd); 57 } OPISANIE ZACHEM NAM NUZHNA PROGRAMMA inuse (Si)? Versiya inuse na yazyke Si rabotaet pochti tak zhe, kak i versiya na yazyke shell. Osnovnoe otlichie zaklyuchaetsya v tom, chto komandnye fajly na yazyke shell pol'zuyutsya komandami razdela (1), v to vremya kak programmy na Si ispol'zuyut komandy razdelov (2) i (3). CHTO DELAET PROGRAMMA inuse (Si)? Teoreticheskie osnovy funkcionirovaniya takie zhe, kak i v shell-versii. Inicializiruetsya sekretnyj parol' (v dannom sluchae pri- menyaetsya takoj sintaksis, chtoby komanda strings(1) ne smogla posmot- ret' ego v ispolnyaemom module), perehvatyvayutsya signaly, chitaetsya pa- rol' pol'zovatelya i nachinaetsya beskonechnyj cikl, kotoryj chitaet simvo- ly s klaviatury. Kak tol'ko na klaviature chto-to nabrano i nazhata kla- visha vozvrata karetki, vhodnye dannye sravnivayutsya s dvumya izvestnymi parolyami. Esli oni sootvetstvuyut odnomu iz parolej, programma pere- ustanavlivaet terminal i zavershaetsya. Esli sovpadeniya ne proizoshlo, terminal vydaet zvukovoj signal i snova chitaet klaviaturu. Poskol'ku zdes' lovushki ne rabotayut, popytka prervat' zapushchennuyu programmu ne srabatyvaet. Edinstvennyj sposob prekratit' ee vypolnenie - ispol'zovat' komandu "kill -9". Signal 9 yavlyaetsya edinstvennym, ko- toryj nel'zya perehvatit'. Esli by eto mozhno bylo sdelat', to ne bylo by nikakogo sposoba prekratit' vypolnenie processa, krome kak vytashchit' vilku iz rozetki.

    POYASNENIYA

Stroka 1 pomeshchaet dokumentiruyushchuyu informaciyu v simvol'nyj massiv. Pri nalichii etogo teksta v ob容ktnom module komanda what(1) mozhet vy- nut' ego ottuda, chtoby my mogli posmotret' ego dlya identificirovaniya nashej programmy. Stroka 3 podklyuchaet fajl fcntl.h. |tot fajl soderzhit vse opredele- niya yazyka Si dlya otkrytiya, zakrytiya, chteniya i zapisi fajlov. Stroka 4 podklyuchaet fajl signal.h. My ispol'zuem etot fajl dlya opredeleniya pe- remennoj SIG_IGN, kotoraya yavlyaetsya otmetkoj ignorirovaniya signalov (signal_ignore). Stroka 5 podklyuchaet fajl sgtty.h, kotoryj my ispol'- zuem dlya opredeleniya vsego, chto otnositsya k polucheniyu informacii o terminale posredstvom vyzova ioctl(2). Stroka 7 opredelyaet razmer sekretnogo parolya. |tot razmer ne obya- zatel'no dolzhen byt' tochno takim, kak dlina parolya. |tot razmer ukazan dlya udobstva programmirovaniya. Stroka 8 ob座avlyaet razmer bufera, v kotoryj kazhdyj raz proizvo- ditsya chtenie s klaviatury. Hotya 512 simvolov slishkom mnogo dlya takogo schityvaniya, na samom dele chtenie prekrashchaetsya s prihodom simvola vozv- rata karetki. Nalichie bol'shogo bufera daet nam zapas pamyati. Stroki 9 i 10 opredelyayut upravlyayushchie simvoly zvukovogo signala i perevoda stroki. Stroka 14 ob座avlyaet nekotorye rabochie peremennye. Obratite vnima- nie, chto my ispol'zuem registrovye celye. Ispol'zovanie registrovyh peremennyh dlya uskoreniya raboty - poleznyj priem. Esli vy ob座avili slishkom mnogo peremennyh po sravneniyu s kolichestvom registrov v vashej mashine, ne budet nikakoj oshibki. Ostavshiesya peremennye rassmatrivayutsya kak obychnye peremennye. Peremennaya fd ispol'zuetsya v kachestve fajlovo- go deskriptora pri otkrytii fajla /dev/tty, peremennoj sig posledova- tel'no prisvaivayutsya znacheniya vseh signalov, a peremennaya n predstav- lyaet soboj chislo prochitannyh simvolov. Stroka 15 opredelyaet sekretnyj massiv. |tot simvol'nyj massiv so- derzhit nash sekretnyj parol', kotoryj pryamo zakodirovan v programme. Stroka 16 opredelyaet dva bufera, v kotorye my chitaem vvodimye simvoly. Buf1 prednaznachen dlya nashego pol'zovatel'skogo parolya, a buf2 dlya po- pytki vvoda parolya, kotoryj schityvaetsya, kogda my hotim prekratit' vy- polnenie programmy. Stroka 17 opredelyaet dve rabochie struktury, koto- rye soderzhat informaciyu ob ustanovkah terminala (ioctl). Zdes' u nas dve struktury, poskol'ku odna iz nih - pervonachal'naya, a vtoraya - ta, na kotoruyu my hotim izmenit', chtoby ne zabyt' pervonachal'nye ustanov- ki. Stroki 19-25 zagruzhayut parol' v sekretnyj massiv. My vypolnyaem posimvol'noe prisvoenie, poskol'ku pri takom prisvoenii lyubaya stroka simvolov v ob容ktnom module poluchaetsya razorvannoj. |to mera bezo- pasnosti dlya predotvrashcheniya vozmozhnosti zritel'nogo prosmotra s cel'yu izvlecheniya cennoj informacii. V stroke 27 eti dva bufera inicializiruyutsya v nulevoj razmer. Stroki 28 i 29 otkryvayut ustrojstvo /dev/tty. Esli vozvrashchaemyj deskriptor fajla raven -1, eto govorit ob oshibke i programma zaversha- etsya. Stroki 31 i 32 perehvatyvayut vse signaly. Cikl for rabotaet s signalami, imeyushchimi nomera ot 2 do 15. Dlya kazhdogo iz etih znachenij vypolnyaetsya sistemnyj vyzov signal s cel'yu ignorirovaniya signalov s takimi znacheniyami. V strokah 34-39 vypolnyaetsya modifikaciya terminal'nyh harakte- ristik dlya otklyucheniya eho-otobrazheniya simvolov. Stroka 34 poluchaet in- formaciyu ob ustanovkah terminala v strukturu sav_tty. Sistemnyj vyzov gtty - eto prosto programmnyj interfejs s sistemnym vyzovom ioctl(get_values). Esli etot vyzov neudachen, programma zavershaetsya. Stroka 36 zanosit dannye iz struktury sav_tty v strukturu chg_tty. Zatem stroka 37 prisvaivaet elementu sg_flags rezul'tat ope- racii otricaniya nad ego zhe znacheniem i simvolom ECHO, chto oznachaet "otklyuchit' eho-otobrazhenie". Posle etogo stroki 38 i 39 zapisyvayut iz- menennye znacheniya obratno na terminal'noe ustrojstvo. Sistemnyj vyzov stty - eto prosto programmnyj interfejs s sistemnym vyzovom ioctl(set_values). Stroka 41 vyvodit na ekran zapros na vvod parolya. Deskriptor faj- la 1 yavlyaetsya standartnym ustrojstvom vyvoda, a 13 - dlina stroki sim- volov. Stroka 42 chitaet BSIZ simvolov iz fajla /dev/tty. Posle chteniya na ekran vydaetsya simvol perevoda stroki. |to neobhodimo sdelat', poskol'ku pri otsutstvii eho-otobrazheniya na ekran ne vyvoditsya simvol perevoda stroki, kogda vy vvodite svoj parol'. Poetomu my vynuzhdeny vstavit' etot simvol zdes' sami. Stroki 45-54 predstavlyayut soboj beskonechnyj cikl, kotoryj chitaet simvoly s klaviatury. Stroka 46 vypolnyaet chtenie terminala dlya raspoz- navaniya parolya. V etoj stroke vvedennyj parol' pomeshchaetsya v buf2, a ne v buf1. My vyyasnyaem kolichestvo simvolov, prochitannyh v buf2 (n). Poskol'ku indeksirovanie massivov nachinaetsya s nulya, a ne s 1, pri vvode n simvolov my popadaem v konec teksta i zdes' my vstavlyaem nol' dlya togo, chtoby vse, chto bylo vvedeno, predstavlyalo soboj stroku sim- volov. My delaem eto potomu, chto komanda read ne proizvodit obrabotku simvol'noj stroki. |to delayut sistemnye vyzovy stdio. Ih opisanie na- hoditsya v razdele (3) rukovodstva po sisteme, a ne v razdele (2). Nam nuzhno oformit' prochitannye simvoly v vide stroki, chtoby ee mozhno bylo sravnit' s parolyami. Stroka 49 sravnivaet to, chto vveli s klaviatury, s tem parolem, kotoryj vy vveli v nachale raboty programmy. Esli eti simvol'nye stroki odinakovy, strcmp vozvrashchaet znachenie nol', kotoroe soobshchaet o sovpa- denii. Komanda break vyvodit vypolnenie iz cikla for, i programma pro- dolzhaetsya. Stroka 51 vypolnyaet takoe zhe sravnenie s sekretnym parolem. Esli proishodit sovpadenie, vy takzhe vyhodite iz cikla. Esli sovpadeniya ne proizoshlo, stroka 53 vydaet na terminal zvuko- voj signal i upravlenie peredaetsya operatoru read v nachalo cikla for. Esli proizoshel vyhod iz cikla for, upravlenie peredaetsya stroke 55. Proishodit zapis' pervonachal'noj informacii ob ustanovkah termina- la, tem samym vklyuchaetsya eho-otobrazhenie. Stroka 56 zakryvaet fajl /dev/tty, i proishodit normal'noe zavershenie raboty programmy. Vy mogli vidite, programma na yazyke Si, hotya i neskol'ko slozhnee, chem na yazyke shell, no imeet nekotorye preimushchestva. Ona ne mozhet byt' ostanovlena ili narushena nichem, krome komandy kill -9. Parol' v ispol- nyaemom module spryatan ot lyubopytnyh glaz. Vy poluchaete bol'shij uroven' zashchity i bolee yasnyj podhod za schet ispol'zovaniya yazyka nizkogo urovnya i napisaniya bolee dlinnoj programmy. ----------------------------------------------------------------- IMYA: lock ----------------------------------------------------------------- lock Blokirovanie i razblokirovanie fajlov

    NAZNACHENIE

Izmenyaet prava dostupa k fajlam na zapis' i chtenie, chto vyglyadit kak blokirovanie i razblokirovanie.

    FORMAT VYZOVA

lock [-u] file [...]

    PRIMER VYZOVA

lock $HOME Otklyuchit' vozmozhnost' zapisi dlya menya i vozmozhnost' chteniya/zapisi dlya gruppy i drugih pol'zovatelej po otnosheniyu k moemu registracionno- mu katalogu.

    TEKST PROGRAMMY

1 : 2 # @(#) lock v1.0 Lock and unlock files Author: Russ Sage 2a Blokirovanie i razblokirovanie fajlov 4 if [ $# -eq 0 ] 5 then echo "lock: incorrect argument count" >&2 6 echo "usage: lock [-u] file [...]" >&2 7 exit 1 8 fi 10 if [ "`echo $1 | cut -c1`" = "-" -a "$1" != "-u" ] 11 then echo "lock: invalid argument $1" >&2 12 echo "usage: lock [-u] file [...]" >&2 13 exit 1 14 fi 16 MODE1="go-rw" 17 MODE2="u-w" 19 if [ "$1" = "-u" ] 20 then shift 21 MODE1="go+r" 22 MODE2="u+w" 23 fi 25 chmod $MODE1 $@ 26 chmod $MODE2 $@

    PEREMENNYE SREDY VYPOLNENIYA

MODE1 Rezhimy dostupa k fajlu, otnosyashchiesya k gruppe pol'zovatelej i drugim pol'zovatelyam MODE2 Rezhimy dostupa k fajlu, otnosyashchiesya k vladel'cu OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL lock? Vse fajly v sisteme UNIX imeyut nekotorye prava dostupa. |ti rezhi- my izmenyayutsya v sootvetstvii s tem, kak ispol'zuetsya etot fajl. Dlya kazhdogo fajla dolzhny byt' ustanovleny tri nabora prav dostupa - dlya vladel'ca, gruppy i drugih pol'zovatelej. Obychno tekstovye fajly imeyut rezhim 644, a ispolnyaemye i katalogi - 755. Nekotorye sistemy prisvai- vayut po umolchaniyu drugie znacheniya. Esli vy hotite ogranichit' prava chteniya ili zapisi, sleduet ispol'zovat' komandu chmod(1). Novyj rezhim dolzhen ukazyvat'sya libo kak absolyutnoe vos'merichnoe chislo (naprimer, 777), libo kak bukvennoe vy- razhenie, ukazyvayushchee, kakaya kategoriya pol'zovatelej chto mozhet delat' (naprimer, ugo+rwx). Esli vy hotite dobavit' ili zapretit' opredelen- nye vozmozhnosti, legche ispol'zovat' dlya etogo bukvennoe vyrazhenie. No dazhe v takom sluchae nam budet polezno sredstvo, pozvolyayushchee umen'shit' chislo nazhatij na klavishi i izbavlyayushchee ot neobhodimosti tochno zapomi- nat' vse, chto kasaetsya prav dostupa k fajlu. CHTO DELAET lock? Lock - eto sredstvo, kotoroe upravlyaet pravami dostupa, obespechi- vayushchimi bezopasnost' vseh vashih fajlov. |tot komandnyj fajl obespechi- vaet neobhodimye rezhimy dostupa pol'zovatelej ili zapreta dostupa v ogranichennoj stepeni. Imeya zaranee opredelennye rezhimy dostupa, nashi fajly luchshe sohranyayutsya v bezopasnom sostoyanii. Vhodnymi dannymi dlya lock yavlyayutsya imena fajlov. Dopuskaetsya ispol'zovanie simvol'noj stroki s lyubym naborom imen fajlov. V nej dolzhno nahodit'sya po krajnej mere odno imya fajla. Imena fajlov s uka- zaniem katalogov takzhe dopuskayutsya. Dejstvie lock po umolchaniyu - blokirovanie ukazannogo fajla. Opciya -u razblokiruet ukazannyj fajl. Esli komande chmod peredano nevernoe imya fajla, eto sozdaet prob- lemy dlya nee i v etom sluchae vyvoditsya soobshchenie ob oshibke.

    PRIMERY

1. $ lock -u $HOME/src *.c Razblokirovanie moego kataloga s ishodnymi tekstami i vseh ishod- nyh fajlov na yazyke Si v tekushchem kataloge. Razblokirovanie daet voz- mozhnost' chteniya vsem i vozmozhnost' zapisi tol'ko mne. 2. $ lock $HOME/bin Blokiruet moj katalog bin tak, chtoby nikto ne mog chitat' ili pisat' v nego fajly. Dazhe hotya moj katalog nel'zya chitat', lyuboj posto- ronnij mozhet vse zhe vojti v nego komandoj cd, esli ustanovlen bit x. Esli on popytaetsya vypolnit' komandu ls, kazhdyj fajl budet vydavat' soobshchenie ob oshibke vida "filename not found" (fajl s imenem "filename" ne najden). Nikto ne mozhet poluchit' informaciyu iz indeksno- go deskriptora fajla, takuyu kak vremennye harakteristiki i prava dostupa, no lyuboj mozhet uvidet' imena vseh fajlov iz soobshcheniya ob oshibke.

    POYASNENIYA

Stroki 4-8 proveryayut schetchik argumentov. Esli ne byl ukazan ni odin argument, vyvoditsya soobshchenie ob oshibke. Dolzhno byt' ukazano hotya by odno imya fajla. Stroki 10-14 proveryayut, yavlyaetsya li pervyj simvol pervogo pozici- onnogo parametra znakom "minus" i otlichaetsya li pervaya opciya ot do- pustimoj opcii -u. Esli eti usloviya vypolnyayutsya, vyvoditsya soobshchenie ob oshibke i programma zavershaetsya. Stroki 16 i 17 inicializiruyut ustanovki rezhimov prav dostupa po umolchaniyu. MODE1 ustanavlivaetsya dlya zapreta chteniya i zapisi kategori- yam pol'zovatelej "gruppa" i "drugie". MODE2 ustanavlivaetsya dlya zapre- ta pol'zovatelyu (t.e. mne) prava zapisi. |to strahovka dlya menya ot sluchajnoj zapisi v fajl. Nam nuzhny dve takie peremennye, poskol'ku eti dva rezhima dovol'no raznye. Edinstvennyj sposob sdelat' eto - dvazhdy vyzvat' komandu chmod s dvumya razlichnymi ustanovkami. Stroki 19-23 proveryayut, byla li ukazana v komandnoj stroke opciya -u. Esli byla, ona ubiraetsya iz komandnoj stroki komandoj shift i pe- remennye rezhima inicializiruyutsya dlya razblokirovaniya fajlov. Stroka 21 razreshaet vozmozhnost' chteniya gruppe pol'zovatelej i drugim. Stroka 22 razreshaet mne vozmozhnost' zapisi. Obratite vnimanie, chto v komandnom fajle lock ne proishodit modifikacii bitov x, s ili t. |to sdelano na- merenno, poskol'ku bit x dolzhen byt' ustanovlen tol'ko v sluchae, esli fajl mozhet byt' ispolnyaemym. Dlya katalogov bit x dolzhen byt' ustanov- len tol'ko v sluchae, esli vy hotite, chtoby drugie pol'zovateli mogli zahodit' v etot katalog. My takzhe nikogda ne ustanavlivaem vozmozhnost' zapisi dlya gruppy pol'zovatelej i dlya drugih pol'zovatelej, no my otk- lyuchaem ee pri blokirovanii fajlov. |to dopolnitel'naya mera predosto- rozhnosti na sluchaj, esli fajl imeet ustanovlennymi takie prava dostupa k nemu, kotorye my po kakim-to prichinam ne zhelaem ostavlyat'. V strokah 25 i 26 vypolnyaetsya komanda chmod. Parametr $@ ispol'- zovan kak oboznachenie vseh imen fajlov, ukazannyh v komandnoj stroke. Takoj sposob pozvolyaet vam vyzyvat' lock s neskol'kimi imenami fajlov. Iz poslednih shesti glav vy dolzhny priobresti mnozhestvo idej o tom, kak mozhno obezopasit' sredu, v kotoroj vy rabotaete, kak imet' delo s drugimi pol'zovatelyami i voobshche bolee produktivno ispol'zovat' vash rabochij den'. My gotovy dvigat'sya dal'she v ponimanii sistemy UNIX i issledovanii vnutrennej raboty fajlovoj sistemy, ustrojstv i kommu- nikacij.

    * GLAVA 7. Ustrojstva i fajlovye sistemy *

TERMINALXNYE USTROJSTVA RABOTA S KLAVIATUROJ FAJLY termcap DISKOVYE USTROJSTVA FAJLOVYE SISTEMY ZAGRUZOCHNYJ DISK RAZMERNYE PARAMETRY c Bystraya ochistka ekrana mntf Montirovanie gibkogo diska v sistemnom dereve mntlook Poisk vseh montirovannyh fajlovyh sistem umntsys Razmontirovanie vseh fajlovyh sistem, krome kornevoj lrgf Sozdanie fajla maksimal'nogo razmera, dopustimogo v vashej sisteme

    USTROJSTVA I FAJLOVYE SISTEMY

    VVEDENIE

Nizhe urovnya izvestnoj nam oblasti fajlovyh sistem nahoditsya mir ustrojstv i ih drajverov. V dannoj glave my issleduem nekotorye meto- dy, neobhodimye dlya raboty s terminalami, diskami i neposredstvenno fajlovymi sistemami. Programmnoe sredstvo 'c' illyustriruet dostup k terminalu na primere operacii bystroj ochistki ekrana. Sleduyushchie tri sredstva - mntf, mntlook i umntsys - imeyut delo s montirovaniem i raz- montirovaniem fajlovyh sistem. Nakonec, sredstvo lrgf pozvolit vam proverit' predely emkosti vashej fajlovoj sistemy. SISTEMA UNIX I APPARATURA Pered tem, kak uglubit'sya v sushchnost' voprosa, davajte obsudim ne- kotorye elementarnye fakty, kotorye my dolzhny pomnit' pri rassmotrenii vseh sostavlyayushchih sistemy UNIX. Serdcem apparatury yavlyaetsya central'- nyj processor (CPU), kotoryj ispolnyaet instrukcii, upravlyayushchie mashi- noj, i fakticheski osushchestvlyaet vsyu rabotu. Operacionnaya sistema neob- hodima dlya rukovodstva rabotoj, vypolnyaemoj central'nym processorom, i dlya obespecheniya interfejsa mezhdu nim i resursami, trebuemymi dlya togo, chtoby sdelat' chto-to poleznoe: operativnoj pamyat'yu, vneshnej pamyat'yu i drugimi periferijnymi ustrojstvami, takimi kak terminaly i printery. Operacionnaya sistema, osobenno takaya vysokorazvitaya, kak UNIX, imeet mnozhestvo utilit i harakternyh osobennostej, no sejchas rech' ne ob etom. Serdcem operacionnoj sistemy (v dannom sluchae UNIX) yavlyaetsya yadro (kernel). YAdro upravlyaet processami i rukovodit vypolnyaemoj rabo- toj. Ono takzhe yavlyaetsya svoego roda mostom mezhdu apparaturoj i vneshnim mirom. V dannoj glave my obratim vnimanie na osnovnye vzaimootnosheniya mezhdu yadrom, processami i apparaturoj. V konechnom itoge sistema dolzhna vzaimodejstvovat' s vneshnimi ust- rojstvami. Nalichie bazovyh znanij ob ustrojstvah ves'ma vazhno dlya pol- nogo ponimaniya togo, kak UNIX obshchaetsya s vneshnim mirom. Pri rabote s mashinoj mnogo vremeni tratitsya na peredachu dannyh v mashinu i iz nee, a eto znachit, chto neobhodimo imet' delo so mnozhestvom razlichnyh tipov ustrojstv, kazhdoe iz kotoryh imeet svoj "harakter" i osobennosti. K nashemu schast'yu, UNIX byl razrabotan tak, chtoby oblegchit' uprav- lenie dannymi i ustrojstvami nastol'ko, naskol'ko eto vozmozhno. K na- shemu neschast'yu, imeetsya, po vsej vidimosti, nesokratimyj ob容m znanij, kotorymi my dolzhny ovladet' obyazatel'no. Na ris. 7-1 pokazana obshchaya struktura operacionnoj sistemy UNIX. My vidim, chto so storony yadra ob- rashchenie ko vsem vneshnim periferijnym ustrojstvam vypolnyaetsya kak k fajlam ustrojstv. Kazhdyj tip ustrojstv imeet svoj sobstvennyj drajver i specificheskuyu arhitekturu, no obrashchenie k kazhdomu ustrojstvu vypol- nyaetsya odinakovymi metodami. My uvidim, kak ispol'zovat' razlichnye sposoby dostupa k ustrojstvam i opredelim, kakie sposoby naibolee ef- fektivny. Ris. 7-1 Model' sredy sistemy UNIX -------------------------------------------------------------- +-----------+ | | +------------+ | Magnitnaya | | Printer | | lenta | +------------+ +-----------+ /dev/lp0 lpn /dev/rmt0 .../dev/rmtn \ | | / \ | | / \ | | / \ \ | | | | / / +-------------------+------- /dev/fd0 fd:1,2 | +-------------+ |--- +-----------+ /dev/tty00----| | PROCESSOR | | |Gibkij disk| +--------+ -- | | YADRO | |--- +-----------+ | | / | +-------------+ |-------- fdn | |kran | +-------------------+ +--------+ / / | | | \ \ +--------+ / | \ |Klaviat.| ttynn /dev/hd01 hdnn +--------+ +----------+ fd:0 | | | ZHestkij | | disk | | | +----------+ -------------------------------------------------------------- UNIX obrashchaetsya k periferijnym ustrojstvam cherez "special'nye fajly". Imeetsya dva tipa special'nyh fajlov: blochnye i simvol'nye. Oba tipa imeyut svoe prednaznachenie i osobennosti. Blochnyj (naprimer, /dev/hd0) ispol'zuet buferizaciyu i pozvolyaet poluchit' dostup k bol'shim ob容mam dannyh na zhestkom diske. Simvol'nyj (naprimer, /dev/tty00 ili /dev/rfd0) ne ispol'zuet znachitel'nuyu buferizaciyu, a vypolnyaet obmen s ustrojstvom po odnomu simvolu za obrashchenie. Dazhe nesmotrya na osobye svojstva takih fajlov, dlya nih podderzhivaetsya vse tot zhe mehanizm za- shchity, chto i dlya vseh drugih fajlov v sisteme. Pervaya oblast', kotoruyu my rassmotrim - terminal'nye ustrojstva i rabota s nimi. Predstavlennye programmy vklyuchayut v sebya sredstvo pod nazvaniem 'c' dlya bystroj ochistki ekrana, a takzhe primer programmy, kotoraya schityvaet znacheniya nazhatyh klavish i vypolnyaet opros nazhatiya odnoj klavishi. My takzhe rassmotrim primer fajla opisaniya terminala (termcap), kotoryj obespechivaet dostupnye opredeleniya harakteristik terminala. Zatem my rassmotrim diskovye ustrojstva - zhestkie i gibkie diski. My uvidim, chto imeyutsya razlichnye sposoby prosmotra razdelov diska s ispol'zovaniem fajlov ustrojstv. V dopolnenie k rabote s ustrojstvami my rassmotrim fajlovye sistemy na zhestkom diske. Vsem nam izvestno, chto sistema UNIX sushchest- venno orientirovana na diski, poetomu chem bol'she my znaem o fajlovyh sistemah, tem luchshe dlya nas. Dlya bolee polnogo ponimaniya razdelov diska i fajlovyh sistem my predstavim tri programmnyh sredstva. Sredstvo lrgf proveryaet granichnye znacheniya parametrov fajlovoj sistemy putem sozdaniya fajla naibol'shego vozmozhnogo razmera v vashej sisteme. Sredstvo mntf obespechivaet udobnyj sposob montirovaniya i razmontirova- niya gibkih diskov. Nakonec, sredstvo mntlook vypolnyaet poisk nemonti- rovannyh fajlovyh sistem, kotorye predstavlyayut soboj potencial'nuyu opasnost'.

    TERMINALXNYE USTROJSTVA

Drajvery terminal'nyh ustrojstv yavlyayutsya odnimi iz samyh slozhnyh drajverov ustrojstv. Prichina etogo zaklyuchaetsya v tom, chto sushchestvuet mnozhestvo urovnej programmnogo obespecheniya, kotorye podderzhivayut ha- rakteristiki interaktivnyh terminalov. Pri rabote terminala po posle- dovatel'noj linii svyazi neobhodima moshchnaya podderzhka dlya togo, chtoby oblegchit' ego ispol'zovanie. Razlichnye ustanovki, kotorye mozhet imet' terminal, programmiruyutsya komandami stty(1) i ioctl(2). Komanda termio(7) takzhe opisyvaet razlichnye aspekty protokola raboty termina- la. PROTOKOL OPERACIJ VVODA/VYVODA TERMINALA Protokol raboty terminala predstavlyaet soboj soglasovannyj nabor signalov, pozvolyayushchih sisteme pravil'no interpretirovat' vvodimye s klaviatury stroki. Protokol neobhodim po chetyrem prichinam. Pervoj yav- lyaetsya podderzhka vhodnoj obrabotki special'nyh simvolov, takih kak simvoly udaleniya i prekrashcheniya raboty programmy. Vo-vtoryh, nam neob- hodimo podderzhivat' obrabotku vyvodimoj informacii, naprimer, vstavku simvolov zaderzhki ili izmenenie posledovatel'nosti vozvrat karetki/pe- revod stroki. Tret'ej prichinoj yavlyaetsya podderzhka rezhimov neobrabotan- nogo i "kanonicheskogo" vvoda. |ti dva rezhima pozvolyayut pol'zova- tel'skim programmam poluchat' dannye ili po odnomu simvolu, ili po od- noj stroke. Poslednyaya prichina vvedeniya terminal'nogo protokola - zhela- nie sdelat' tak, chtoby pol'zovatel' mog sam izmenyat' parametry konfi- guracii terminala. Soderzhimoe terminal'noj podsistemy pokazano na ris. 7-2. Risunok razbit na tri chasti: sleva - oblast' pol'zovatelya, posredine - oblast' yadra i sprava - oblast' ustrojstva. |tot risunok pokazyvaet, kak pere- dayutsya dannye mezhdu terminalami i programmami pol'zovatelya. Ris. 7-2. Upravlenie protokolom terminala ------------------------------------------------------------------- Oblast' Oblast' yadra Oblast' pol'zovatelya ustrojstva Process +-------+ : : |Tekst | : +--------+ +--------+ +-------+ : dzrint() |-------| : ttread() |kanonich.| canon()|neobrab.| ttin()|priemn.| : +-----+ |Dannye | : /---|ochered' |<-------|ochered' |<------|bufer |<--|dbuf | | | : / +--------+ +--------+ / +-------+ : | | | +----+| : / struktura struktura / struktura : +-----+ | |ubuf||<---/ clist clist / ccblock : | +----+| : / : | +----+| : +--------- / ttxput() : | |ubuf||---- | : | +----+| : \ +-------+ <--+ +--------+ : +-----+ |-------| : \ |vyhodn.| |bufer | : |dbuf | |Stek | : \--->|ochered'|------->|peredachi|------------------->| | | | : +-------+ ttout()+--------+ dzxint() : +-----+ +-------+ : ttwrite() struktura struktura : clist ccblock /|\ | ------+ Granica drajvera ustrojstva ------------------------------------------------------------------- Kogda kakoj-libo process chitaet simvoly s ustrojstva, dannye na- chinayut dvigat'sya ot bufera drajvera ustrojstva, kotoryj nazyvaetsya dbuf. Iz etogo bufera dannye popadayut v priemnyj bufer, upravlyaemyj yadrom. Priemnyj bufer chitaetsya podprogrammoj yadra s imenem ttin(), i dannye pomeshchayutsya v strukturu clist, nazyvaemuyu neobrabotannoj oche- red'yu. (Slovo "neobrabotannaya" oznachaet, chto nad simvolami poka chto ne proizvodilos' nikakoj obrabotki.) V to zhe vremya simvoly takzhe pomeshcha- yutsya v vyhodnuyu ochered', chto pozvolyaet sisteme vypolnyat' eho-otobrazhe- nie simvolov po mere ih vvoda. Posle etogo podprogramma canon() prevrashchaet neobrabotannuyu oche- red' v kanonicheskuyu. ("Kanonicheskaya" oznachaet primenenie pravil, koto- rye v dannyj moment ustanovleny sistemoj dlya vypolneniya special'nyh funkcij nad strokoj teksta, naprimer dlya obrabotki simvola udaleniya.) Takaya obrabotka pozvolyaet preobrazovat' dannye pered tem, kak ih polu- chit process pol'zovatelya. Poslednej podprogrammoj yavlyaetsya ttread(), kotoraya chitaet simvoly iz kanonicheskogo bufera v bufer pol'zova- tel'skogo processa v oblasti dannyh processa. Kogda simvoly zapisyvayutsya iz processa pol'zovatelya na terminal, oni prodelyvayut pochti takoj zhe marshrut v obratnom napravlenii: ot ob- lasti processa k oblasti drajvera ustrojstva. Osnovnoe otlichie v podp- rogramme zapisi zaklyuchaetsya v tom, chto eti dannye prohodyat na odin bu- fer men'she. Ot processa pol'zovatelya simvoly peredayutsya v vyhodnuyu ochered' yadra podprogrammoj ttwrite(), a zatem v bufer peredachi s po- moshch'yu podprogrammy ttout(). Iz bufera peredachi oni peresylayutsya ne- posredstvenno v priemnyj bufer drajvera ustrojstva s pomoshch'yu podprog- rammy dzxint().

    OPREDELENIE VVODIMYH SIMVOLOV

Byvaet tak, chto my hotim uvidet', kakie simvoly vvodyatsya s klavi- atury. My mogli by dlya etogo napisat' programmu, no UNIX predostavlyaet vstroennuyu vozmozhnost' dlya etoj celi. |to komanda od - vos'merichnyj damp (octal dump). Takoe nazvanie ostalos' eshche s teh davnih vremen, kogda vos'merichnoe ischislenie shiroko primenyalos' pri otladke. K schast'yu, rezul'tat raboty komandy od mozhno poluchit' v simvol'nom, shestnadcatirichnom ili desyatichnom vide. Fokus ispol'zovaniya komandy od dlya proverki vhodnyh i vyhodnyh znachenij zak- lyuchaetsya v tom, chto od chitaet standartnoe ustrojstvo vvoda po umolcha- niyu, esli ne ukazan fajl. Naprimer, vyzov $ od -cx test string ^d ^d dast takoj rezul'tat: ------------------------------- | | 0000000 6574 7473 7320 7274 6e69 0a67 | t e s t s t r i n g \n | 0000014 | $ | Zdes' vyzov komandy od delaetsya bez ukazaniya imeni fajla v ko- mandnoj stroke i s primeneniem standartnogo vyvoda v kachestve vyvodno- go ustrojstva. My ispol'zuem opciyu -cx dlya togo, chtoby bajty interpre- tirovalis' kak simvoly ASCII, a sootvetstvuyushchie 16-bitovye slova otob- razhalis' v shestnadcatirichnom vide. Po mere togo, kak vy nabiraete sim- voly, oni otobrazhayutsya na ekrane, a komanda od sohranyaet ih v svoem bufere. V konce stroki nazhmite vozvrat karetki, zatem CTRL-D. Vvod CTRL-D zavershaet chtenie simvolov komandoj od i vydaet raspechatku, v kotoroj sverhu budut shestnadcatirichnye znacheniya, a snizu simvoly v ko- de ASCII. Obratite vnimanie, chto dva simvola, vyvodimye dlya kazhdogo shest- nadcatirichnogo slova, raspolagayutsya v obratnom poryadke po sravneniyu s dvumya bajtami, obrazuyushchimi eto slovo. Naprimer, slovo 6574 interpreti- ruetsya kak dva simvola, t i e, gde 65 - kod ASCII dlya simvola e, a 74 - ASCII-kod dlya simvola t. Dlya togo chtoby vyjti iz komandy od, vvedite eshche odin CTRL-D dlya prekrashcheniya blochnogo chteniya. Esli vy hotite eshche proveryat' simvoly, prodolzhajte ih vvodit'. Komanda od rabotaet neskol'ko zagadochno. Esli vy vvedete dostatochnoe kolichestvo simvolov, ona vydast na ekran informaciyu po nazhatiyu tol'ko lish' vozvrata karet- ki. No esli vy vveli vsego neskol'ko simvolov, trebuetsya nazhatie kak vozvrata karetki, TAK I CTRL-D dlya polucheniya rezul'tata na ekrane. Teper' my mozhem sdelat' odin fokus - izmenit' kanonicheskij sposob obrabotki pri chtenii simvolov komandoj od. |to pozvolit nam uvidet' effekt ot razlichnyh ustanovok protokola raboty. Dlya etogo prover'te tekushchie ustanovki vashego terminala. V versii System V ispol'zujte ko- mandu "stty -a", a v versii Berkeley vam nuzhno primenit' komandu "stty everything". System V vydaet gorazdo bol'she parametrov, chem Berkeley. (Naibolee populyarnye versii UNIX'a razrabotany i podderzhivayutsya sledu- yushchimi firmami: System V - firmoj AT&T Bell Laboratories, kotoraya v nastoyashchee vremya nazyvaetsya Unix System Laboratories; BSD (Berkeley Software Distribution) - Kalifornijskim universitetom v Berkli; XENIX - firmoj Microsoft.- Prim. perev.) Nizhe privoditsya primer iz XENIX: -------------------------- | | speed 9600 baud; line = 0; | intr = DEL; quit = ^|; erase = ^h; | kill = ^u; eof = ^d; eol = ^` | parenb -parodd cs7 -cstobp hupcl cread -clocal | -ignbrk brkint ignpar -parmrk -inpck istrip -inlcr -igncr icrnl -iuclc | ixon ixany -ixoff | isig icanon -xcase echo echoe echok -echonl -noflsh | opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel ff1 | Posle togo, kak my pocheshem golovu, my uvidim, chto tekushchij flag dlya kanonicheskoj obrabotki ustanovlen v sostoyanie "icanon". To est', my mozhem videt', chto on vklyuchen, poskol'ku net prefiksa v vide znaka minus (hotya eto ne yavlyaetsya strogim pravilom). CHto proishodit pri kanonicheskoj obrabotke? Simvol vozvrata na shag nazad (backspace) yavlyaetsya odnim iz vazhnyh voprosov. Kogda vy vvodite simvol CTRL-H, on postupaet v neobrabotannuyu ochered' kak literal'nyj simvol CTRL-H. Kogda programma canon() chitaet CTRL-H, ona ponimaet eto tak: "Izmenit' CTRL-H na simvol vozvrata na shag nazad, zapisat' probel na mesto simvola, zatem sdelat' eshche shag nazad." Pri eho -otobrazhenii vy poluchaete udalenie simvola na ekrane. Kogda kanonicheskaya obrabotka otklyuchena, vy posylaete CTRL-H kak obychnye simvoly. Vot primer togo, kak eto vyglyadit: ---------------------------- | | $ stty -icanon Otklyuchenie kanonicheskoj obrabotki | $ od -cx | test string^h^h^h^h^h^hcase | ^d... | | 0000000 6574 7473 7320 7274 6e69 0867 0808 0808 | t e s t s t r i n g \b \b \b \b \b | 0000020 6308 7361 0a65 0a04 0a0a 0a0a 0a0a 0a0a | \b c a s e \n 004 \n \n \n \n \n \n \n \n \n | Posle slova "string" vy vidite gruppu chisel 08, kotorye v ASCII-kode oboznachayut CTRL-H. |ti chisla 08 pokazyvayut vam, chto lite- ral'nye simvoly CTRL-H dejstvitel'no prisutstvuyut v ih "neobrabotan- noj" forme. Poskol'ku CTRL-H ne yavlyaetsya bol'she special'nym simvolom, komanda od rassmatrivaet ego podobno lyubomu drugomu simvolu. Zdes' voznikaet novaya problema: poskol'ku special'nye simvoly ne raspozna- yutsya, my poteryali vozmozhnost' zavershit' blochnoe chtenie vvodom simvola konca fajla (EOF). Kogda vvoditsya CTRL-D, on ponimaetsya prosto kak eshche odin simvol. Poetomu my dolzhny zapolnit' bufer komandy od, chtoby zastavit' ee vypolnit' damp. V nashem primere CTRL-D - eto simvol 004 posle simvolov case \n. Kstati, v sisteme Berkeley ispol'zuyutsya ustanovki "obrabotannaya" ("cooked") i "neobrabotannaya" ("raw") dlya stty, kotorye po sushchestvu sluzhat dlya teh zhe celej, chto "canon" i "-canon" v System V.

    DINAMICHESKOE PEREOPREDELENIE SIMVOLOV PRERYVANIYA

Obratite vnimanie, chto v predydushchej raspechatke komandy stty -a prisutstvuyut opredeleniya simvolov "intr" i "quit". |to dve funkcii, kotorye preryvayut rabotu vashih rabotayushchih processov. Stroki intr i quit predstavlyayut soboj osobye funkcii, a ne prosto nazhatie klavishi. |ti funkcii mozhno naznachit' na lyubuyu klavishu klaviatury pri pomoshchi ko- mandy stty. Esli my izmenili znachenie "intr" na drugoj simvol, to etot novyj simvol prervet vashi processy. Vy dazhe mozhete ustanovit' v kachestve klavishi preryvaniya obychnyj simvol. Vot kak eto mozhno sdelat': $ stty intr x $ this is a junk stringx $ Kogda vy vvodite simvol x v konce stroki, to vsya vvedennaya stroka obryvaetsya i vy poluchaete novyj simvol priglasheniya. Dlya togo chtoby vernut'sya k obychnomu rezhimu raboty, vvedite v kachestve simvola prery- vaniya staryj simvol. Esli starym simvolom byl "delete", vy daete takuyu komandu: $ stty intr DEL CHto zhe v etom horoshego? |to pokazyvaet, naskol'ko gibko rabotaet komanda stty s terminalom, i mozhet byt' ispol'zovano v kachestve lichnoj mery bezopasnosti, chtoby sbit' s tolku cheloveka, kotoryj zahotel by proizvesti kakoj-libo besporyadok s vashego terminala. Kogda vam nuzhno na minutu otojti ot terminala, izmenite klyuch preryvaniya na kakoj-libo drugoj i zapustite komandnyj fajl vrode takogo: while : do : done |tot beskonechnyj cikl budet vypolnyat'sya postoyanno. Esli kto-ni- bud' popytaetsya prervat' etot process, ispol'zuya klavishu DEL, nichego ne proizojdet. Kogda vy vernetes', nazhmite novuyu klavishu preryvaniya. Ona prervet cikl, i vy poluchite simvol priglasheniya. Ochen' vazhnym yavlyaetsya takzhe simvol "eof". On sootvetstvuet koncu fajla (end of file), i obychno im yavlyaetsya CTRL-D. |to ob座asnyaet, poche- mu vy vyhodite iz sistemy UNIX s pomoshch'yu CTRL-D. Kogda vy posylaete CTRL-D vashemu registracionnomu shell, vy tem samym govorite emu: "Shell, eto metka konca fajla dlya dannogo seansa raboty". Poskol'ku terminal rassmatrivaetsya kak fajl, CTRL-D zakryvaet fajl, a shell, ko- toryj rabotaet kak cikl vida "chitat' komandy s klaviatury, poka ne vstretitsya EOF", zavershaetsya, tem samym posylaya signal programme init. Programma init porozhdaet komandu getty po dannoj terminal'noj linii, kotoraya vyvodit na ekran priglashenie "login:" dlya ozhidaniya komandy ot sleduyushchego pol'zovatelya. Esli vy izmenite simvol konca fajla, vy bol'- she ne smozhete vyjti iz shell po CTRL-D. On budet vyvodit'sya na ekran tochno tak zhe, kak lyuboj drugoj simvol. Vot primer takih dejstvij: $ stty eof x $ x login: Teper' priznakom konca fajla yavlyaetsya obychnyj simvol x. Kogda vy vvodite simvol x, eto ravnosil'no vvodu CTRL-D, i vy vyhodite iz sistemy. Ochevidno, takie manipulyacii nezhelatel'ny, odnako eto pozvolya- et pokazat' tu bol'shuyu stepen' gibkosti, kotoruyu ispol'zuet UNIX pri prisvoenii razlichnyh funkcij raznym simvolam.

    FAJLY TERMINALXNYH USTROJSTV

Fizicheski adresaciya terminalov proizvoditsya posredstvom fajlov ustrojstv v kataloge /dev. Kogda vy registriruetes' v sisteme, vam prisvaivaetsya opredelennyj nomer terminala, naprimer tty01. |tot nomer terminala v dejstvitel'nosti yavlyaetsya fajlom /dev/tty01. Esli vy vyzo- vete komandu tty UNIX, ona vyvedet polnoe marshrutnoe imya fajla togo terminal'nogo ustrojstva, za kotorym vy rabotaete. Fajly terminal'nyh ustrojstv vyglyadyat tak zhe, kak obychnye fajly, za isklyucheniem togo, chto komanda "ls -l" pokazyvaet, kak nazyvayutsya starshij i mladshij nomera ustrojstva, kotorye ne yavlyayutsya chast'yu obych- nyh fajlov. Starshij nomer yavlyaetsya indeksom v tablice cdevsw[], koto- raya soderzhit adres drajvera ustrojstva, ispol'zuemogo yadrom dlya danno- go tipa ustrojstva. Mladshij nomer identificiruet konkretnoe fizicheskoe ustrojstvo. |ti nomera poyavlyayutsya v posledovatel'nom poryadke dlya vseh ustrojstv, ispol'zuyushchih odin i tot zhe drajver. Tak vyglyadit tipichnyj spisok fajlov ustrojstv v sisteme XENIX: ---------------------------- | | crw--w--w- 1 russ tricks 0, 0 Jun 22 02:34 /dev/console | crw--w--w- 1 russ tricks 0, 1 Jun 22 00:41 /dev/tty02 | crw--w--w- 1 root tricks 0, 2 Jun 21 17:56 /dev/tty03 | crw--w--w- 1 root tricks 0, 3 Jun 21 05:47 /dev/tty04 | crw-rw-rw- 1 root root 0, 4 Feb 18 17:09 /dev/tty05 | crw-rw-rw- 1 root root 0, 5 Feb 18 17:09 /dev/tty06 | crw-rw-rw- 2 root root 5, 0 Jun 21 20:23 /dev/tty11 | crw--w--w- 2 root tricks 5, 8 Jun 22 02:20 /dev/tty12 | crw-rw-rw- 2 root root 5,128 Feb 18 17:09 /dev/tty13 | crw-rw-rw- 2 root root 5,136 Feb 18 17:09 /dev/tty14 | Po simvolu 'c' v pervom stolbce my vidim, chto eto simvol'nye ust- rojstva, a bity prav dostupa pokazyvayut, kto imeet dostup k etim faj- lam. Pervyj stolbec chisel (0 ili 5) yavlyaetsya starshim nomerom. Mladshie nomera v sleduyushchem stolbce obychno sleduyut v posledovatel'nom poryadke, no ne vsegda (kak vidno v dannom primere). V dopolnenie k ispol'zovaniyu absolyutnogo nomera vashego terminala, odno iz ustrojstv ispol'zuetsya v kachestve "logicheskogo", ili "rodovo- go" adresa vashego terminala. Ono ispol'zuet drugoj drajver ustrojstva, nazyvaetsya /dev/tty i primenyaetsya v sluchayah, kogda standartnyj vvod i standartnyj vyvod pereadresovyvayutsya v drugie fajly, a prikladnoj programme neobhodimo chitat' s klaviatury ili pisat' na ekran. Pri po- moshchi dostupa k fajlu /dev/tty obrazuetsya svyaz' s samim terminalom. Vy- bor ispol'zovaniya ustrojstva s imenem tty vmesto ustrojstva tty01 glavnym obrazom zavisit ot togo, kakaya stoit zadacha. Esli vam neobho- dimo imet' nezavisimuyu ot tipa terminala programmu, ispol'zujte /dev/tty.

    PRAVA DOSTUPA K TERMINALU

Poskol'ku terminal'noe ustrojstvo yavlyaetsya fajlom, ono imeet re- zhimy prav dostupa tochno tak zhe, kak i vse drugie fajly. |ti rezhimy predstavlyayut soboj zashchitu dostupa k vashemu terminalu. Esli vse pol'zo- vateli imeyut pravo zapisi na vash terminal (eto oboznachaetsya kak rw--w--w-), to oni mogut zapisat' na vash ekran vse, chto ugodno, i vy nikogda ne uznaete, kto eto sdelal. Esli vy hotite predupredit' eto, to vypolnite komandu "chmod 600 `tty`", gde simvoly udareniya i obozna- chenie tty sootvetstvuyut marshrutnomu imeni vashego terminal'nogo fajla. Bolee prostoj v ispol'zovanii yavlyaetsya komanda UNIX'a mesg. Komanda "mesg n" zapreshchaet zapis' izvne na vash terminal. Vashi sobstvennye pro- cessy po-prezhnemu imeyut dostup na zapis'. Prava dostupa k terminalu svyazany takzhe s problemoj bezopasnosti, kotoruyu my rassmotrim v glave 9. Poka chto otmetim, chto vsyakij raz, kogda vy otkryvaete fajl (to li dlya chteniya, to li dlya zapisi), vam vozvrashchaetsya deskriptor fajla. Zatem vy mozhete ispol'zovat' etot desk- riptor fajla v sistemnom vyzove ioctl. Poluchenie etogo deskriptora fajla podobno polucheniyu klyucha k terminal'nomu interfejsu opredelennogo pol'zovatelya. Lyubye izmeneniya, proizvodimye s pomoshch'yu ioctl s dannym deskriptorom fajla, vyzyvayut nemedlennyj effekt, i narushitel' zashchity mozhet chitat' vse, chto zapisyvaetsya ili schityvaetsya s vashego terminala ili dazhe zastavit' vash terminal vypolnyat' komandy, kotorye prisvaivayut sebe nerazreshennye prava! Pol'zovatel', kotoryj rabotaet s etim termi- nalom, mozhet nikogda ne uznat', chto zhe proizoshlo ili kto eto sdelal. Drugim primerom podobnogo roda yavlyaetsya komanda write(1). Ona ispol'zuetsya dlya ustanovki svyazi po linii v real'nom rezhime vremeni, ili "boltovni". Ona obshchaetsya s terminalom putem vypolneniya zapisi v fajl ustrojstva. Izmenite bity prav dostupa, vyklyuchiv ih komandoj "mesg n", i nikto ne smozhet vypolnit' komandu write s vashim termina- lom. Takim sposobom vy mozhete "snyat' trubku telefona", kogda vy hoti- te, chtoby vam ne meshali. Vmeste s tem kto-nibud' mog by sdelat' takoe: $ while : > do > clear > /dev/tty00 > done & Pri etom sozdaetsya fonovyj beskonechnyj process (poka on ne budet prek- rashchen komandoj kill ili vyhodom iz sistemy), kotoryj posylaet pol'zo- vatelyu terminala tty00 simvoly ochistki ekrana. Kak tol'ko etot pol'zo- vatel' chto-nibud' nabiraet na ekrane, on tut zhe ochishchaetsya. Bol'shinstvo pol'zovatelej ne mogut dazhe ponyat', chto proishodit. Esli eto sluchitsya s vami, popytajtes' otklyuchit' prava dostupa k vashemu terminalu. Esli zhe tot, kto eto delaet, yavlyaetsya superpol'zovatelem (root), to nikakie prava dostupa ne smogut ostanovit' ego, poskol'ku superpol'zovatel' ne imeet ogranichenij po pravam dostupa k fajlam. V etom sluchae voznikaet problema dlya sistemnogo administratora! Eshche odna strannaya veshch' nablyudaetsya v sluchae, kogda kto-libo posy- laet chto-to na vash terminal komandoj write, a vy otklyuchaete prava dostupa. Komanda write po-prezhnemu imeet dostup k vashemu terminalu, poka ona ne zakroet ustrojstvo. Posle zakrytiya ona bol'she ne imeet prav dlya otkrytiya ustrojstva. Predstavlyaetsya strannym fakt, chto posle polucheniya dostupa k terminalu posleduyushchee zapreshchenie prava dostupa ne okazyvaet nikakogo vozdejstviya do teh por, poka vy ne prekratite rabo- tu s terminalom.

    OTMETKI O VREMENI DOSTUPA K TERMINALU

Eshche odnim atributom terminalov, kotoryj vyzvan tem, chto terminaly - eto fajly, yavlyayutsya daty modifikacii, dostupa i obnovleniya. Kazhdyj fajl v sisteme imeet eti tri daty, kotorye soderzhatsya v ego indeksnom deskriptore (v sekundah) v vide DLINNYH (long) chisel. |ti daty mogut soderzhat' nekotoruyu interesnuyu informaciyu. Kak by- lo otmecheno pri opisanii komandnogo fajla activ v predydushchej glave, data modifikacii predstavlyaet soboj poslednij moment vremeni, kogda pol'zovatel' chto-to nabiral na svoej klaviature. Drugie daty tozhe koe-chto oznachayut, no oni ne tak chasto ispol'zuyutsya.

    OBRABOTKA TERMINALOM VVODIMOJ INFORMACII

Kak uzhe obsuzhdalos' ranee, po umolchaniyu drajver terminala rabota- et v kanonicheskom rezhime, t.e. v rezhime postrochnoj obrabotki. Kogda vy vvodite simvoly, drajver ozhidaet, poka vy nazhmete vozvrat karetki, posle chego peredaet dlya obrabotki vsyu stroku. Esli vy rabotaete ne v kanonicheskom rezhime, to kazhdyj simvol peredaetsya dlya obrabotki ne- posredstvenno posle vvoda. Naglyadnym primerom takogo rezhima raboty yav- lyaetsya redaktor vi. Vy nazhimaete po odnoj klavishe dlya dvizheniya kurso- ra, udaleniya simvolov i t.d., poetomu redaktor vi, ochevidno, dolzhen poluchat' kazhdyj simvol srazu zhe, kak tol'ko nazhata klavisha. Kakim obrazom eto delaetsya v programme? Priem staryj i chasto ispol'zuetsya v UNIX, hotya i ne ochen' horosho opisan v dokumentacii. Ta- kogo roda informaciyu mozhno dobyt' putem prosmotra bol'shogo kolichestva tekstov programm. Neobhodimo otmetit', chto etot priem luchshe vsego ra- botaet v programmah na yazyke Si. Komandnye fajly, napisannye na yazyke shell, mogut ispol'zovat' dlya etoj celi komandu stty, no rezul'tat bu- det ne odin i tot zhe. Sleduyushchij fragment programmy na yazyke Si otklyu- chaet kanonicheskuyu obrabotku, zatem chitaet simvoly i vyvodit ih na ek- ran. 1 #include 3 struct termio tsav, tchg; 5 main (argc, argv) 6 { 7 int c; 9 if (ioctl (0, TCGETA, &tsav) == -1) { 10 perror("can't get original settings"); nevozmozhno poluchit' ishodnye ustanovki 11 exit(1); 12 } 14 tchg = tsav; 16 tchg.c_lflag &= ~(ICANON | ECHO); 17 tchg.c_cc[VMIN] = 1; 18 tchg.c_cc[VTIME] = 0; 20 if (ioctl (0, TCSETA, &tchg) == -1) { 21 perror("can't initiate new settings"); nevozmozhno zadat' novye ustanovki 22 } 24 while (1) 25 { 26 c = getchar(); 28 if (c == 'x') 29 break; 31 putchar(c); 32 } 34 if (ioctl(0, TCSETA, &tsav) == -1) { 35 perror("can't reset original settings"); nevozmozhno vernut' ishodnye ustanovki 36 exit(3); 37 } 38 } U nas est' dve "terminal'nye" struktury dannyh, odna iz kotoryh soderzhit ishodnye ustanovki, a drugaya - ustanovki, kotorye my izmenyaem i zapisyvaem. Pervyj sistemnyj vyzov ioctl poluchaet informaciyu ob ustanovkah terminala. Zatem my prisvaivaem eti znacheniya izmenyaemoj strukture (stroka 14). Modifikacii terminal'nogo interfejsa my vypol- nyaem v strokah 16-18. Stroka 16 otklyuchaet kanonicheskuyu obrabotku i eho-otobrazhenie simvolov. Stroka 17 ustanavlivaet, chto minimal'noe ko- lichestvo nazhatij na klavishi ravno odnomu. Stroka 18 opredelyaet, chto vremya ozhidaniya dlya povtornogo chteniya dannyh ravno 0. Po sushchestvu, eto blochnoe chtenie po odnomu simvolu. Novye znacheniya terminal'nyh harakteristik ustanavlivayutsya v stro- ke 20. V etot moment rezhim raboty terminala menyaetsya. Cikl while chita- et, proveryaet i vyvodit simvoly. Tol'ko pri vvode simvola x cikl za- vershaetsya, terminal ustanavlivaetsya v pervonachal'noe sostoyanie, i programma zakanchivaet rabotu. Kak my uzhe zametili, operaciya chteniya zdes' yavlyaetsya blochnoj. |to znachit, chto programma ozhidaet, poka vy vvedete simvol. Esli vy nichego ne vvodite, programma nahoditsya v beskonechnom cikle ozhidaniya. Kakim obrazom my izmenyaem rezhim chteniya s blochnogo na posimvol'nyj? |tot vopros ekvivalenten takomu voprosu: "Kak oprosit' klaviaturu v UNIX?". Opros yavlyaetsya ves'ma vazhnym priemom dlya nekotoryh primene- nij. Opros rabotaet primerno tak: "Posmotret' na klaviaturu. Esli vve- den simvol, poluchit' ego i kakim-to obrazom obrabotat'. V protivnom sluchae prodolzhat' delat' to, chto vy delali. Posle istecheniya intervala vremeni, opredelennogo programmoj, proverit' klaviaturu snova." Takim obrazom, esli pol'zovatel' ne nazhimaet na klavishi, programma prodolzha- et rabotu, a ne ozhidaet, poka chto-nibud' budet nazhato na klaviature. Dlya vypolneniya takoj raboty nam nuzhno neskol'ko bolee podrobno rassmotret' terminal'nyj interfejs. Kak bylo otmecheno ranee, terminal predstavlyaet soboj fajl. |to znachit, chto on dolzhen obladat' vsemi obychnymi svojstvami fajlov - vozmozhnost'yu otkrytiya, zakrytiya, chteniya, zapisi i t.d. My takzhe videli, chto terminaly imeyut protokol raboty, kotoryj mozhet byt' izmenen komandoj stty. My videli, chto dlya polucheniya odnogo simvola s klaviatury ispol'zuetsya protokol raboty. Teper' my uvidim, chto dlya vypolneniya oprosa vy dolzhny ispol'zovat' tehniku, ko- toraya otnositsya k fajlam, a ne ioctl. Sekret zdes' v tom, chtoby otkryt' terminal'nyj fajl, izmenyaya re- zhim ego otkrytiya. Zatem dlya polucheniya odnogo simvola ispol'zuetsya tot zhe tekst, chto i v predydushchem sluchae - tem samym opros dostignut. Vot tekst programmy: 1 #include 2 #include 4 struct termio tsav, tchg; 6 main (argc, argv) 7 { 8 int c; 10 /* change the terminal based on file primitives */ izmenit' rezhim terminala s pomoshch'yu fajlovyh primitivov 11 close(0); 12 if (open("/dev/tty",O_RDWR|O_NDELAY) == -1) { 13 perror("can't open tty"); nevozmozhno otkryt' tty 14 exit(1); 15 } 17 /* change the terminal based on line disciplines */ izmenit' rezhim terminala s pomoshch'yu protokola raboty 18 if (ioctl (0, TCGETA, &tsav) == -1) { 19 perror("can't get original settings"); nevozmozhno poluchit' ishodnye ustanovki 20 exit(2); 21 } 23 tchg = tsav; 25 tchg.c_lflag &= ~(ICANON | ECHO); 26 tchg.c_cc[VMIN] = 1; 27 tchg.c_cc[VTIME] = 0; 29 if (ioctl (0, TCSETA, &tchg) == -1) { 30 perror(can't initiate new settings"); nevozmozhno zadat' novye ustanovki 31 } 33 while (1) 34 { 35 putchar('.'); 36 c = getchar(); 38 if (c == 'x') 39 break; 41 putchar(c); 42 } 44 if (ioctl(0, TCSETA, &tsav) == -1) { 45 perror("can't reset original settings"); nevozmozhno vernut' ishodnye ustanovki 46 exit(3); 47 } 48 } Osnovnoe izmenenie proizvoditsya v strokah 11-15. Zakrytie fajla s nulevym deskriptorom (kotoryj oboznachaet standartnoe ustrojstvo vvoda) zakryvaet standartnyj vvod. Zatem my snova otkryvaem fajl /dev/tty. Znachenie deskriptora fajla ravno nulyu, tak chto my perenaznachili stan- dartnyj vvod na novoe ustrojstvo. Fokus v tom, chto pri otkrytii fajla ispol'zuetsya rezhim, nazyvaemyj NODELAY. |to oznachaet, chto kogda vypol- nyaetsya chtenie po dannomu deskriptoru fajla (t.e. chtenie standartnogo vvoda), vmesto ozhidaniya vvoda vypolnyaetsya prosmotr, est' li tam chto-nibud', a zatem rabota prodolzhaetsya. V beskonechnom cikle stroka 35 pechataet tochku. Kogda vy zapuskaete etu programmu, na ekran vyvoditsya tochka, kak tol'ko programma popadaet v cikl. Esli vy zhdete, to prodolzhayut vyvodit'sya tochki. Kak tol'ko vy nazhmete klavishu, vypolnitsya eho-otobrazhenie simvola v promezhutke mezhdu vyvodom tochek. |to demonstriruet, chto programma rabotaet v to vremya, kogda vy nichego ne delaete.

    VOZMOZHNOSTI TERMINALOV

Teper', kogda my imeem ponyatie o harakteristikah terminal'nyh in- terfejsov, davajte perejdem k vozmozhnostyam terminalov. VOZMOZHNOSTI - eto te funkcii, kotorye vypolnyaet apparatura terminala. Esli my znaem etu informaciyu, my mozhem sozdat' spisok vozmozhnyh funkcij i ispol'zo- vat' ego, naprimer, dlya raboty redaktora vi. |to osushchestvlyaetsya pri pomoshchi special'nogo fajla dannyh termcap (terminal capabilities - voz- mozhnosti terminala), kotoryj opisyvaet vozmozhnosti terminala. Bol'shinstvo iz sushchestvuyushchih tipov terminalov uzhe zaneseny v fajl termcap. |to fajl /etc/termcap. Fajl termcap i redaktor vi proishodyat iz sistemy Berkeley. Takaya kombinaciya okazalas' nastol'ko effektivnoj, chto byla perenesena v System V. V bolee pozdnej System V Release 3 fajl termcap uzhe ne ispol'zuetsya, ego zamenyaet fajl terminfo firmy AT&T. My primenyali fajl terminfo sovmestno s komandnym fajlom today v glave 5, no podrobnoe obsuzhdenie terminfo vyhodit za predely nashej knigi. V sisteme Berkeley fajl termcap po-prezhnemu ostaetsya standar- tom, i on zasluzhivaet bolee detal'nogo rassmotreniya. Imeetsya dokumentaciya po termcap, no ne dumajte, chto vy iz nee mnogo uznaete. V dokumentacii privodyatsya imena i odnostrochnye opisaniya podderzhivaemyh funkcij, no net informacii o tom, kak formirovat' iz nichego zapisi etogo fajla. Samoe luchshee, chto my mozhem posovetovat', eto vzyat' imeyushchuyusya zapis' i izmenit' ee. V kachestve primera my privodim zapis' fajla termcap dlya komp'yute- ra Apple II. |to opisanie rasprostraneno v razlichnyh formah, no nash primer otnositsya k videoplate Videx UltraTerm dlya Apple II+. Zametim, chto vozmozhnosti, predostavlyaemye fajlom termcap, yavlyayutsya obychno podm- nozhestvom teh vozmozhnostej, kotorye fakticheski predostavlyaet apparatu- ra. V chastnosti, videoplata v komp'yutere Apple vypolnyaet nekotorye funkcii, kotorye ne umeet delat' fajl termcap, naprimer kombinacii nastroechnyh bitov dlya izmeneniya videoatributov. Samoe bol'shee, chto my mozhem sdelat' s videoatributami posredstvom fajla termcap, eto vklyu- chit' ili vyklyuchit' inversnoe otobrazhenie. S drugoj storony, nekotorye tipy apparatury ne obladayut vsemi vozmozhnostyami, obespechivaemymi fajlom termcap. Naprimer, odnoj iz funkcij, kotoroj nedostaet v Apple, yavlyaetsya funkciya prokrutki ("scroll reverse"). Apparatura ne delaet etogo, poetomu i v termcap net neobhodimosti imet' opisanie etoj funkcii. Vmesto skrollinga (prokrutki) vniz, otobrazhaemyj na ekrane tekst prodolzhaet vyvodit'sya v verhnej stroke. Dlya togo, chtoby poluchit' predstavlenie o tom, kak termcap soot- nosit obshchie harakteristiki terminala s konkretnymi vozmozhnostyami, sravnim terminaly Apple i vt52. Dve sootvetstvuyushchie zapisi v termcap imeyut mnogo pohozhih funkcij, no sovershenno raznye kody dlya ih vypolne- niya. Privedem primer soderzhimogo fajla termcap: a2|aii|Apple II with UltraTerm :\ :bl=^G:\ :bs:\ :cd=^K:\ :ce=^]:\ :cl=^L:\ :cm=^^%r%+ %+ :\ :co#80:\ :cr=^M:\ :do=^J:\ :ho=^Y:\ :kb=^H:\ :kd=^J:\ :kl=^H:\ :kr=^\\:\ :ku=^_:\ :le=^H:\ :li#24:\ :nd=^\\:\ :nl=^J:\ :se=^O:\ :so=^N:\ :up=^_: V tabl. 7-1 predstavlen spisok funkcij fajla termcap s sopostav- leniem terminalov Apple i vt52. Esli kakaya-libo funkciya otsutstvuet u odnogo ili drugogo terminala, eto otmechaetsya slovom "net". Tablica 7-1 Terminal'nye vozmozhnosti i ih konkretnye znacheniya ------------------------------------------------------------- Funkciya Apple II vt52 ------------------------------------------------------------- bl - zvukovoj signal ^G ^G (bell) bs - vozvrat na shag po kodu ^H da da (can backspace with ^H) cd - ochistka do konca ekrana ^K \EJ (clear to end of display) ce - ochistka do konca stroki ^] \EK (clear to end of line) cl - ochistka vsego ekrana ^L \EH\EJ (clear entire screen) cm - dvizhenie kursora ^^%r%+ %+ \EY%+ %+ (cursor motion) co - chislo pozicij v stroke #80 #80 (number of columns in a line) cr - vozvrat karetki ^M ^M (carriage return) do - sdvig na stroku vniz ^J ^J (down one line) ho - kursor v nachalo ekrana (bez komandy cm) ^Y \EH (home cursor) kb - kod klavishi backspace ^H ^H (sent by backspace key) kd - kod klavishi "strelka vniz" ^J \EB (sent by down arrow key) kl - kod klavishi "strelka vlevo" ^H \ED (sent by left arrow key) kr - kod klavishi "strelka vpravo" ^\\ \EC (sent by right arrow key) ku - kod klavishi "strelka vverh" ^_ \EA (sent by up arrow key) le - kursor vlevo ^H ^H (cursor left) li - chislo strok ekrana #24 #24 (number of lines per screen) nd - nestirayushchij probel ^\\ \EC (nondestructive space) nl - simvol perevoda stroki ^J ^J (newline character) pt - nalichie apparatnoj tabulyacii net da (has hardware tabs) se - obychnyj ekran ^O net (end stand out mode (normal)) so - inversnyj ekran ^N net (begin stand out mode (inverse)) sr - prokrutka net \EI (scroll reverse) ta - simvol tabulyacii ^I ^I (tab) up - sdvig vverh na stroku net ^_ (up a line) ------------------------------------------------------------- Samoe interesnoe zdes', navernoe, to, chto terminaly vt52 i Apple imeyut vzaimno obratnyj poryadok ukazaniya koordinat v komande dvizheniya kursora. Terminal vt52 vosprinimaet znacheniya x i y v poryadke YX, chto yavlyaetsya umolchaniem dlya fajla termcap. Apple vosprinimaet ih v poryadke XY, poetomu v zapisi fajla termcap trebuetsya pomenyat' koordinaty mestami, chto ukazano oboznacheniem %r v funkcii cm. Fajl termcap pozvolyaet vam spryatat' osnovnuyu informaciyu o speci- ficheskih harakteristikah terminala (za isklyucheniem harakteristik, ko- torye mogut otsutstvovat' u terminala, ili special'nyh vozmozhnostej, kotorye ne opisany v termcap). |to znachit, chto vy mozhete sozdavat' terminal'no-nezavisimye programmy. Pri etom vam net neobhodimosti iz- menyat' vse specificheskie obrashcheniya k terminalu, takie kak ESC-posledo- vatel'nosti (simvoly, ukazyvayushchie terminalu, chto peredavaemye posle nih simvoly (simvol) dolzhny interpretirovat'sya kak upravlyayushchie kody). |to simvoly (\E) dlya terminala vt52 i (^) dlya Apple. Nailuchshij primer - sposob ispol'zovaniya fajla termcap redaktorom vi. On nachinaet vypolnyat' ukazannuyu emu funkciyu, naprimer dvizhenie kursora, posle chego stavit vopros: "Kakoj kod funkcii, kotoruyu my ho- tim vypolnit'?". Zatem on ishchet sootvetstvuyushchuyu posledovatel'nost' v toj informacii, kotoruyu predostavlyaet termcap. S drugoj storony, inogda vam neobhodimo optimizirovat' kakuyu-libo funkciyu po skorosti, zastaviv ee posylat' kody neposredstvenno na op- redelennyj terminal. V etom sluchae vam opyat'-taki polezen fajl termcap, poskol'ku vy mozhete najti neobhodimuyu informaciyu v soot- vetstvuyushchem fajle termcap, posle chego zakodirovat' etu informaciyu v vashej programme. |to my i delaem v pervoj instrumental'noj programme dannoj glavy - programme 'c'. -------------------------------------------------------- IMYA: c -------------------------------------------------------- c Bystraya ochistka ekrana

    NAZNACHENIE

Vyvodit posledovatel'nost' simvolov ochistki ekrana s ispol'zova- niem bystroj programmy na yazyke Si. Kod ochistki, ukazannyj v tekste programmy, sleduet izmenit' v sootvetstvii s ispol'zuemym terminalom.

    FORMAT VYZOVA

c

    PRIMER VYZOVA

c Ochistka ekrana

    TEKST PROGRAMMY

1 char id[] = "@(#) c v1.0 Fast clear screen Author: Russ Sage"; Bystraya ochistka ekrana 3 #define FF "\014" 5 main() 6 { 7 if (write(1, FF, 1) == -1) 8 write(2,"c: write error to stdout\n",25); oshibka zapisi v standartnyj vyvod 9 } OPISANIE ZACHEM NAM NUZHNA PROGRAMMA c? V System V uzhe imeetsya komanda dlya ochistki ekrana terminala - eto komanda clear. Ona rabotaet putem opredeleniya tipa vashego terminala i zatem vyvoda na ekran simvola ochistki dlya dannogo terminala. Vse prek- rasno, no est' odin sushchestvennyj nedostatok: ona ochen' MEDLENNAYA! My zhe hotim kak mozhno bystree vypolnit' ochistku ekrana. Samoj bystroj operaciej vvoda-vyvoda v sisteme yavlyaetsya pryamoj sistemnyj vy- zov dlya chteniya ili zapisi. My primenyaem etot vyzov, a takzhe vypolnyaem nebol'shuyu proverku oshibok dlya opredeleniya dostupnosti standartnogo ustrojstva vyvoda. CHTO DELAET c? Programma 'c' vyvodit na ekran simvol ochistki nastol'ko bystro, naskol'ko bystro mozhet vypolnyat'sya operaciya vvoda-vyvoda v UNIX. Pri- menyaya pryamoj sistemnyj vyzov, my izbavlyaemsya ot neobhodimosti za- puskat' druguyu programmu. Poetomu programma 'c' rabotaet ochen' bystro. My uvereny, chto tochno takuyu zhe funkciyu mozhno vyzyvat' kak komandu Si-shell (pomestit' v csh alias), poetomu dannaya programma naibolee polezna tem, kto rabotaet v System V. Dlya togo chtoby opredelit', kakoj simvol ochistki sootvetstvuet va- shemu terminalu, najdite stroku s oboznacheniem cl v fajle termcap. |to i est' to znachenie, kotoroe vy dolzhny vruchnuyu vstavit' v dannuyu prog- rammu. Esli vy rabotaete ne na takom terminale, dlya kotorogo eta prog- ramma napisana, to dannaya komanda budet rabotat' neverno.

    POYASNENIYA

Pervym delom my dolzhny najti v fajle termcap kod ochistki ekrana. Dlya terminala Apple eto kod ^L, a dlya vt52 eto \EH\EJ. Kak tol'ko vy najdete etot kod, vstav'te ego v operator define v stroke 3 ili srazu v operator write v stroke 7. V privedennom primere v kachestve simvola ochistki ekrana ispol'zuetsya ^L. Naibolee bystrym sposobom peredachi simvola v fajl yavlyaetsya ne- posredstvennoe vypolnenie operatora write. Poskol'ku terminaly yavlya- yutsya fajlami, my mozhem vypolnyat' zapis' neposredstvenno v nih, pol'zu- yas' preimushchestvom predopredelennyh deskriptorov fajla 0,1 i 2. Sistemnyj vyzov write v stroke 7 posylaet simvol ochistki v fajl s deskriptorom 1, kotoryj yavlyaetsya standartnym ustrojstvom vyvoda. Esli operaciya zapisi neudachna (po ryadu prichin), to v fajl s deskriptorom 2, t.e. na standartnoe ustrojstvo registracii oshibok, vyvoditsya soobshchenie ob oshibke. Zdes' ne proveryaetsya, uspeshno li zavershilas' zapis' na standartnoe ustrojstvo registracii oshibok. Esli oshibka vse-taki voz- niknet, to my ee uvidim. Programma ne ispol'zuet NIKAKIH vozmozhnostej standartnogo vvo- da-vyvoda (stdio). NIKOGDA nel'zya smeshivat' sistemnye vyzovy vvoda-vy- voda (t.e. vyzovy iz razdela (2) dokumentacii po sistemnym funkciyam, naprimer read ili write) so standartnymi vyzovami vvoda-vyvoda (t.e. vyzovami iz razdela (3), takimi kak getchar i printf). Dopolnitel'nyj bufer, kotoryj sozdaetsya pri vypolnenii funkcij stdio, ne soglasovan vo vremeni s sistemnymi vyzovami, poetomu vse vyhodnye soobshcheniya pere- meshivayutsya. Eshche odin aspekt, o kotorom my dolzhny pomnit', prinimaya reshenie ob ispol'zovanii sistemnyh vyzovov, eto preimushchestvo polucheniya kak mozhno bolee korotkogo ob容ktnogo koda. Nebol'shaya programma zagruzhaetsya i ra- botaet bystree. Dlya togo, chtoby nenuzhnye podprogrammy standartnogo vvoda-vyvoda ne vklyuchalis' v nash ob容ktnyj modul', v ishodnom tekste programmy ne delaetsya nikakih ssylok na podprogrammy stdio. Tem ne me- nee, vasha sistema mogla ih kakim-to obrazom vklyuchit'. Tak postupaet XENIX, a vmeste s stdio vyzyvaetsya malloc i vse ostal'noe. Vy mozhete prosmotret' tablicu simvolov vashego ob容ktnogo modulya s pomoshch'yu nm(1) ili nlist(2). Vy uvidite ves' musor, kotoryj byl dobavlen v vash ob容k- tnyj modul'. Ne tak redko my poluchaem 6 Kb koda vsego lish' dlya odnogo operatora printf! Priuchajtes' programmirovat' neposredstvenno na assemblere, chtoby dostich' togo, chto vam nuzhno.

    ISSLEDOVANIYA

Kogda eta programma byla napisana, voznik vopros: "Kakim obrazom my mozhem proverit' neudachu zapisi na standartnoe ustrojstvo vyvoda?". Ran'she takoj vopros ne stoyal, no pokazalos', chto neploho bylo by eto sdelat'. Reshenie bylo najdeno na stranicah opisaniya sh(1). Sposob, ko- torym mozhno vyzvat' oshibku vypolneniya zapisi na standartnoe ustrojstvo vyvoda, zaklyuchaetsya v tom, chto nuzhno zakryt' deskriptor fajla stan- dartnogo ustrojstva vyvoda. |to legko delaetsya s pomoshch'yu komandy exec, kotoraya yavlyaetsya vnutrennej po otnosheniyu k shell: $ exec >&- |ta komanda perenaznachaet fajlovyj deskriptor 1 standartnogo vy- voda (oboznachenie >) na deskriptor fajla (&) zakrytogo ustrojstva (-). Takoj eksperiment mozhet okazat'sya poleznym dlya bolee polnoj otladki vashih programm.

    DISKOVYE USTROJSTVA

K diskovym ustrojstvam otnosyatsya gibkie i zhestkie diski. Kazhdyj disk mozhet byt' razdelen na odnu ili neskol'ko chastej, kazhdaya iz koto- ryh svyazana s fajlom ustrojstva. Osnovnoe otlichie mezhdu diskami i terminalami zaklyuchaetsya v tom, chto diski yavlyayutsya blochnymi ustrojstvami, a terminaly - simvol'nymi. Vmesto togo, chtoby vypolnyat' obmen informaciej po odnomu simvolu, diski obmenivayutsya blokami po 512 ili 1024 simvola. Imeyutsya komandy, kotorye upravlyayut razbieniem na bloki i buferizaciej, chto delaet voz- mozhnym vypolnenie blochnyh operacij vvoda-vyvoda.

    RAZBIENIE DISKOV NA RAZDELY

CHasti, ili oblasti diska, izvestny kak razdely. Razdel mozhet so- derzhat' fajlovuyu sistemu, kotoraya sgenerirovana komandoj mkfs(1), ili zhe mozhet soderzhat' nestrukturirovannye dannye, dostup k kotorym vypol- nyaetsya s pomoshch'yu komandy 'cpio -o'. V sisteme XENIX upravlenie razdelami osushchestvlyaetsya programmoj fdisk, kotoraya konceptual'no podobna svoej tezke v sisteme MS-DOS. V drugih sistemah UNIX ispol'zuyutsya drugie imena. Naprimer, v sisteme AT&T 7300 UNIX PC ispol'zuetsya programma iv, chto znachit "format" (ho- tite ver'te, hotite net). Kak upominalos' ranee, obychno razdely soder- zhat odnu fajlovuyu sistemu. V nastoyashchee vremya v sistemah XENIX i SCO XENIX u vas est' vozmozhnost' "razdelit' razdel" na bolee melkie chasti dlya polucheniya bol'shego kolichestva fajlovyh sistem. |to sdelano po toj prichine, chto mashiny s sistemami DOS i XENIX ogranicheny chetyr'mya disko- vymi razdelami, a u vas mozhet vozniknut' zhelanie imet' bol'she fajlovyh sistem, chem chislo dostupnyh razdelov. V sisteme AT&T 7300 UNIX PC up- ravlenie razdelami diska osushchestvlyaetsya po spisku nachal'nyh nomerov dorozhek. Vy mozhete sozdat' stol'ko razdelov, skol'ko hotite. Kazhdyj komp'yuter imeet svoi preimushchestva i nedostatki. V kataloge /dev nahodyatsya imena kak blochnyh ustrojstv, tak i sim- vol'nyh. Po etim imenam vyzyvayutsya razlichnye drajvery ustrojstv. Nizhe privoditsya primer spiska interfejsov zhestkih diskov. ------------------------- | | brw------- 1 sysinfo sysinfo 1, 0 Feb 18 17:07 /dev/hd00 | brw------- 1 sysinfo sysinfo 1, 15 Feb 18 16:59 /dev/hd01 | brw------- 1 sysinfo sysinfo 1, 23 Feb 18 16:59 /dev/hd02 | brw------- 1 sysinfo sysinfo 1, 31 Feb 18 16:59 /dev/hd03 | brw------- 1 sysinfo sysinfo 1, 39 Feb 18 16:59 /dev/hd04 | brw------- 1 sysinfo sysinfo 1, 47 Feb 18 17:07 /dev/hd0a | brw------- 1 sysinfo sysinfo 1, 55 Feb 18 17:09 /dev/hd0d | crw------- 1 sysinfo sysinfo 1, 0 Feb 18 16:59 /dev/rhd00 | crw------- 1 sysinfo sysinfo 1, 15 Feb 18 16:59 /dev/rhd01 | crw------- 1 sysinfo sysinfo 1, 23 Feb 18 16:59 /dev/rhd02 | crw------- 1 sysinfo sysinfo 1, 31 Feb 18 16:59 /dev/rhd03 | crw------- 1 sysinfo sysinfo 1, 39 Feb 18 16:59 /dev/rhd04 | crw------- 1 sysinfo sysinfo 1, 47 Feb 18 16:59 /dev/rhd0a | crw------- 1 sysinfo sysinfo 1, 55 Feb 18 17:09 /dev/rhd0d | Imena fajlov s prefiksom hd ukazyvayut blochnye ustrojstva, a s prefiksom rhd - "nestrukturirovannye" simvol'nye ustrojstva. Ne vse simvol'nye ustrojstva yavlyayutsya nestrukturirovannymi blochnymi ust- rojstvami. Terminaly yavlyayutsya simvol'nymi ustrojstvami, kak my uzhe vi- deli ranee v dannoj glave. V tabl. 7-2 pokazany razlichnye harakte- ristiki etih dvuh tipov ustrojstv. Tablica 7-2 Sravnenie blochnyh i simvol'nyh ustrojstv ------------------------------------------------------------- Blochnoe ustrojstvo Simvol'noe ustrojstvo ------------------------------------------------------------- /dev/hd0, /dev/fd0 /dev/rhd0, /dev/rfd0 bufer upravlyaetsya yadrom buferizaciya otsutstvuet, sistemy, medlennoe ustrojstvo bystroe ustrojstvo proizvol'noe razmeshchenie posledovatel'noe razmeshchenie blokov dannyh blokov dannyh dostup cherez fajlovuyu dostup neposredstvenno sistemu na disk cpio -p cpio -o, -i mkfs, mount, df, du tar fsck, fsdb ------------------------------------------------------------ Kak vidite, sushchestvuet mnogo sposobov raboty s ustrojstvami. Davajte rassmotrim ustrojstvo /dev/hd01 iz privedennogo vyshe spiska. Esli vy hotite adresovat'sya k fizicheskomu razdelu na diske kak k blochnomu ustrojstvu, vy mozhete sozdat' na nem fajlovuyu sistemu. Dlya etogo vam nuzhno vypolnit' sleduyushchuyu komandu, kotoraya sozdast fajlovuyu sistemu razmerom 5000 Kb (5 Mb) na zhestkom diske: # mkfs /dev/hd01 5000 Vnutri razdela (razmerom ne menee 5000 Kb) razmeshchaetsya fajlovaya sistema. Fajlovaya sistema soderzhit superblok, spiski svobodnyh blokov i t.p., to est' vse, chto neobhodimo dlya hraneniya fajlov, kotorye raz- meshchayutsya zdes'. Odnako, sozdanie fajlovoj sistemy sovsem NE oznachaet, chto vy srazu zhe mozhete poluchit' k nej dostup. Snachala vam neobhodimo smontirovat' fajlovuyu sistemu. Komanda dlya vypolneniya etoj operacii mozhet imet' takoj vid: # mount /dev/hd01 /mount_pt Fajly mogut byt' pomeshcheny v diskovyj razdel komandami mv ili cp, putem pereadresacii vyvoda v katalog s etim imenem, naprimer, >/mount_pt/file. Dlya ispol'zovaniya razdela diska v kachestve oblasti nestrukturiro- vannyh dannyh, a ne blochnogo ustrojstva, primenyajte fajl s imenem sim- vol'nogo ustrojstva, kotoroe nachinaetsya s bukvy r. Naprimer, dlya ispol'zovaniya togo zhe ustrojstva, chto i v predydushchem primere, v ka- chestve nestrukturirovannogo ustrojstva, ukazhite imya /dev/rhd01. (Iz spiska ustrojstv vy vidite, chto eto simvol'noe ustrojstvo, tak kak prava dostupa v pervoj kolonke nachinayutsya s simvolov crw, a ne brw). |to ustrojstvo (i sootvetstvuyushchij razdel) v dannyj moment ne imeet fajlovoj sistemy i yavlyaetsya prosto naborom bajtov. Edinstvennym ogra- nicheniem yavlyaetsya to, chto vy mozhete zapisat' v etot razdel ne bolee 5 Mb dannyh. Vot primer komandy, ispol'zuyushchej nestrukturirovannoe ustrojstvo: $ find . -print | cpio -ocBv > /dev/rhd01

    IZUCHENIE DANNYH

Kogda dannye nahodyatsya na diske, ih mozhno izuchit' bolee tshchatel'- no, chem s pomoshch'yu komand cat, more i drugih. Delaetsya eto komandoj od(1), kotoraya vydaet damp fajla ustrojstva, kak pokazano v sleduyushchem primere: $ od -c /dev/hd01 Esli by vy poluchali damp fajla NESTRUKTURIROVANNOGO ustrojstva (/dev/rhd01), to eto vyglyadelo by tochno tak zhe. Edinstvennoe otlichie zaklyuchaetsya v tom, kak drajver osushchestvlyaet dostup k dannym. Format, v kotorom budut vyvodit'sya dannye, zavisit ot togo, kakoj komandoj pro- izvodilos' kopirovanie: cpio, tar, mkfs ili kakoj-to inoj. Nekotorye drugie sposoby polucheniya dannyh s ustrojstva: $ cat /dev/hd01 $ cat < /dev/hd01 $ tail /dev/fd0 Esli vy dampiruete fajl ustrojstva, soderzhashchego fajlovuyu sistemu, to dannye budut predstavlyat' soboj neuporyadochennye bloki po 512 bajt. V odnom meste vy mozhete uvidet' spiski katalogov. Drugimi slovami, od- no i to zhe ustrojstvo mozhet rassmatrivat'sya dvumya sovershenno raznymi sposobami: kak fajlovaya sistema i kak nabor nestrukturirovannyh bitov. Hotya vypolnenie chteniya dvumya etimi sposobami mozhet byt' pouchitel'nym, v bol'shinstve sluchaev u vas ne vozniknet zhelaniya vypolnit' ZAPISX in- formacii na odno i to zhe ustrojstvo dvumya sposobami, poskol'ku, napri- mer, nestrukturirovannoe ustrojstvo ne budet nichego znat' o fajlovoj sisteme v dannom razdele i mozhet zateret' dannye, otnosyashchiesya k fajlo- voj sisteme. Teper', kogda vy znaete, kak osushchestvit' dostup k disku, myslenno vernemsya k glave 2 i programmam kopirovaniya. Komandnyj fajl cpiobr ispol'zuet dlya kopirovaniya fajlov nestrukturirovannoe diskovoe ust- rojstvo /dev/rfd0, v to vremya kak autobkp ispol'zuet fajlovuyu sistemu. Bol'shinstvo iz etih sposobov raboty s ustrojstvami mogut poka- zat'sya neskol'ko ekzotichnymi i prednaznachennymi v osnovnom dlya shutki i obucheniya. Odnako chasto shutka pomogaet produktivno rabotat'. Ved' pyta- yas' zastavit' sistemu sdelat' to ili inoe, vy mozhete otkryt' dlya sebya novye vozmozhnosti sistemy. Situaciya s apparaturoj ochen' pohozha. Poyav- lyayutsya novye ustrojstva, i trebuyutsya gody dlya razrabotchikov programm- nogo obespecheniya, chtoby obnaruzhit' vse vozmozhnosti mashiny. Sistema UNIX sushchestvuet v tom ili inom vide uzhe bolee desyati let, no pol'zova- teli do sih por otkryvayut ee novye i udivitel'nye sposobnosti. Itak, poskol'ku vy obychno dolzhny vybrat' tot ili inoj metod ispol'zovaniya razdela diska, to nichto ne meshaet vam zavesti na ust- rojstve vse razdely odinakovogo tipa. Obychnym podhodom yavlyaetsya sozda- nie fajlovyh sistem vo vseh vozmozhnyh razdelah, chtoby oni mogli soder- zhat' fajly. Tem ne menee, vy mozhete sochetat' fajlovuyu sistemu s "nest- rukturirovannymi" razdelami lyubym sposobom, kotoryj vam nravitsya. Od- noj iz vozmozhnyh shem yavlyaetsya ispol'zovanie odnogo razdela (fd01) v kachestve nestrukturirovannogo ustrojstva dlya kopirovaniya fajlov koman- doj "cpio -o". |tot razdel zanimaet pochti ves' disk, no kakaya-to chast' otvoditsya dlya razmeshcheniya vtorogo razdela s fajlovoj sistemoj (fd02). Raspredelennoe prostranstvo soderzhit nekotorye spravochnye (help) fajly i tekstovyj fajl s imenami fajlov, nahodyashchihsya v nestrukturirovannom razdele. Takoe razbienie na razdely ispol'zuet preimushchestva oboih sposobov. Dlya togo chtoby poluchit' dannye, skopirovannye komandoj cpio, vy vvodite komandu "cpio -i < /dev/rfd01". Dlya polucheniya dannyh iz vtorogo razdela, vy vvodite komandu "mount /dev/fd02 /mnt", a zatem ispol'zuete komandy ls, file, grep i drugie, kotorye otnosyatsya k faj- lovoj sisteme. V etom sluchae razdel s fajlovoj sistemoj sluzhit dlya do- kumentirovaniya nestrukturirovannogo razdela. ZAGRUZHAEMYJ DISK I AVTONOMNYJ shell (SASH) Installyaciya sistemy UNIX na zhestkij disk obychno vypolnyaetsya s po- moshch'yu avtonomnogo shell (SASH, standalone shell). Inogda eta operaciya vypolnyaetsya s magnitnoj lenty, no legche vsego ispol'zovat' gibkij disk. Voznikaet vopros: "Kak zagruzit' UNIX s gibkogo diska?" Kartina sleduyushchaya: gibkij disk imeet odin razdel ili dazhe mozhet byt' razdelen na kornevoj razdel i razdel pol'zovatelej. V lyubom slu- chae gibkij disk imeet fajlovuyu sistemu, sozdannuyu drugoj sistemoj i pomeshchennuyu na disk. Pervyj blok fajlovoj sistemy yavlyaetsya zagruzhaemoj zapis'yu, kotoraya razmeshchaetsya na nositele s pomoshch'yu komandy dd. Komanda dd kopiruet bajty, nachinaya s samogo nachala ustrojstva. Zagruzochnaya za- pis' soderzhit kod, neobhodimyj dlya zapuska sistemy UNIX s diska. Vtoroj blok - eto superblok, svoego roda glavnyj katalog fajlovoj sistemy. V nem nahodyatsya indeksnye deskriptooy fajlov, soderzhashchie in- formaciyu o kazhdom fajle, a takzhe spisok dostupnyh svobodnyh blokov. Kornevaya fajlovaya sistema imeet takzhe variant yadra dlya gibkogo diska, kotoryj zagruzhaetsya i zapuskaet shell tochno tak zhe, kak eto delaet ego starshij brat (yadro sistemy dlya zhestkogo diska) dlya vsej sistemy v ce- lom. Vy dazhe mozhete smontirovat' installyacionnyj disk na zhestkij disk s drugoj sistemoj i vypolnyat' komandy kopirovaniya. Ogranichivayushchim fak- torom yavlyaetsya razmer odnogo installyacionnogo diska. Samyj bol'shoj ob容m gibkogo diska na mashinah PC - 1.2 Mb (ispol'zuetsya na PC AT), chto vpolne dostatochno. Mozhno umestit' pochti vsyu programmu zagruzki, kotoraya neobhodima dlya zapuska mnogopol'zovatel'skoj sistemy s gibkogo diska. Kak tol'ko yadro sistemy s gibkogo diska zagruzheno, imeetsya polnaya fajlovaya sistema so vsemi fajlami ustrojstv. YAdro montiruet razdel zhestkogo diska (predpolagaetsya, chto zhestkij disk byl razbit na razde- ly) i kopiruet na nego fajly v formate fajlovoj sistemy. Vot kak eto vyglyadit: # mount /dev/hd01 /mnt <-vyzov s gibkogo diska dlya montirovaniya pervogo razdela zhestkogo diska # copy /unix /mnt <-kopirovanie yadra zhestkogo diska v razdel zhestkogo diska

    OBNOVLENIE FAJLOVOJ SISTEMY

My opisali superblok kak zapis' s klyuchevoj informaciej o razmere i soderzhimom fajlovoj sistemy. Prichinoj razrusheniya fajlovoj sistemy obychno yavlyayutsya problemy, voznikayushchie v superbloke. Komanda sync(1) vypolnyaet zapis' obraza superbloka na disk, tem samym obnovlyaya ego. Inogda eta operaciya dolzhna vypolnyat'sya avtomaticheski i postoyanno dlya togo, chtoby obrazy superbloka na diske i v pamyati byli odinakovy. V nastoyashchee vremya v System V vklyuchena programma update, kotoraya zapuska- etsya iz zagruzochnogo fajla /etc/rc. Ona zhivet v sisteme i ispolnyaet komandy sync i sleep. V rezul'tate informaciya o sostoyanii fajlovoj sistemy na diske hranitsya so vsemi tekushchimi izmeneniyami, proizvedenny- mi s samoj fajlovoj sistemoj. Esli u vas net takoj programmy, vy mozhe- te napisat' komandnyj fajl na yazyke shell, kotoraya rabotaet v cikle, vyzyvaya komandu sync cherez sootvetstvuyushchie intervaly komandy sleep. Zapustite etot komandnyj fajl v fonovom rezhime, chtoby podderzhivat' ce- lostnost' fajlovoj sistemy.

    MONTIROVANIE FAJLOVYH SISTEM

Davajte rassmotrim, chto proishodit, kogda fajlovaya sistema monti- ruetsya v drevovidnoj strukture sistemy. Na ris. 7 -3 pokazano, kak vzaimodejstvuyut mezhdu soboj indeksnye deskriptory (inodes) dvuh fajlo- vyh sistem. Ris. 7-3 Montirovanie odnoj fajlovoj sistemy v druguyu ------------------------------------------------------------- +------------------------------+ |Razdel| Fizicheskoe| Logicheskoe| |diska | imya | imya | |------------------------------| | 1 | /dev/hd01 |/dev/root | | 2 | /dev/hd02 |/dev/usr | +------------------------------+ +----+ | | Razdel 1 | / |inode 2 (ls -lia /) / / | | \ \ \ / / +----+ \ \ \ / / / | \ \ \ \ / / / | \ \ \ \ / / / | \ \ \ \ +---+ +---+ +---+ +---+ +-----+ +---+ +---+ +---+ |bin| |dev| |etc| |lib| |lost+| |mnt| |tmp| |usr| inode 245 | | | | | | | | |found| | | | | | +---+ +---+ +---+ +---+ +---+ +-----+ +---+ +---+ +-| | / | \ / | \ / |\ / | \ / | | \ | | / | \ +---+ /|\ /|\ /|\ /|\ | /----------------+ / KOMANDA / # /etc/mount /dev/hd02 /usr / +-----+ | | Razdel 2 | / | inode 2 (ls -lia /usr) | | +-----+ \ \ \ / / / | \ \ \ \ \ / / / | \ \ \ \ \ / / / | \ \ \ \ \ / / / | \ \ \ \ \ / / / | \ \ \ \ \ +---+ +---+ +-------+ +---+ +-----+ +-----+ +-----+ +---+ +---+ |adm| |bin| |include| |lib| |lost+| |pre- | |spool| |sys| |tmp| | | | | | | | | |found| |serve| | | | | | | +---+ +---+ +-------+ +---+ +-----+ +-----+ +-----+ +---+ +---+ / | \ / | \ / | | \ / | \ /|\ / || \ / | \ / / | \ / | \ \ / / | \ / | \ \ /|\ /|\ /|\ /|\ / | \ /|\ /|\ /|\ -------------------------------------------------------------------- V primere, pokazannom na ris. 7-3, fajlovaya sistema iz razdela 2 montiruetsya v kornevoj fajlovoj sisteme (razdel 1) v katalog /usr. Od- nako my pomnim, chto kazhdaya fajlovaya sistema imeet svoj sobstvennyj kornevoj katalog. V kazhdoj fajlovoj sisteme numeraciya indeksnyh desk- riptorov fajla nachinaetsya s chisla 2, poetomu nomera indeksnyh deskrip- torov dubliruyutsya v dvuh fajlovyh sistemah. |to i yavlyaetsya prichinoj, po kotoroj ne mogut byt' obrazovany svyazi mezhdu fajlami, nahodyashchimisya v raznyh fajlovyh si brazovany svyazi mezhdu fajlami, nahodyashchimisya Odnim iz atributov kornevogo kataloga yavlyaetsya to, chto nomer ego indeksnogo deskriptora raven 2. |to znachenie mozhet byt' provereno v kornevom kataloge komandoj "ls -lid /". Katalog /usr - eto prosto eshche odin fajl (a imenno katalog) v kornevoj fajlovoj sisteme. |tot katalog mozhet soderzhat' fajly i podchinennye katalogi, kotorye hranyatsya v raz- dele 1. Posle vypolneniya komandy "mount /dev/hd02 /usr" kornevoj kata- log razdela 2 (indeksnyj deskriptor 2) pomeshchaetsya v katalog /usr (in- deksnyj deskriptor 245). Esli kakie-libo fajly sushchestvuyut v kataloge /usr v razdele 1, oni ostayutsya tam, no poluchit' dostup k nim vy ne mo- zhete. Edinstvennym sposobom uvidet' ih yavlyaetsya razmontirovanie fajlo- voj sistemy, kotoraya byla smontirovana na ih mesto. Hitrost' komandy mount zaklyuchaetsya v tom, chto ona predstavlyaet novyj razdel kak by pri- nadlezhashchim real'nomu kornevomu razdelu. V sushchnosti, eto pozvolyaet imet' bezgranichnuyu fajlovuyu sistemu. Mehanizmom, kotoryj pozvolyaet proizvodit' eto, yavlyaetsya tablica smontirovannyh ustrojstv, nahodyashchayasya vnutri yadra sistemy. Kogda vy- polnyaetsya obrashchenie k fajlu, ego indeksnyj deskriptor opredelyaet marsh- rut, po kotoromu nahoditsya dannyj fajl. Esli v tablice smontirovannyh ustrojstv imeetsya zapis', to etot marshrut vedet na drugoj razdel diska ili v druguyu fajlovuyu sistemu. Dlya togo chtoby ubedit'sya, chto vnov' smontirovannaya fajlovaya sistema unikal'na, posmotrite indeksnyj desk- riptor kataloga /usr snachala iz kornevogo kataloga (komandoj "ls -li /", indeksnyj deskriptor 245), a zatem iz drugoj fajlovoj sistemy (ls -ldi /usr, indeksnyj deskriptor 2).

    KAK POLUCHITX POBOLXSHE INFORMACII O FAJLOVOJ SISTEME?

Kak ukazyvalos' ranee, fajlovaya sistema razmeshchaetsya vnutri razde- la na diske. Fajlovye sistemy sozdayutsya komandoj mkfs(1), podderzhiva- yutsya komandoj fsck(1), otlazhivayutsya komandoj fsdb(1), a pervyj dostup k nim osushchestvlyaetsya komandoj mount(1). Katalog /usr/include soderzhit vse vklyuchaemye fajly dlya ispol'zovaniya v programmah na yazyke Si, rea- lizuyushchih eti komandy. Takim obrazom, etot katalog predstavlyaet soboj prekrasnuyu vozmozhnost' dlya poiska informacii o fajlovoj sisteme, poskol'ku vklyuchaemye fajly soderzhat global'nye opredeleniya, ispol'zue- mye podprogrammami fajlovoj sistemy. V dokumentacii Bell Labs (v ruko- vodstve programmista) takzhe opisany nekotorye vnutrennie tablicy, ispol'zuemye fajlovoj sistemoj. Teper' my gotovy rassmotret' programmnye sredstva dlya avtomatiza- cii rutinnoj raboty s fajlovoj sistemoj. ---------------------------------------------------- IMYA: mntf ---------------------------------------------------- mntf Montirovanie i razmontirovanie gibkogo diska

    NAZNACHENIE

Montiruet i razmontiruet ustrojstvo gibkogo diska v kataloge kak fajlovuyu sistemu s vozmozhnost'yu zapisi/chteniya ili tol'ko chteniya.

    FORMAT VYZOVA

mntf [-d] [-h] [-l] [-r] [-s] Opcii: -d razmontirovanie gibkogo diska iz kornevoj fajlovoj sistemy -h ispol'zovanie ustrojstva s vysokoj plotnost'yu zapisi (a ne s nizkoj) -1 ispol'zovanie ustrojstva 1, a ne ustrojstva 0 -r montirovanie gibkogo ustrojstva kak fajlovoj sistemy s vozmozhnost'yu tol'ko chteniya -s ispol'zovanie imen ustrojstv, prinyatyh v System V Po umolchaniyu vypolnyaetsya montirovanie gibkogo diska 0 v katalog /mnt.

    PRIMER VYZOVA

mntf -d -1 Razmontirovanie gibkogo diska na ustrojstve 1.

    TEKST PROGRAMMY

1 : 2 # @(#) mntf v1.0 Mount floppies Author: Russ Sage Montirovanie gibkih diskov 4 CMD="/etc/mount" 5 DIR="/mnt" 6 DRIVE="0" 7 DENSITY="48ds9" 8 SYSTEM="xenix" 10 if [ $# -gt 0 ] 11 then for ARG in $* 12 do 13 case $ARG in 14 -d) CMD="/etc/umount" 15 DIR="";; 16 -h) DENSITY="96ds15";; 17 -1) DRIVE="1" 18 if [ -d /mnt1 ] 19 then DIR="/mnt1" 20 else echo "the directory /mnt1 does not exist" >&2 net kataloga /mnt1 21 echo "using the directory /mnt instead" >&2 ispol'zuetsya katalog /mnt 22 fi;; 23 -r) DIR="$DIR -r";; 24 -s) SYSTEM="sysv";; 25 *) echo "mntf: invalid argument $ARG" >&2 26 echo "usage: mntf [-d] [-h] [-1] [-r] [-s]" >&2 27 echo " -d dismount" >&2 28 echo " -h high density" >&2 29 echo " -1 use drive 1" >&2 30 echo " -r read only" >&2 31 echo " -s System V device" >&2 32 echo " default: mount XENIX drive 0 48 tpi to " >&2 33 echo " /mnt as a read/write filesystem" >&2 34 exit 1;; 35 esac 36 done 37 fi 39 case $SYSTEM in 40 sysv) $CMD /dev/fp${DRIVE}21 $DIR;; 41 xenix) $CMD /dev/fd${DRIVE}${DENSITY} $DIR;; 42 esac

    PEREMENNYE SREDY VYPOLNENIYA

CMD Osnovnaya komanda, podlezhashchaya vypolneniyu DIR Katalog, v kotorom proizvoditsya montirovanie ustrojstva DENSITY Plotnost' zapisi v vide, ukazannom v imeni ustrojstva DRIVE Nomer ustrojstva, nachinaya s 0 SYSTEM Tip imeni ustrojstva, prinyatyj v UNIX'e OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL mntf? V mashinah s gibkim diskom eto ustrojstvo chasto ispol'zuetsya v povsednevnyh operaciyah. Ono primenyaetsya v kachestve istochnika pri installyacii sistemy i kak obychnyj nositel' dlya operacij kopirovaniya. Gibkie diski mozhno ispol'zovat' v sisteme UNIX dvumya sposobami. Pervyj yavlyaetsya nestrukturirovannoj posledovatel'nost'yu bajtov, chto polezno dlya kopirovaniya magnitnyh lent i hraneniya arhivov. Vtoroj sposob - poblochnyj, orientirovan na podderzhku fajlovoj struktury. Dlya vtorogo sposoba sushchestvuet moshchnaya podderzhka na urovne fajlovoj siste- my, no nekotorye funkcii my dolzhny realizovat' samostoyatel'no. Dlya togo chtoby ispol'zovat' gibkij disk kak fajlovuyu sistemu v UNIX, vam neobhodimo podgotovit' disk i smontirovat' ego kak fajlovuyu sistemu. Kogda vy zakonchite rabotu, vy dolzhny razmontirovat' gibkij disk. |to otlichaetsya ot sistemy DOS, v kotoroj gibkie diski mozhno vstavlyat' i vynimat' kogda ugodno, esli tol'ko v etot moment na nih ne idet zapis'. Poskol'ku ispol'zovanie gibkih diskov vklyuchaet v sebya vzaimosvya- zannye shagi montirovaniya i razmontirovaniya, to bylo by vpolne estest- vennym primenyat' odnu komandu s sootvetstvuyushchimi opciyami dlya vypolne- niya montirovaniya i razmontirovaniya. Odnako UNIX tak ne delaet. Nash ko- mandnyj fajl mntf ob容dinyaet eti dve funkcii v odnoj komande dlya upro- shcheniya raboty s gibkim diskom. Dlya togo chtoby sdelat' nashu programmu bolee nezavisimoj, my predusmotreli v nej podderzhku ustrojstv sistemy XENIX naravne s ustrojstvami System V. (Sistemy Berkeley (BSD) ne tak chasto ispol'zuyut gibkie diski, poetomu my ne pytalis' imet' s nimi de- lo.) CHTO DELAET mntf? |ta programma obespechivaet podderzhku vseh vozmozhnostej dlya monti- rovaniya i razmontirovaniya gibkih diskov. Ona predostavlyaet vse opcii, neobhodimye komande mount, akcentiruet vnimanie na teh aspektah fajlo- voj sistemy, kotorye otnosyatsya k gibkim diskam, i umen'shaet kolichestvo nazhatij na klavishi, neobhodimyh dlya vypolneniya etoj raboty. Dejstvie programmy po umolchaniyu zaklyuchaetsya v montirovanii gibko- go diska nizkoj plotnosti zapisi, nahodyashchegosya v ustrojstve 0, v kata- log /mnt. Imeetsya mnogo opcij, chtoby poprosit' programmu mntf sdelat' to, chto vam nuzhno. Opciya -h podderzhivaet disk vysokoj plotnosti (1.2 Mb). V mashinah PC AT pervoe iz ustrojstv gibkih diskov imeet 96 doro- zhek na dyujm, ob容m 1.2 megabajta, no mozhet takzhe chitat' i pisat' gib- kie diski s bolee nizkoj plotnost'yu. Vtoroj gibkij disk yavlyaetsya ust- rojstvom nizkoj plotnosti s 48 dorozhkami na dyujm i ob容mom 360 kilo- bajt. Opciya -1 (cifra odin, a ne bukva l) vypolnyaet montirovanie gibko- go diska v ustrojstve 1, a ne 0. Opciya -r montiruet fajlovuyu sistemu s vozmozhnost'yu TOLXKO CHTENIYA. Dlya RAZMONTIROVANIYA diska vmesto montiro- vaniya ispol'zuetsya opciya -d. Esli primenyaetsya opciya -s, imya ustrojstva izmenyaetsya takim obrazom, chtoby ono sootvetstvovalo sisteme System V, a ne XENIX. |to neznachitel'naya problema, poskol'ku shemy imenovaniya ne ochen' otlichayutsya. Dannaya programma sozdana dlya sistemy XENIX i obespe- chivaet nailuchshie vozmozhnosti imenno v nej. Ne vse opcii sovmestimy drug s drugom, no proverka na sovmesti- most' ne vypolnyaetsya. Naprimer, komanda "mntf -d -r" pytaetsya razmon- tirovat' fajlovuyu sistemu s vozmozhnost'yu tol'ko chteniya, a komanda UNIX unmount, kotoraya vypolnyaet etu operaciyu, otbrasyvaet ee, vydavaya soob- shchenie ob oshibke. V celyah uproshcheniya my otkazalis' ot proverki soot- vetstviya opcij, a vmesto etogo predostavili UNIX'u pravo vydavat' soobshcheniya ob oshibkah dlya informirovaniya pol'zovatelya o voznikshih prob- lemah. Esli vy hotite, chtoby etu programmu mog primenyat' otnositel'no neopytnyj pol'zovatel', vam nuzhno vstavit' v nee vypolnenie takih pro- verok.

    PRIMERY

1. $ mntf -s Montirovanie gibkogo diska kak fajlovoj sistemy s vozmozhnost'yu zapisi-chteniya i s ispol'zovaniem imen ustrojstv, prinyatyh v System V. 2. $ mntf -h -1 -r Montirovanie gibkogo diska vysokoj plotnosti zapisi na ustrojstve 1 kak fajlovoj sistemy s vozmozhnost'yu tol'ko chteniya i s ispol'zovaniem formata imen ustrojstv, prinyatogo v XENIX. |ta komanda dolzhna zakon- chit'sya neudachej (ustrojstvo 1 imeet nizkuyu plotnost'). 3. $ mntf -d -h Razmontirovanie fajlovoj sistemy na ustrojstve 0 s vysokoj plot- nost'yu zapisi i s ispol'zovaniem imen ustrojstv, prinyatyh v XENIX.

    POYASNENIYA

Dlya togo chtoby maksimal'no uprostit' programmu, vse fakticheski vypolnyaemye komandy pomeshcheny v tekstovye stroki. |to pozvolyaet dostich' bol'shej gibkosti pri napisanii programmy. Rezul'tatom analiza komand- noj stroki yavlyaetsya formirovanie komandy, kotoraya vypolnyaetsya v konce programmy mntf. V strokah 4-8 inicializiruyutsya ustanovki po umolchaniyu. Peremennaya CMD soderzhit komandu UNIX, kotoraya v itoge dolzhna byt' vypolnena, po umolchaniyu eto komanda mount. Peremennaya DIR ukazyvaet katalog, v koto- ryj dolzhno byt' smontirovano ustrojstvo, po umolchaniyu eto katalog /mnt. Peremennaya DRIVE yavlyaetsya nomerom ustrojstva (po umolchaniyu 0) i ispol'zuetsya dlya formirovaniya korrektnogo imeni ustrojstva. Peremennaya DENSITY po umolchaniyu ustanovlena dlya nositelya nizkoj plotnosti, t.e. 48 dorozhek na dyujm, dvustoronnyaya disketa s 9 sektorami na dorozhku (48ds9). V stroke 10 proveryaetsya, ukazany li v komandnoj stroke kakie-libo argumenty. Esli kolichestvo argumentov bol'she nulya, posledovatel'no proveryaetsya kazhdyj argument. Esli kakoj-libo iz argumentov soot- vetstvuet obrazcam v strokah 13-35, to on izmenyaet soderzhimoe komand- noj stroki. Stroka 14 upravlyaet opciej -d dlya razmontirovaniya gibkogo diska. Peremennaya CMD izmenyaetsya na umount vmesto mount. Posle etogo peremen- noj DIR prisvaivaetsya nulevoe znachenie, poskol'ku komande umount tre- buetsya ne katalog, a tol'ko imya ustrojstva. Peremennaya DIR dolzhna byt' chast'yu stroki s komandoj dlya togo, chtoby my mogli ispol'zovat' odnu i tu zhe "zagotovlennuyu" komandnuyu stroku dlya vseh variantov. V dannom sluchae my ustanavlivaem etu peremennuyu v nul', a shell pri sintaksi- cheskom razbore udalyaet ee iz komandnoj stroki. V stroke 16 vypolnyaetsya izmenenie plotnosti zapisi ispol'zuemogo nositelya. Obrashchenie k razlichnym tipam nositelej vypolnyaetsya po imenam fajlov ustrojstv. Kazhdoe imya ukazyvaet drajver ustrojstva, kotoryj ra- botaet s sootvetstvuyushchej apparaturoj. Ustrojstvo vysokoj plotnosti mo- zhet rabotat' v rezhimah kak vysokoj, tak i nizkoj plotnosti zapisi. Od- nako esli vy ukazhete imya ustrojstva s vysokoj plotnost'yu zapisi, a na samom dele ono imeet nizkuyu plotnost', to drajver rabotat' ne budet iz-za oshibok chteniya.

    DOPOLNITELXNAYA INFORMACIYA OB IMENAH USTROJSTV

Nizhe privoditsya spisok, poluchennyj komandoj ls v kataloge dev dlya mashiny XT, v kotoroj net ustrojstv vysokoj plotnosti zapisi. |tot spisok pozvolyaet proillyustrirovat', kakim obrazom osushchestvlyaetsya obra- shchenie k imenam ustrojstv: ------------------------------ | | 32 brw-rw-rw- 3 bin bin 2, 4 Jun 25 09:25 /dev/fd0 | 32 brw-rw-rw- 3 bin bin 2, 4 Jun 25 09:25 /dev/fd048 | 126 brw-rw-rw- 1 root root 2, 12 Feb 18 17:09 /dev/fd048ds8 | 32 brw-rw-rw- 3 bin bin 2, 4 Jun 25 09:25 /dev/fd048ds9 | 125 brw-rw-rw- 1 root root 2, 8 Feb 18 17:09 /dev/fd048ss8 | 127 brw-rw-rw- 1 root root 2, 0 Feb 18 17:09 /dev/fd048ss9 | 131 brw-rw-rw- 3 root root 2, 5 Feb 18 17:09 /dev/fd1 | 131 brw-rw-rw- 3 root root 2, 5 Feb 18 17:09 /dev/fd148 | 129 brw-rw-rw- 1 root root 2, 13 Feb 18 17:09 /dev/fd148ds8 | 131 brw-rw-rw- 3 root root 2, 5 Feb 18 17:09 /dev/fd148ds9 | 128 brw-rw-rw- 1 root root 2, 9 Feb 18 17:09 /dev/fd148ss8 | 130 brw-rw-rw- 1 root root 2, 1 Feb 18 17:09 /dev/fd148ss9 | Krajnee sleva chislo predstavlyaet soboj nomer indeksnogo deskrip- tora. My ispol'zuem ego kak ssylku dlya opredeleniya unikal'nogo imeni fajla. Kak my uzhe otmechali ranee, neskol'ko imen ustrojstv mogut ot- nosit'sya k odnomu i tomu zhe fajlu, rassmatrivaemomu s razlichnyh tochek zreniya. Naprimer, v dannom spiske vy vidite, chto tri ustrojstva imeyut indeksnyj deskriptor 32. Vtoroe chislo sleva predstavlyaet soboj koli- chestvo svyazej. Kogda ono bol'she edinicy, to eto takzhe ukazyvaet, chto neskol'ko ustrojstv yavlyayutsya na samom dele odnim fajlom, a sledova- tel'no ispol'zuyut odin i tot zhe indeksnyj deskriptor. Sleduyushchie dva chisla yavlyayutsya starshim i mladshim nomerom. Starshij nomer otnositsya k drajveru ustrojstva, a mladshij yavlyaetsya unikal'nym nomerom odnogo iz ustrojstv, upravlyaemyh odnim i tem zhe drajverom. Bol'shinstvo iz etih imen ustrojstv sootvetstvuyut opredelennomu shablonu. Oni sostoyat iz simvolov fd (floppy disk - gibkij disk), cifry 0 ili 1 (nomer ustrojstva), chisla 48 (plotnost', vyrazhennaya v vide ko- lichestva dorozhek na dyujm), simvolov ss ili ds (single-sided - odnosto- ronnyaya ili double-sided - dvustoronnyaya disketa) i cifry 8 ili 9 (chislo sektorov). My vidim po indeksnym deskriptoram, chto ustrojstvo fd0 svyazano s ustrojstvami fd048 i fd048ds9. Samym informativnym imenem (i samym trudnym pri vvode s klaviatury) yavlyaetsya imya fd048ds9. Ono tochno vyra- zhaet, k kakomu ustrojstvu i tipu nositelya my obrashchaemsya. Dlya togo chto- by uprostit' ukazanie etogo imeni, ustrojstvo fd048ds9 svyazyvaetsya s bolee korotkimi imenami. Vse tri imeni fajla yavlyayutsya korrektnymi. Sleduyushchij spisok poluchen na mashine AT, v kotoroj imeetsya ust- rojstvo vysokoj plotnosti: ---------------------------------- | | 102 brw-rw-rw- 3 bin bin 2, 7 Jun 17 14:28 /dev/fd0 | 95 br--r--r-- 2 bin bin 2, 3 Jun 6 09:23 /dev/fd048 | 93 br--r--r-- 1 bin bin 2, 2 Jun 6 09:23 /dev/fd048ds8 | 95 br--r--r-- 2 bin bin 2, 3 Jun 6 09:23 /dev/fd048ds9 | 92 br--r--r-- 1 bin bin 2, 0 Jun 6 09:23 /dev/fd048ss8 | 94 br--r--r-- 1 bin bin 2, 1 Jun 6 09:23 /dev/fd048ss9 | 102 brw-rw-rw- 3 bin bin 2, 7 Jun 17 14:28 /dev/fd096 | 102 brw-rw-rw- 3 bin bin 2, 7 Jun 17 14:28 /dev/fd096ds15 | 99 brw-rw-rw- 3 bin bin 2, 11 Jun 26 19:34 /dev/fd1 | 99 brw-rw-rw- 3 bin bin 2, 11 Jun 26 19:34 /dev/fd148 | 97 br--r--r-- 1 bin bin 2, 10 Jun 6 09:23 /dev/fd148ds8 | 99 brw-rw-rw- 3 bin bin 2, 11 Jun 26 19:34 /dev/fd148ds9 | 96 br--r--r-- 1 bin bin 2, 8 Jun 6 09:23 /dev/fd148ss8 | 98 br--r--r-- 1 bin bin 2, 9 Jun 6 09:23 /dev/fd148ss9 | 103 brw-rw-rw- 2 bin bin 2, 15 Jun 6 09:23 /dev/fd196 | 103 brw-rw-rw- 2 bin bin 2, 15 Jun 6 09:23 /dev/fd196ds15 | Esli my posmotrim na zapisi s indeksnym deskriptorom 102, nachinaya s serediny spiska, to uvidim progressiruyushchee uproshchenie imen po mere prodvizheniya k pervoj zapisi - ustrojstvu 0, kotoroe imeet vysokuyu plotnost' zapisi po umolchaniyu. Dlya togo chtoby obratit'sya k nemu kak k ustrojstvu s nizkoj plotnost'yu zapisi, neobhodimo ispol'zovat' imya fd048, a ne fd0. Poskol'ku bol'shinstvo ispol'zuemyh gibkih diskov ime- yut nizkuyu plotnost' zapisi, to imya fd048ds9 yavlyaetsya umolchaniem v programme mntf. Stroka 17 sootvetstvuet opcii -1 dlya ukazaniya ustrojstva 1 vmesto ustrojstva 0. Stroki 18-22 proveryayut, sishchestvuet li katalog dlya monti- rovaniya vtorogo ustrojstva. Esli vy ispol'zuete dva gibkih diska od- novremenno, to vy ne mozhete montirovat' ih oba v odin i tot zhe kata- log. Dlya razresheniya etoj problemy programma mntf ispol'zuet dlya monti- rovaniya ustrojstva 1 katalog /mnt1, a ne /mnt. Esli katalog /mnt1 ne sushchestvuet, po umolchaniyu ispol'zuetsya katalog /mnt, i vse horosho, esli vy ispol'zuete tol'ko ustrojstvo 1. Odnako sleduet izbegat' montirova- niya odnogo gibkogo diska na mesto vtorogo. Vy mozhete poluchit' nepred- vidennye rezul'taty. Esli vy sobiraetes' montirovat' dva gibkih diska, ubedites', chto u vas est' i katalog /mnt, i /mnt1. Stroka 23 delaet montiruemuyu fajlovuyu sistemu dostupnoj tol'ko dlya chteniya v sluchae, esli byla ukazana opciya -r, chto vypolnyaetsya do- bavleniem simvolov -r k imeni kataloga. |to ne yavlyaetsya chast'yu imeni kataloga, no kogda shell vypolnyaet obrabotku komandy, probela mezhdu imenem kataloga i -r dostatochno, chtoby raspoznat' -r kak opciyu. Stroka 24 sootvetstvuet opcii -s i prisvaivaet peremennoj SYSTEM znachenie sysv. |to oznachaet, chto nuzhno ispol'zovat' drugie soglasheniya ob imenah ustrojstv. Stroki 25-34 vypolnyayut proverku na oshibki v komandnoj stroke. Lyu- baya opciya, otlichnaya ot uzhe proverennyh, yavlyaetsya oshibkoj, poetomu vse, chto sootvetstvuet ulavlivayushchej vetke operatora case (*), schitaetsya ne- dopustimoj opciej. V etom sluchae vyvoditsya sintaksicheskaya podskazka, i programma zavershaetsya. V strokah 39-42 vypolnyaetsya vsya osnovnaya rabota. Operator case dejstvuet v sootvetstvii so znacheniem peremennoj SYSTEM. Esli ono rav- no "sysv", vypolnyaetsya stroka 40. V protivnom sluchae vypolnyaetsya stro- ka 41 dlya sistemy XENIX. Obratite vnimanie, chto v nashej versii komand- nogo fajla mntf v stroke sysv imeetsya tol'ko peremennaya s nomerom ust- rojstva. Esli vy ispol'zuete System V, vy mozhete dobavit' peremennuyu dlya ukazaniya plotnosti zapisi ili drugie parametry, kotorye vam nuzhny. Stroka 41 vypolnyaet versiyu komandy, rasschitannuyu na sistemu XENIX. Peremennaya CMD soderzhit, kak my otmechali, komandu montirovaniya (mount) ili razmontirovaniya (umount). Posledovatel'nost' simvolov /dev/fd ukazyvaet fajl ustrojstva dlya gibkogo diska. Peremennaya DRIVE ravna 0 ili 1. Peremennaya DENSITY ukazyvaet ustrojstvo s vysokoj ili nizkoj plotnost'yu zapisi. Esli dolzhna byt' vypolnena komanda montiro- vaniya, peremennaya DIR soderzhit katalog. Esli vypolnyaetsya razmontirova- nie, znachenie peremennoj DIR ravno nulyu.

    ZAMECHANIE PO VOPROSU BEZOPASNOSTI

Obychno tol'ko superpol'zovatel' (root) mozhet montirovat' fajlovuyu sistemu. V bol'shih sistemah eto imeet smysl. Odnako na nebol'shih nastol'nyh mashinah eto mozhet byt' slishkom ogranichivayushchim faktorom. Dlya togo chtoby obojti eto trebovanie, ispol'zujte vozmozhnost' izmeneniya prav dostupa. CHtoby pozvolit' lyubomu pol'zovatelyu vypolnyat' komandy montirovaniya i razmontirovaniya, primenite sleduyushchie komandy: # chown root /etc/mount <- delaet pol'zovatelya root vladel'cem modulya /etc/mount # chmod 4511 /etc/mount i daet vozmozhnost' vypolnyat' komandu mount vsem pol'zovatelyam # chown root /etc/umount <- delaet to zhe samoe dlya komandy # chmod 4511 /etc/umount razmontirovaniya |ti komandy oblegchayut vsem pol'zovatelyam rabotu s gibkim diskom, no odnovremenno otkryvayut ogromnuyu dyru v zashchite sistemy. Esli kto-li- bo uzhe prolozhil tropinku prav dostupa na gibkij disk (sm. glavu 9), to montirovanie fajlovoj sistemy prodolzhit etu tropinku v glavnuyu sistemu i pozvolit takomu pol'zovatelyu stat' superpol'zovatelem vsej sistemy v celom prosto s gibkogo diska! -------------------------------------------------------------- IMYA: mntlook -------------------------------------------------------------- mntlook Poisk fajlovyh sistem na ustrojstvah

    NAZNACHENIE

Prosmotr vseh fajlov diskovyh ustrojstv i obnaruzhenie vseh fajlo- vyh sistem, vklyuchaya nemontirovannye.

    FORMAT VYZOVA

mntlook

    PRIMER VYZOVA

mntlook /dev/hd* Poisk fajlovyh sistem na vseh zhestkih diskah

    TEKST PROGRAMMY

1 static char id[] = "@(#) mntlook v1.0 Look for mounts Author: Russ Sage"; Poisk fajlovyh sistem 3 #include 4 #include 5 #include 6 #include 7 #include 9 #define BSIZ 512 11 main(argc,argv) 12 int argc; 13 char *argv[]; 14 { 15 struct filsys sb; 16 int d, dev; 17 char buf[BSIZ]; 19 for (d = 1; d < argc; d++) 20 { 21 if (argv[d][0] == '-') 22 { 23 printf("mntlook: invalid argument %s\n", argv[d]); 24 printf("usage: mntlook device [device ...]\n"); 25 continue; 26 } 27 if ((dev = open(argv[d],O_RDONLY)) < 0) 28 { 29 sprintf(buf, "cannot open %s",argv[d]); nevozmozhno otkryt' 30 perror(buf); 31 continue; 32 } 34 /* throw away first block */ obojti pervyj blok 35 if (read(dev, &sb, sizeof(sb)) == -1) 36 { 37 perror("cannot read block 0"); ne chitaetsya blok 0 38 continue; 39 } 41 /* block 1 is the superblock */ blok 1 yavlyaetsya superblokom 42 if (read(dev, &sb, sizeof(sb)) == -1) 43 { 44 perror("cannot read block 1"); ne chitaetsya blok 1 45 continue; 46 } 48 if (sb.s_magic == S_S3MAGIC) 49 { 50 printf("\nDEV: %s --> VALID file system\n",argv[d]); 51 printf("filsys: %s\n",sb.s_fname); 52 printf("pack : %s\n",sb.s_fpack); 53 printf("type : %s byte block\n", 54 (sb.s_type == S_B512) ? "512" : "1024"); 55 printf("magic : %lx\n",sb.s_magic); 56 } 58 close(dev); 59 } 60 } OPISANIE ZACHEM NAM NUZHNA PROGRAMMA mntlook? Fajlovye sistemy yavlyayutsya serdcevinoj sistemy UNIX. Sama sistema ne sushchestvuet vne fajlovoj sistemy, a rasshirennye vozmozhnosti sistemy obespechivayutsya fajlovoj sistemoj. Dazhe nesmotrya na to, chto fajlovye sistemy nastol'ko vazhny, UNIX ne imeet nikakih sredstv dlya obnaruzheniya fajlovyh sistem kak takovyh. Ne imeetsya dazhe sredstv, kotorye mogli by soobshchit' nam, kakaya informa- ciya nahoditsya v superblokah. Nam neobhodimo universal'noe sredstvo dlya raboty s fajlovymi sistemami. Ono dolzhno obnaruzhivat' i identificirovat' superbloki, na- hodyashchiesya na ustrojstvah. Zametim, chto operaciya otkrytiya ustrojstva obychno trebuet nalichiya privilegij superpol'zovatelya. CHTO DELAET mntlook? Programma mntlook prednaznachena dlya prosmotra soderzhimogo fajlov ustrojstv i poiska superbloka. (My vkratce rassmatrivali superbloki ranee). Kogda superblok obnaruzhen, iz nego izvlekaetsya i vyvoditsya na ekran imya fajlovoj sistemy, imya diskovogo paketa, ispol'zuemyj razmer bloka i identifikacionnyj "magicheskij nomer". Pervonachal'noj cel'yu dannoj utility bylo obnaruzhenie na vneshnem nositele mashiny takih fajlovyh sistem, kotorye v nastoyashchij moment ne smontirovany. No kogda dannaya programma otkryvaet i chitaet ustrojstvo, ej vse ravno, bylo li ustrojstvo smontirovano ili net, poskol'ku dostup k nemu vypolnyaetsya na bolee nizkom urovne, chem uroven' fajlovoj sistemy. V rezul'tate obnaruzhivayutsya vse fajlovye sistemy, nezavisimo ot togo, byli oni smontirovany ili net. Davajte rassmotrim, kakim obrazom fajlovye sistemy svyazany s fi- zicheskim nositelem. K kazhdoj mashine podsoedineno fiksirovannoe chislo periferijnyh ustrojstv. Dlya raboty so smennymi nositelyami v UNIX rea- lizovana koncepciya montirovannogo i nemontirovannogo fajlovogo prost- ranstva. No pervym shagom yavlyaetsya ustanovka paketa diskov (ili gibkogo diska) v diskovoe ustrojstvo. Posle etogo mozhno vypolnyat' operacii chteniya i zapisi na fizicheskih nositelyah, ukazyvaya opredelennye imena ustrojstv. Montirovanie predstavlyaet soboj logicheskoe dejstvie, kotoroe chi- taet superblok s paketa diskov i zapisyvaet ego v pamyat', gde yadro sistemy podderzhivaet svoyu versiyu superbloka. Periodicheski vypolnyaetsya zapis' versii, nahodyashchejsya v pamyati, obratno na disk, chtoby eti dve versii byli po vozmozhnosti odinakovymi. V System V eto delaet program- ma update, kotoraya rabotaet v fonovom rezhime s momenta zagruzki siste- my. Dlya obrashcheniya neposredstvenno k fizicheskomu nositelyu ispol'zuyutsya takie komandy, kak, naprimer, komanda "od -c /dev /rfd0", kotoraya dam- piruet nestrukturirovannyj gibkij disk. Odnoj iz komand, kotorye ne- posredstvenno pomeshchayut dannye na ustrojstvo, yavlyaetsya komanda "cp file /dev/rfd0". Oblast' dannyh nachinaetsya s samogo pervogo bajta na gibkom diske. Takie dannye nesovmestimy s komandami tar, cpio ili fajlovoj sistemoj. Dlya obrashcheniya k fajlovoj sisteme ispol'zuetsya komanda "mount /dev/fd0 /mnt". Nachinaya s etogo momenta, vse obrashcheniya k dannomu ust- rojstvu vypolnyayutsya cherez katalog /mnt. Vazhno to, chto neposredstvennyj dostup k fajlu ustrojstva yavlyaetsya operaciej bolee nizkogo urovnya, chem operacii fajlovoj sistemy, chto pozvolyaet prochitat' informaciyu o su- perbloke neposredstvenno s ustrojstva. Vhodnoj informaciej dlya programmy mntlook yavlyayutsya imena fajlov ustrojstv. V komandnoj stroke nel'zya ukazyvat' nikakie opcii. Imena ustrojstv mogut byt' kak blochnymi, tak i simvol'nymi. Dlya operacii chteniya eto ne imeet nikakogo znacheniya, esli tol'ko u vas imeyutsya prava chteniya. Zatem programma chitaet vtoroj blok i proveryaet "magicheskoe chislo", opredelyayushchee superblok. Superblok - eto prosto struktura yazyka Si, kotoraya predopredelena sistemoj i hranitsya v fajle filsys.h, chto ukazano v nashej programme operatorom #include. Magicheskoe chislo predstavlyaet soboj dlinnoe celoe, imeyushchee zaranee opredelennoe znache- nie. Esli element struktury, kotoraya prochitana s diska, soderzhit eto chislo, to schitaetsya, chto ostal'naya chast' struktury yavlyaetsya korrektny- mi dannymi. Dlya kazhdoj fajlovoj sistemy imeetsya tol'ko odna struktura superbloka. Esli magicheskoe chislo takoe, kak nado, vyvoditsya ostal'naya infor- maciya o fajlovoj sisteme. Esli eto chislo nekorrektno, na ekran nichego ne vyvoditsya i programma obrabatyvaet v cikle sleduyushchij fajl ust- rojstva, ukazannyj v komandnoj stroke. Dannaya programma mozhet sluzhit' v kachestve funkcii, obespechivayushchej bezopasnost', poskol'ku ona umeet identificirovat' fajlovye sistemy, kotorye kto-libo ostavil na mashine nesmontirovannymi. Kak otmechaetsya v glave 9, narushiteli zashchity mogut chitat' dannye s nemontirovannyh ust- rojstv, poetomu esli ostavit' ustrojstvo ili fajlovuyu sistemu nemonti- rovannymi, to na samom dele eto ne predohranyaet ih ot nesankcioniro- vannogo dostupa.

    PRIMERY

1. $ mntlook /dev/hd13 Poisk superbloka na ustrojstve s imenem hd13. |to imya ukazyvaet ustrojstvo 1, tretij razdel. Dlya prosmotra razdelov v srede XENIX nuzh- no zapustit' programmu fdisk. Dlya System V nuzhno vospol'zovat'sya ko- mandoj iv. 2. $ mntlook /dev/fd0* Poisk fajlovyh sistem na gibkih diskah s lyuboj plotnost'yu zapisi, nahodyashchihsya v ustrojstve 0. |to snova primer dlya sistemy XENIX. 3. $ for DEV in /dev/*[fh]d* > do > echo "checking device: $DEV" > mntlook $DEV > done Dannyj cikl vypolnyaetsya po vsem imenam ustrojstv dlya gibih i zhestkih diskov po ocheredi. Kazhdoe imya vyvoditsya na ekran. Zatem prove- ryaetsya, soderzhit li dannoe ustrojstvo fajlovuyu sistemu.

    POYASNENIYA

Stroki 3-7 opredelyayut vklyuchaemye fajly, kotorye ispol'zuet dannaya programma. Vam neobhodimo izuchit' eti fajly, poskol'ku oni ne tol'ko pomogut vam ponyat' rabotu etoj programmy, no i pokazhut vam nekotorye vazhnye znacheniya, imeyushchie otnoshenie k fajlovym sistemam. Stroka 9 opredelyaet razmer ispol'zuemogo bufera. |tot bufer pri- menyaetsya tol'ko dlya hraneniya soobshchenij ob oshibkah, poetomu on ne dol- zhen byt' ochen' bol'shim. Stroka 15 opredelyaet strukturu superbloka. On imeet tip filesys (sm. vklyuchaemyj fajl sys/types.h). Na moej mashine superblok imeet raz- mer 1024 bajta. Esli vy ne znaete tochno razmer bufera u vas, to vy mo- zhete proverit' ego, vstaviv v programmu sleduyushchij operator: printf ("the size is %d",sizeof(sb)) Stroka 16 opisyvaet rabochuyu peremennuyu d i deskriptor fajla dev. Stroka 17 ob座avlyaet bufer razmerom BSIZE. Stroki 19-59 - eto odin bol'shoj cikl for. |tot cikl predstavlyaet soboj vsyu ostal'nuyu chast' programmy. On vypolnyaetsya stol'ko raz, skol'ko argumentov ukazano v komandnoj stroke. Schetchik cikla nachina- etsya s 1, poskol'ku pervym argumentom argv[0] yavlyaetsya imya komandy. V kachestve argumentov dolzhny byt' ukazany imena fajlov, poetomu dannyj cikl ispol'zuet kazhdoe imya po ocheredi. V strokah 21-26 proveryaetsya, ne nachinaetsya li tekushchij rassmatri- vaemyj nami argument so znaka '-'. Esli da, to eto opciya, chto predstavlyaet soboj oshibku, poetomu vyvoditsya soobshchenie ob oshibke i operator continue vyzyvaet vypolnenie sleduyushchej iteracii cikla. Takim obrazom, dannaya programma otvergaet opcii, no rabotaet pri obnaruzhenii imen fajlov. Schitaya, chto imya fajla bylo najdeno, stroki 27-32 otkryvayut fajl ustrojstva s etim imenem tol'ko dlya chteniya. Esli dannyj vyzov open ne- udachen, my posylaem soobshchenie v bufer vmeste s imenem, ukazannym v ko- mandnoj stroke. |tot bufer peredaetsya programme obrabotki oshibok (sistemnoj), kotoraya ispol'zuet nashe soobshchenie kak pervuyu chast' svoego soobshcheniya ob oshibke. Ona vyvodit sistemnoe soobshchenie, kotoroe oprede- lyaet dannuyu oshibku. Po operatoru continue nachinaetsya vypolnenie sledu- yushchej iteracii cikla for. Stroki 35-39 chitayut pervyj blok fajla. Dlya kornevoj fajlovoj sistemy pervym blokom yavlyaetsya zagruzochnaya zapis'. Esli pri etom chte- nii voznikaet oshibka, vyvoditsya soobshchenie ob oshibke i vypolnenie cikla prodolzhaetsya. Stroki 42-46 chitayut vtoroj blok, kotoryj dolzhen nahodit'sya v tom meste, gde razmeshchaetsya superblok, esli on imeetsya. Po informacii, pro- chitannoj i pomeshchennoj v strukturu, my mozhem poluchit' dostup k kazhdomu elementu po ego imeni. Stroka 48 proveryaet, ravno li magicheskoe chislo v strukture magi- cheskomu chislu, opredelennomu v fajle zagolovka. Esli oni sovpadayut, programma mntlook vyvodit imya fajla ustrojstva i soobshchenie o tom, chto fajlovaya sistema korrektna, imya fajlovoj sistemy (esli ono imeetsya), imya paketa diskov, razmer ispol'zuemogo bloka i magicheskoe chislo v shestnadcatirichnom vide. V strokah 53-54 my imeem podobie kodirovannoj struktury: operator printf ispol'zuet strukturu tipa if-then-else dlya ukazaniya stroki, ko- toruyu nuzhno vyvodit'. Posle togo kak vyvedena pervaya stroka, vypolnya- etsya proverka i esli ona proshla uspeshno, to vyvoditsya znachenie 512. Esli v rezul'tate proverki polucheno znachenie "lozh'", vyvoditsya znache- nie 1024. |tot metod opisan v knige B.W.Kernighan, D.M.Ritchie "The C Programming Language" (Prentice-Hall, 1978). Stroka 58 zakryvaet ustrojstvo, i cikl vozvrashchaetsya v nachalo dlya prinyatiya sleduyushchego imeni ustrojstva.

    RAZMERNYE PARAMETRY

Teper', kogda my rassmotreli vzaimootnosheniya mezhdu ustrojstvami i fajlovymi sistemami i nekotorye parametry, svyazannye s formatami diskov, davajte obratimsya k gajkam i boltikam etih ustrojstv. Hotya osnovnaya chast' etoj informacii mozhet pokazat'sya ekzotichnoj, ona mozhet okazat'sya vazhnoj pri opredelennyh obstoyatel'stvah. Naprimer, dlya usta- novki sistemy UNIX na novuyu mashinu vam nuzhno razbit' disk na segmenty i ponimat', kakim obrazom UNIX fakticheski raspolagaetsya na diske. Esli vy sozdaete programmy, kotorye vypolnyayut kakuyu-libo operaciyu nizkogo urovnya s diskom, vam, ochevidno, neobhodimo ponimat', chto vy delaete. Administratoram, poskol'ku oni dolzhny dobavlyat' novye ustrojstva v sistemu, neobhodimo umet' opredelyat' kolichestvo fajlovyh sistem (t.e. skol'ko mozhno sozdat' razdelov na diske), ih razmery i znat', kakim obrazom ustanovit' fajlovye sistemy v eti razdely. Administratory dolzhny takzhe umet' pisat' ili modificirovat' drajvery ustrojstv. Nako- nec, pri rabote s diskami voznikayut problemy, takie kak plohie bloki, kotorye neobhodimo izolirovat' i s kotorymi prihoditsya imet' delo.

    RAZMERY BLOKOV

System V yavlyaetsya poslednim dostizheniem vetvi firmy AT&T v fa- mil'nom dereve UNIX. |to oznachaet, chto System V soderzhit poslednie pravki, vnesennye v ishodnuyu sistemu UNIX. |ti pravki prednaznacheny dlya togo, chtoby sdelat' UNIX zhiznesposobnym i stojkim kommercheskim produktom. Dlya povysheniya ustojchivosti byli vneseny izmeneniya, kasayushchi- esya raboty s fajlami i razmerov ih blokov. Obychno obmen dannymi s diskami osushchestvlyaetsya blokami po 512 baj- tov. Diskovaya apparatura imeet delo imenno s takim razmerom. Dlya ucheta etogo fakta UNIX pervonachal'no ispol'zoval 512-bajtnye bloki vnutri fajlovoj sistemy, chto, vozmozhno, oblegchalo napisanie programm i sozda- valo vpechatlenie, chto tak i nuzhno. Odnako nel'zya otricat', chto pri etom UNIX mozhet rabotat' medlenno! Dlya uskoreniya raboty vnutrennie programmy v nastoyashchee vremya ispol'zuyut bloki razmerom 1024 bajta. Sam disk dolzhen vypolnit' dva obrashcheniya k 512-bajtnym blokam, no v sisteme dve eti operacii chteniya rassmatrivayutsya kak odna operaciya chteniya bloka razmerom 1024 bajta. Edinstvennaya problema zaklyuchaetsya v tom, chto odni utility vydayut re- zul'taty v 512-bajtnyh blokah, a drugie - v 1024-bajtnyh, v zavisi- mosti ot togo, kogda oni byli napisany. Kogda sil'no priblizhayutsya pre- dely svobodnogo prostranstva na diske, vam dejstvitel'no nuzhno znat', s kakim razmerom vy imeete delo. Dlya luchshego ponimaniya problemy razmerov blokov, v tabl. 7-3 poka- zano, kakie utility kakoj razmer bloka ispol'zuyut. |ta informaciya po- luchena v osnovnom iz System V na mashine VAX, iz drugogo varianta System V i iz XENIX. |ti znacheniya mogut otlichat'sya na raznyh mashinah, no ideya sohranyaetsya. Vy vidite, chto bol'shinstvo utilit vydayut rezul'tat v blokah raz- merom 512 bajtov, no utility, otnosyashchiesya k fajlovoj sisteme, vydayut rezul'tat v 1024-bajtnyh blokah. Poskol'ku UNIX obrashchaetsya k diskovomu prostranstvu poblochno, vazhno umet' tochno vychislyat', skol'ko svobodnogo prostranstva v fajlovoj sisteme. Ves'ma ploha situaciya, kogda imeetsya kakoj-to bol'shoj fajl v redaktore vi (kotoryj ispol'zuet fajl /tmp dlya promezhutochnogo redaktirovaniya), a na diske nedostatochno mesta dlya za- pisi vremennogo fajla redaktora vi v real'nyj fajl na diske. Na samom dele eto mozhet sluchit'sya na personal'nyh mashinah s ogranichennym (ska- zhem, 20 Mbajt) ob容mom zhestkogo diska. Tablica 7-3 Razmery blokov dlya razlichnyh komand sistemy UNIX ------------------------------------------------------------- 512 bajtov/blok 1024 bajta/blok ------------------------------------------------------------- ls -s fdisk (razmery razdelov) sum mkfs cpio fsck df du -------------------------------------------------------------

    RASCHETY, SVYAZANNYE S BLOKAMI

Eshche odnim vazhnym voprosom, imeyushchim otnoshenie k fizicheskim ust- rojstvam i logicheskim fajlovym sistemam, yavlyaetsya opredelenie mestona- hozhdeniya opredelennogo bloka na zhestkom diske. Nomer etogo bloka vy- chislyaetsya po nomeram cilindra, dorozhki i sektora. Znanie nomerov blokov stanovitsya vazhnym, kogda na diske poyavlya- etsya defektnoe mesto. |to defektnoe mesto otmechaetsya nomerami cilindra i golovki. Vam neobhodimo vychislit', kakie bloki popadayut v defektnuyu oblast' i zanesti ih nomera v tablicu defektnyh blokov. Obratnaya zadacha takzhe vazhna. Esli programma fsck nachinaet soob- shchat', chto gde-to poyavilsya defektnyj blok, to kakim obrazom my mozhem uznat' nomera cilindra, golovki, sektora i t.d. dlya dannogo defektnogo bloka? Takoe obratnoe vychislenie sdelat' ochen' tyazhelo, esli ne nevoz- mozhno. Vo-pervyh, nomer bloka predstavlyaet soboj proizvedenie chetyreh chisel. Trudno uznat', kakie imenno eti chisla. Krome togo, fajlovye sistemy mogut ispol'zovat' informaciyu vida baza/smeshchenie, poetomu blok nomer 1 v fajlovoj sisteme v dejstvitel'nosti yavlyaetsya blokom nomer 1382 na diske. Opredelit', kakogo vida informaciya byla ispol'zovana v dannom sluchae, tozhe tyazhelo. Konkretnye dannye v sleduyushchem primere otnosyatsya k vpolne oprede- lennoj mashine, no na drugih mashinah ispol'zuyutsya podobnye zavisimosti. |ti dannye otnosyatsya k mashine s zhestkim diskom ob容mom 20 Mbajt s sistemami XENIX/DOS. Harakteristiki ustrojstva: 1 disk = 615 cilindrov, ili 615 cilindrov/disk 1 cilindr = 4 golovki (dorozhki), ili 4 golovki/cilindr Promyshlennyj standart: 1 dorozhka = 17 sektorov, ili 17 sektorov/dorozhku 1 sektor = 512 bajt, ili 512 bajt/sektor 1 Kbajt = 1024 bajta = 2^10 1 Mbajt = 1024 kilobajta = 2^20 = 1 048 576 bajt Harakteristiki ustrojstva razlichny dlya raznyh ustrojstv, no pro- myshlennyj standart dlya chisla sektorov na dorozhku i bajtov na sektor ostaetsya odinakovym. V tabl. 7-4 pokazany primery harakteristik raz- lichnyh ustrojstv. Tablica 7-4 Razmery zhestkih diskov i ih konfiguraciya -------------------------------------------------------------- CHislo cilindrov CHislo golovok Megabajty -------------------------------------------------------------- 981 3 25 697 5 30 981 5 42 925 7 55 1024 8 71 --------------------------------------------------------------- Vy vidite, chto chislo cilindrov i chislo dorozhek razlichny dlya ust- rojstv s raznym ob容mom. Opredelit' maksimal'nyj ob容m diskovoj pamyati mozhno peremnozheniem vseh chisel. V sleduyushchem primere vychislyaetsya obshchij razmer v bajtah dlya predydushchih dannyh. 615 cil 4 dor 17 sek 512 bajt ------- * ----- * ------ * -------- = 21 411 840 bajt/disk 1 disk 1 cil 1 dor 1 sek 21411840 bajt 1 megabajt ------------- * ------------ = 20.4 megabajta/disk 1 disk 1048576 bajt Otmetim, chto esli vy verno ukazyvaete edinicy izmereniya, to oni poparno sokrashchayutsya, za isklyucheniem odnoj snizu i odnoj sverhu, i v rezul'tate poluchayutsya nuzhnye edinicy izmereniya v otvete. Takim obra- zom, v pervoj stroke vychislenij cilindry, dorozhki i sektory sokrashcha- yutsya, i v kachestve edinic izmereniya ostayutsya bajty/disk. Poskol'ku my imeem delo s takim bol'shim kolichestvom razlichnyh edinic izmereniya, vy- chisleniya takogo roda (inogda nazyvaemye "razmernyj analiz") ubezhdayut nas, chto my ponimaem, o chem idet rech'. Ob容m dostupnoj diskovoj pamyati umen'shaetsya posle formatirovaniya, lokalizacii defektnyh blokov i razmeshcheniya na diske fajlovoj sistemy. Odnako nash primer pokazyvaet, chto vse razmery soglasuyutsya mezhdu soboj. Vazhnym momentom, na kotoryj neobhodimo obratit' vnimanie, yavlya- etsya ispol'zovanie raznyh terminov. Inogda primenyaetsya chislo golovok na cilindr, a inogda chislo dorozhek na cilindr. Pri ispol'zovanii kazh- dogo iz etih terminov sootvetstvuyushchim obrazom izmenyayutsya i drugie ter- miny. Sushchestvuet takaya vzaimosvyaz': cilindr, dorozhka, sektor = fizicheskij sektor cilindr, golovka, bajt = blok |ti dve zapisi vyrazhayut v tochnosti odno i to zhe. Kogda vy ispol'- zuete zapis' vida cilindr/dorozhka/sektor, to v rezul'tate poluchaete fizicheskij sektor. Ispol'zuya zapis' vida cilindr/golovka/bajt, vy po- luchaete v rezul'tate nomer bloka. Sleduet pomnit', chto GOLOVKA - eto to zhe samoe, chto i DOROZHKA. Esli vy eto zapomnite, vse ostal'noe vsta- net na svoe mesto. Nizhe privodyatsya nekotorye obshchie vychisleniya, kotorye chasto vsply- vayut, kogda vy rabotaete s diskom na nizkom urovne. |ti primery v bol'shej stepeni otnosyatsya k samomu ustrojstvu, chem k sisteme UNIX. Od- nako posle togo, kak vy pojmete etu informaciyu o diske, vam budet leg- che ponyat', kak rabotaet UNIX na etom urovne. 1. Skol'ko dorozhek imeet disk? 615 cil 4 dor Reshenie: ------- * ----- = 2460 dor/disk 1 disk 1 cil 2. Skol'ko bajt v dorozhke? 17 sek 512 bajt Reshenie: ------ * -------- = 8704 bajt/dor 1 dor 1 sek 3. Skol'ko dorozhek v odnom megabajte? 2460 dor 1 disk Reshenie: -------- * ------ = 123 dor/Mb 1 disk 20 Mb 4. Skol'ko cilindrov v odnom megabajte? 1 cil 2460 dor Reshenie: ----- * -------- = 30 cil/Mb, 4 dor 20 Mb 615 cil 1 disk 123 dor ili ------- * -------- * ------- = 30 cil/Mb 1 disk 2460 dor 1 Mb 5. Dan cilindr 47, dorozhka 2, sektor 4. Kakoj fizicheskij nomer sekto- ra? Reshenie: Snachala my obrashchaem vnimanie na to, chto vopros kasaetsya sektorov. V kachestve edinic izmereniya dany cilindr, dorozhka i sektor. Kak pere- vesti ih v drugie edinicy? My znaem, chto golovki - eto to zhe samoe, chto i dorozhki, poetomu v vychisleniyah nuzhno ispol'zovat' 4 golovki vmesto 4 dorozhek: 4 dor 17 sek 17 sek 47 cil * ----- * ------ + 2 dor * ------ + 4 sek = 1 cil 1 dor 1 dor = 3196 sek + 34 sek + 4 sek = = sektor 3234

    RAZMERY FAJLOV

V osnovnom pri rabote v sisteme UNIX my schitaem, chto ee resursy bezgranichny. Naprimer, my ne zabotimsya o tom, chto sozdannyj fajl polu- chitsya "slishkom bol'shim", a eto ne tak uzh redko v personal'nyh komp'- yuterah na gibkih diskah. Esli zhe my zanimaemsya soprovozhdeniem i admi- nistrirovaniem sistemy UNIX, to my dolzhny byt' gotovy imet' delo s si- tuaciyami, kogda prevyshayutsya razlichnye predel'nye znacheniya sistemy. Vsegda luchshe issledovat' eti voprosy zaranee v nekritichnyh situaciyah, poetomu davajte rassmotrim predely razmerov fajlov i ih smysl. Nekotorye parametry "zashity" v yadro sistemy pri ee generacii. Od- nim iz takih znachenij yavlyaetsya maksimal'nyj razmer fajla. On opredelya- et naibol'shee chislo blokov, kotorye mozhet zanimat' fajl. |tot parametr tesno svyazan s prinyatym v UNIX metodom ispol'zovaniya indeksnyh desk- riptorov fajla (inodes). |to nabory ukazatelej, sredi kotoryh pervye desyat' ukazyvayut na bloki dannyh, sleduyushchij ukazyvaet na druguyu tabli- cu, sleduyushchij - na tablicu, ukazyvayushchuyu na tablicu i t.d. Imeetsya eshche odno ogranichenie razmera fajla, kotoroe opredeleno dlya kazhdogo pol'zovatelya vo vremya raboty v sisteme - chislo ulimit (user limit - pol'zovatel'skij predel). |to znachenie ustanavlivaetsya v moment vashej registracii v sisteme i predstavlyaet soboj chislo blokov po 512 bajt, kotorye vy mozhete zapisat' v lyuboj zadannyj fajl. V shell'e imeetsya komanda ulimit, kotoraya pri ee vyzove bez argumentov vyvodit eto chislo. |ta zhe komanda pozvolyaet vam umen'shit' vashe znache- nie ulimit. Tol'ko superpol'zovatel' (root) mozhet UVELICHITX znacheniya ulimit. Pobochnym effektom umen'sheniya znacheniya ulimit yavlyaetsya to, chto vy ne mozhete snova uvelichit' ego do registracionnogo znacheniya. Znachenie ulimit ostaetsya takim zhe na vse vremya raboty vashego shell, poetomu dlya vosstanovleniya registracionnogo znacheniya vam neobhodimo vyjti iz sistemy, a zatem snova zaregistrirovat'sya. Eshche odnim interesnym momentom yavlyaetsya to, chto esli vy ustanovite vashe znachenie ulimit ravnym 0, vy ne smozhete sozdat' nikakie fajly! Maksimal'no dopustimym razmerom fajla v dannom sluchae yavlyaetsya nule- voj, poetomu nikakoj fajl ne mozhet byt' sozdan. |to predstavlyaetsya dostatochno rezonnym, odnako sushchestvuyut takie situacii, kogda fajl nu- levogo razmera MOZHET sushchestvovat'. Opyat' zhe, dlya vosstanovleniya vashego obychnogo znacheniya ulimit neobhodimo vyjti iz sistemy, a zatem snova zaregistrirovat'sya. Kak otmechalos' ranee, uvelichit' znachenie ulimit mozhet tol'ko su- perpol'zovatel'. |ta procedura dovol'no prosta. Snachala nuzhno uveli- chit' znachenie ulimit komandoj ulimit, a zatem zapustit' shell. |tot novyj shell imeet novoe znachenie ulimit. Esli my hotim, chtoby sistema zagruzhalas' s shell, imeyushchim bol'shee znachenie ulimit, my mozhem ustano- vit' programmu v inittab (tablice inicializacii sistemy), chtoby eta operaciya vypolnyalas' avtomaticheski. Nizhe privoditsya primer programmy, kotoraya izmenyaet znachenie ulimit i zapuskaet shell s etim novym znacheniem. Napomnim, chto eta programma mozhet byt' zapushchena tol'ko superpol'zovatelem. 1 #include 2 #include 4 main() 5 { 6 long v1, v2, v3, newlimit = 5120; 8 v1 = (long)ulimit(UL_GFILLIM, 0L); 9 v2 = (long)ulimit(UL_SFILLIM,newlimit); 10 v3 = (long)ulimit(UL_GFILLIM, 0L); 12 printf("v1: %ld v2: %ld ulim: %ld\n",v1,v2,v3); 13 setuid(getuid()); 14 execl("/bin/sh","ulimit sh", 0); 15 } Znachenie ulimit yavlyaetsya vozvrashchaemym znacheniem sistemnogo vyzova ulimit. Pervyj vyzov ulimit v stroke 8 poluchaet ishodnoe znachenie po umolchaniyu. |to znachenie sohranyaetsya v peremennoj v1. Vyzov v stroke 9 ustanavlivaet novoe znachenie ulimit ravnym znacheniyu peremennoj newlimit. Esli etot vyzov okanchivaetsya neudachej, peremennoj v2 prisva- ivaetsya vozvrashchaemoe znachenie -1, i my vidim eto po raspechatke, koto- ruyu vydaet stroka 12. Esli vyzov byl uspeshnym, vozvrashchaemym znacheniem yavlyaetsya novoe znachenie ulimit, i eto my tozhe vidim. Zatem vyzov v stroke 10 poluchaet eto znachenie ulimit. |to ili novoe znachenie, ili staroe, v zavisimosti ot togo, byla li uspeshnoj popytka izmenit' ulimit. V stroke 13 znachenie identifikatora tekushchego processa ustanavli- vaetsya ravnym znacheniyu identifikatora pol'zovatelya, zapustivshego dan- nyj process. |to srabotaet tol'ko v tom sluchae, esli pol'zovatel', za- pustivshij dannyj shell, imeet bolee nizkij identifikator, chem sam pro- cess. Cel' zaklyuchaetsya v tom, chtoby predostavit' vozmozhnost' obychnym pol'zovatelyam zapuskat' dannyj process, davaya im vremenno prava super- pol'zovatelya. (Ne ostavlyajte ishodnyj tekst etoj programmy v sisteme, poskol'ku kto-to mozhet prevratit' ee v "lazejku" i perekompilirovat' ee - v glave 9 my uvidim takogo roda dyry v sisteme zashchity.) Stroka 14 zapuskaet shell. Argumentom etogo shell yavlyaetsya stroka "ulimit sh". |ta stroka budet vyvedena na ekran, esli my vypolnim ko- mandu "ps -ef". Dannyj shell imeet novoe znachenie ulimit. Vozmozhnost' izmenit' znachenie ulimit pozvolyaet nam opredelit' na- ibol'shij vozmozhnyj razmer fajla. Sozdanie odnogo ili neskol'kih takih fajlov maksimal'nogo razmera polezno v celyah testirovaniya. Naprimer, polezno vyyasnit', skol'ko dannyh mozhet soderzhat' gibkij disk bez pere- polneniya ili chto proizojdet, kogda sistema vyjdet za predely svobodnyh blokov. My hotim ponyat', kak vedet sebya sistema v takih situaciyah. ------------------------------------------------------------- IMYA: umntsys ------------------------------------------------------------- umntsys

    NAZNACHENIE

Razmontirovanie vseh fajlovyh sistem, smontirovannyh v dannyj mo- ment.

    FORMAT VYZOVA

umntsys

    PRIMER VYZOVA

umntsys Razmontiruet vse smontirovannye fajlovye sistemy

    TEKST PROGRAMMY

1 : 2 # @(#)umntsys v1.0 Unmount all file systems Author: Russ Sage Razmontirovanie vseh fajlovyh sistem 4 if [ "$#" -gt 0 ] 5 then echo "umntsys: too many arguments" >&2 6 echo "usage: umntsys" >&2 7 exit 1 8 fi 10 /etc/mount | sed -n -e '/^\/ /d' -e 's/^.* on \(.*\) read.*/umount \1/p' | sh - OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL umntsys? Inogda voznikayut situacii, kogda vy kak administrator hoteli by zapustit' sistemu v odnopol'zovatel'skom rezhime. Naprimer, vy hotite smenit' ili ustanovit' zhestkie diski i vam nuzhno, chtoby nikto ne imel dostupa k etomu ustrojstvu, poka vy s nim rabotaete. Vam mozhet takzhe ponadobit'sya zapustit' sistemu v minimal'noj konfiguracii s cel'yu lo- kalizacii kakoj-to problemy. Poskol'ku vypolnenie operacij zaversheniya raboty sistemy i perezagruzki predstavlyaet soboj dovol'no dlitel'nuyu proceduru, bylo by luchshe imet' sposob sohranit' sistemu rabotayushchej, no pereklyuchit' v odnopol'zovatel'skij rezhim, a zatem bystro perezapustit' mnogopol'zovatel'skij rezhim, chtoby svesti k minimumu neudobstva pol'- zovatelej. Dlya togo chtoby sdelat' eto, nam nuzhno ponyat' koncepciyu "urovnej raboty sistemy" i ispol'zovat' ih. Uroven' raboty (run level) v sisteme UNIX predstavlyaet soboj sostoyanie ili konfiguraciyu, v kotoroj mozhet byt' mashina. Fakticheski eto chislo, kotoroe opredelyaet, kakie vozmozhnosti sistemy vklyucheny ili otklyucheny i nahoditsya li sistema v odnoili mnogopol'zovatel'skom rezhi- me. Opisanie togo, chto proishodit na kazhdom urovne raboty sistemy, so- derzhitsya v fajle /etc/inittab. Obychno izmenenie urovnya raboty sistemy vklyuchaet v sebya perehod ot mnogopol'zovatel'skogo rezhima (naprimer, uroven' 6), k odnopol'zovatel'skomu rezhimu (uroven' S). Odnim iz pobochnyh effektov perehoda ot mnogopol'zovatel'skogo re- zhima k odnopol'zovatel'skomu yavlyaetsya to, chto vse dopolnitel'nye faj- lovye sistemy razmontiruyutsya. Edinstvennoj smontirovannoj fajlovoj sistemoj yavlyaetsya kornevaya (opredelennaya kak /dev/root, /dev/hd0a i t.p.). Ee nikogda nel'zya razmontirovat'. Kogda proishodit perehod ob- ratno k mnogopol'zovatel'skomu rezhimu, fajlovye sistemy obychno povtor- no montiruyutsya s pomoshch'yu fajla /etc/rc. My mozhem emulirovat' odnopol'zovatel'skij rezhim putem prekrashcheniya vypolneniya vseh processov v sisteme komandoj kill i razmontirovaniya vseh fajlovyh sistem. Komandnyj fajl umntsys prednaznachen dlya etoj ce- li. CHTO DELAET umntsys? Komandnyj fajl umntsys predstavlyaet soboj nabor konvejernyh pro- cessov, kotorye v konechnom itoge vypolnyayut razmontirovanie vseh smon- tirovannyh v dannyj moment fajlovyh sistem. Kornevaya fajlovaya sistema raspoznaetsya kak osobaya, poetomu ne delaetsya popytka razmontirovat' ee. Takzhe isklyuchaetsya popytka razmontirovat' nemontirovannye fajlovye sistemy.

    POYASNENIYA

Pervym delom komandnyj fajl umntsys proveryaet otsutstvie argumen- tov v komandoj stroke. Poskol'ku dlya nego ne sushchestvuet opcij, komand- naya stroka dolzhna byt' pustoj. Esli kolichestvo argumentov bol'she nulya, eto oshibka, poetomu na standartnoe ustrojstvo registracii oshibok vyvo- ditsya soobshchenie ob oshibke, i programma zavershaetsya. Vsya rabota vypolnyaetsya v stroke 10. |tot operator pohozh na vol- shebnoe zaklinanie. Nachinaetsya on s vypolneniya obychnoj komandy mount bez argumentov. Po umolchaniyu komanda mount vyvodit tablicu s informa- ciej obo vseh katalogah i imenah ustrojstv montirovannyh fajlovyh sistem. |ta tablica vyglyadit primerno tak: ----------------------- | | / on /dev/hd0a read/write on Mon Jan 06 09:53:03 1986 | /tmp on /dev/hd01 read/write on Mon Jan 06 09:53:03 1986 | /usr on /dev/hd02 read/write on Mon Jan 06 09:53:03 1986 | /u1 on /dev/hd03 read/write on Mon Jan 06 09:53:03 1986 | /u2 on /dev/hd04 read/write on Mon Jan 06 09:53:03 1986 | /u3 on /dev/hd05 read/write on Mon Jan 06 09:53:03 1986 | /mnt on /dev/fd01 read/write on Mon Jan 06 09:54:41 1986 | Kogda fajlovaya sistema smontirovana, trebuyutsya i katalog, i imya ustrojstva. Kogda fajlovaya sistema ne smontirovana, ispol'zuetsya tol'- ko imya ustrojstva. Nam nuzhno vyrezat' imena ustrojstv iz tablicy mon- tirovaniya i vstavit' ih v komandu umount. |to delaetsya s pomoshch'yu ko- mandy sed. Komanda sed nachinaet rabotat' s opciej -n, kotoraya podavlyaet vy- polnyaemyj po umolchaniyu vyvod na ekran, poetomu nichego ne vyvoditsya, poka my ne poprosim. My mozhem ispol'zovat' eto v svoih interesah, ot- fil'trovyvaya nenuzhnye nam stroki. Pervoj korrekciej tablicy smontiro- vannyh fajlovyh sistem yavlyaetsya izbavlenie ot zapisi o kornevoj fajlo- voj sisteme, poskol'ku my by ne hoteli pytat'sya ee razmontirovat'. Poskol'ku kornevoj fajlovoj sisteme sootvetstvuet katalog "/", my mo- zhem ispol'zovat' ego v kachestve klyucha. Vyrazhenie v operatore sed ozna- chaet: "Iskat' s nachala stroki pervyj simvol naklonnoj cherty (poskol'ku etot simvol imeet special'noe znachenie, on ekranirovan obratnoj kosoj chertoj) i probel za nim. Kogda naklonnaya cherta najdena, udalit' ee". Dannyj shablon poiska sootvetstvuet tol'ko zapisi o kornevoj fajlovoj sisteme. Sleduyushchaya operaciya redaktirovaniya vypolnyaetsya bolee zamyslovato. Ona ispol'zuet vozmozhnost' gruppirovaniya regulyarnyh vyrazhenij i posle- duyushchej ssylki na nih po nomeru, chto vy uzhe videli v nekotoryh nashih predydushchih komandnyh fajlah. Dannyj sintaksis (regulyarnoe vyrazhenie) prednaznachen dlya gruppirovaniya simvolov i posleduyushchej ssylki na nih s pomoshch'yu nomera \n. Fokus v tom, chtoby vydelit' tol'ko imya ustrojstva i sgruppirovat' ego, chto i delaet komanda podstanovki sed'a. Pervoe vy- razhenie oznachaet: "Ot nachala stroki raspoznat' lyuboj simvol, za koto- rym sleduet lyuboe kolichestvo lyubyh simvolov, probel i slovo `on'; sgruppirovat' sleduyushchie simvoly vplot' do probela, slovo `read' i vse simvoly posle nego". V rezul'tate vsego etogo vydelyaetsya imya ust- rojstva i pomeshchaetsya vo vremennuyu peremennuyu, chtoby vposledstvii k nej mozhno bylo obratit'sya. Vtoraya chast' podstanovki sozdaet novuyu stroku vzamen ishodnoj. |ta stroka sostoit iz slova "umount", probela, zatem gruppovogo vyra- zheniya nomer 1, kotoroe predstavlyaet soboj vremennuyu peremennuyu, soder- zhashchuyu imya ustrojstva. V rezul'tate vseh etih dejstvij tablica smonti- rovannyh fajlovyh sistem (za isklyucheniem zapisi o kornevoj sisteme) prevrashchaetsya v nabor komand razmontirovaniya s imenami ustrojstv v ka- chestve argumentov. Poluchennyj rezul'tat imeet primerno takoj vid: ------------------- | | umount /dev/hd0a | umount /dev/hd01 | umount /dev/hd02 | umount /dev/hd03 | umount /dev/hd04 | umount /dev/hd05 | umount /dev/fd01 | Teper' eti komandy po konvejeru peredayutsya drugomu shell ("sh -"). Simvol "-" ukazyvaet shell, chto svoi komandy on dolzhen poluchat' so standartnogo vvoda, a v dannom sluchae eto nashi komandy umount, pe- redannye po konvejeru. Oni razmontiruyut vse fajlovye sistemy. ------------------------------------------------------------ IMYA: lrgf ------------------------------------------------------------ lrgf Sozdaet fajl maksimal'no vozmozhnogo razmera

    NAZNACHENIE

Vypolnyaet operacii zapisi v fajl do teh por, poka ne obnaruzhitsya granica razmera fajla.

    FORMAT VYZOVA

lrgf

    PRIMER VYZOVA

lrgf Opredelenie granicy razmera fajla

    TEKST PROGRAMMY

1 char id[] = "@(#) lrgf v1.0 Create the largest file Author: Russ Sage Sozdat' fajl maksimal'nogo razmera 3 #include 4 #include 5 #include 6 #include 8 #define FSIZ 512 9 #define BSIZ 1024 11 long ulimit(); 12 char buf[BSIZ]; 14 main() 15 { 16 register int n, fd, bcnt; 17 char file[FSIZ]; 19 for (bcnt=0; bcntOPISANIE ZACHEM NAM NUZHNA PROGRAMMA lrgf? Kak obsuzhdalos' ranee, nam neobhodimo znat', chto proishodit, kog- da UNIX dostigaet kakih-to predelov. Ne tol'ko predelov razmera fajla, a lyubyh predelov. Primerami predel'nyh znachenij yavlyayutsya kolichestvo processov, kotorye vy mozhete zapustit', obshchee kolichestvo processov v sisteme, kolichestvo fajlov, kotorye vam razresheno otkryt', kolichestvo svobodnyh blokov, kolichestvo indeksnyh deskriptorov, glubina vlozhen- nosti katalogov, pri kotoroj eshche vozmozhna rabota, i t.d. Nam nuzhna programma, sozdayushchaya fajl maksimal'nogo razmera. Zatem my mozhem ispol'zovat' etot fajl dlya proverki razlichnyh predelov, imeyu- shchih otnoshenie k fajlam. CHTO DELAET lrgf? Lrgf - eto programma, kotoraya sozdaet fajl maksimal'no vozmozhnogo razmera. Vypolnyaetsya eto putem zapisi v fajl do teh por, poka komanda zapisi ne okonchitsya neudachej. |to oznachaet, chto v dannyj fajl bol'she nel'zya zapisat' dannye, i on dostig granicy. Pri vyzove programma lrgf vyvodit soobshchenie, soderzhashchee obshchee ko- lichestvo bajtov, kotoroe vy mozhete zapisat' v fajl. |to znachenie vy- chislyaetsya po znacheniyu ulimit, poetomu ono raznoe dlya raznyh pol'zova- telej i zavisit ot shell, s kotorym pol'zovatel' sejchas rabotaet. Zatem u vas zaprashivaetsya imya fajla. Vy mozhete ukazyvat' lyuboe imya, dlya kotorogo vy imeete prava zapisi. Odnim iz sposobov proverki zhestkogo diska yavlyaetsya zapis' odnogo iz takih bol'shih fajlov v kazhdyj razdel diska i zatem proverka otdel'nyh fajlovyh sistem. Posle zapuska programmy vy uvidite stroku s soobshcheniem, kotoroe postoyanno obnovlya- etsya. Ono soderzhit obshchee chislo zapisannyh blokov i kolichestvo bajtov, kotoroe zapisyvalos' pri kazhdoj popytke zapisi. Programma lrgf zapisy- vaet v fajl kazhdyj raz po 1024 bajta. V zavisimosti ot vashego znacheniya ulimit kolichestvo bajtov, dopisyvaemyh v konec fajla, mozhet ne byt' ravnym v tochnosti 1 Kb. Vyhodnoe soobshchenie postoyanno pechataetsya v od- noj i toj zhe stroke, zamenyaya na ekrane staroe znachenie. |to dostiga- etsya putem vyvoda tol'ko simvola vozvrata karetki, a ne perevoda stro- ki. Kogda programma ne mozhet bol'she zapisyvat' dannye v fajl, itogo- voe kolichestvo blokov vyvoditsya na ekran. |to obshchee chislo blokov, za- pisannyh v fajl.

    PRIMERY

1. $ lrgf /dev/rfd0 Vvod imeni ustrojstva v otvet na zapros imeni fajla, v kotoryj budet proizvodit'sya zapis'. Pri etom programma lrgf vypolnyaet posledo- vatel'nuyu zapis' na gibkij disk nestrukturirovannyh dannyh. Tem samym proveryaetsya, raspoznaet li drajver ustrojstva perepolnenie gibkogo diska. |to vazhno znat' pri rabote s komandoj cpio, kotoraya predpolaga- et, chto drajver ustrojstva soobshchit ob ostanovke i zaprose sleduyushchej diskety. 2. $ lrgf /usr/tmp/lrg Sozdanie fajla v fajlovoj sisteme /usr. Bol'shinstvo sistem XENIX ispol'zuyut katalog /usr kak otdel'nuyu fajlovuyu sistemu, otlichnuyu ot kornevoj. Sozdaniem fajla v kataloge /usr /tmp my mozhem proverit' po- lozhenie del v etoj chasto ispol'zuemoj fajlovoj sisteme. 3. $ lrgf /tmp/lrg V dannom sluchae sozdavaemyj fajl zajmet mesto v kornevoj fajlovoj sisteme (esli vy ne imeete kataloga /tmp v vashej sobstvennoj fajlovoj sisteme). Potrebuetsya ne slishkom mnogo takih fajlov dlya zapolneniya vseh svobodnyh blokov v kornevoj fajlovoj sisteme. 4. $ lrgf /mnt/lrg Sozdanie fajla na gibkom diske v predpolozhenii, chto na gibkom diske imeetsya fajlovaya sistema i ona smontirovana v katalog /mnt. 5. $ F=0 $ while : > do > echo -r "--> Making file $F <--" > ./lrgf <<-! > $F > ! > echo > F=`expr $F + 1` > done Dannyj cikl zapuskaet programmu lrgf beskonechnoe chislo raz. Schet- chikom yavlyaetsya peremennaya F. Ona dolzhna byt' predvaritel'no ustanovle- na v nul', chtoby shell rassmatrival ee kak chislo, a ne kak simvol'nuyu stroku. Snachala vyvoditsya soobshchenie, soderzhashchee imya sozdavaemogo faj- la. Pervym imenem fajla yavlyaetsya 0. Programma lrgf zapuskaetsya, ispol'zuya v kachestve vhodnyh dannyh "dannyj dokument" (t.e. sam ko- mandnyj fajl). V kachestve otveta na vopros ob imeni fajla ispol'zuetsya znachenie $F. Znachenie peremennoj F uvelichivaetsya, i programma lrgf vy- zyvaetsya snova. Imenami fajlov yavlyayutsya 0, 1, 2 i t.d. |to prodolzha- etsya do teh por, poka ne ostanetsya bol'she svobodnogo mesta. Vryad li vy budete pol'zovat'sya etim chasto, no dlya testirovaniya eto prekrasnoe sredstvo zapolnit' vse svobodnoe prostranstvo. Esli vy hotite uvidet', chto delaet vasha sistema, kogda ischerpany svobodnye bloki, primenite dannyj komandnyj fajl.

    POYASNENIYA

Stroki 3-6 vklyuchayut vse neobhodimye fajly zagolovkov. |ti fajly soderzhat opredeleniya i metki, neobhodimye dannoj programme. Stroki 8 i 9 opredelyayut razmery bufera dlya imen fajlov i bufera dlya zapisi na disk. Znachenie BSIZ mozhno podnastroit', esli programma rabotaet slishkom medlenno. U vas mozhet vozniknut' zhelanie uvelichit' BSIZ do 4096, chtoby proizvodilos' ne tak mnogo operacij zapisi. Stroka 11 opredelyaet vozvrashchaemoe znachenie sistemnogo vyzova ulimit kak dlinnoe celoe. Stroka 12 rezerviruet bufer, kotoryj dolzhen byt' zapisan. |tot bufer nahoditsya vne osnovnoj chasti programmy iz-za ogranichenij na razmer vnutri funkcij. V osnovnom bloke programmy nai- bol'shaya oblast' avtomaticheskoj pamyati, kotoruyu vy mozhete imet', ravna razmeru vashego steka. Vy mozhete sdelat' po-drugomu, ob座aviv dannyj bu- fer kak staticheskuyu peremennuyu v funkcii main. My reshili vynesti ego za predely funkcii main i ne ob座avlyat' kak staticheskuyu peremennuyu. Stroka 16 ob座avlyaet nekotorye rabochie peremennye. Zametim, chto oni pomeshchayutsya v registry. |to sdelano dlya uskoreniya raboty programmy i polucheniya bolee kompaktnogo ob容ktnogo koda. Stroka 17 rezerviruet bufer, v kotoryj vy vvodite imya fajla. Stroki 19 i 20 zapolnyayut zapisyvaemyj bufer simvolami "x", poeto- mu posle sozdaniya fajla my mozhem ih tam uvidet'. Stroka 22 vyvodit znachenie ulimit dlya vashego processa. Obratite vnimanie, chto vyzov ulimit vozvrashchaet kolichestvo blokov, poetomu my dolzhny umnozhit' eto chislo na 512. V rezul'tate my poluchim obshchee koli- chestvo bajtov, kotoroe mozhet soderzhat' fajl. Stroki 24-26 zaprashivayut imya fajla, chitayut ego i podgotavlivayut ekran dlya sleduyushchego soobshcheniya. Stroki 28-32 otkryvayut fajl s ukazan- nym imenem dlya polucheniya deskriptora fajla. Fajl otkryvaetsya dlya za- pisi i chteniya, sozdaetsya pri neobhodimosti i obrezaetsya, esli on uzhe sushchestvuet. Esli operaciya otkrytiya fajla zakanchivaetsya neudachej, vyvo- ditsya soobshchenie ob oshibke, i programma zavershaetsya. Stroki 34-42 vypolnyayut zapis'. Cikl for beskonechen, poskol'ku v seredine operatora net proverki znacheniya schetchika. Peremennaya bcnt postoyanno uvelichivaetsya, poka vypolnyaetsya zapis'. Stroka 36 vypolnyaet zapis' v fajl. Esli zapis' neudachna, vyvo- ditsya soobshchenie ob oshibke i po operatoru break osushchestvlyaetsya vyhod iz cikla. Stroka 41 vyvodit kolichestvo vypolnennyh operacij zapisi i ko- lichestvo zapisannyh bajtov. Obratite vnimanie, chto dannyj operator print soderzhit vozvrat karetki (\r), a ne perevod stroki. |to pozvolya- et kursoru ostavat'sya v odnoj itemah. ekrane poverh staryh znachenij. |kran ne skrolliruetsya, chto udobno dlya nablyudeniya. Vypolnenie cikla prodolzhaetsya do teh por, poka sistemnyj vyzov write ne zakonchitsya neudachej i operator break ne prekratit cikl. Kogda eto proishodit, vypolnenie prodolzhaetsya so stroki 43, kotoraya pechataet "end of program". Vypolnenie komandy "ls -l" dlya zapisannogo fajla pokazyvaet, skol'ko bajtov imeet fajl maksimal'nogo razmera. |to kolichestvo dolzhno sovpadat' s chislom, kotoroe soobshchila vam programma lrgf. V dannoj glave predstavlena lish' nebol'shaya chast' vozmozhnyh islle- dovanij vnutrennej raboty fajlovyh sistem i ustrojstv v UNIX. Nekoto- rye iz predstavlennyh programm mogut byt' neprimenimy v vashej versii sistemy UNIX ili v vashej konfiguracii apparatnyh sredstv ili mogut vyglyadet' v vashej sisteme inache. Odnako obshchie principy sohranyayutsya, i vy mozhete ispol'zovat' rassmotrennye sredstva v kachestve osnovy dlya vashih sobstvennyh issledovanij.

    * GLAVA 8. Kommunikacii v sisteme UNIX *

VVEDENIE FIZICHESKOE PODKLYUCHENIE PODKLYUCHENIE BEZ KOMMUNIKACIONNYH USTROJSTV DOSTUP MIKRO-|VM ILI TERMINALA K SISTEME UNIX PRYAMOE PODKLYUCHENIE DISTANCIONNOE PODKLYUCHENIE DOSTUP IZ SISTEMY UNIX K MIKRO-|VM OBNARUZHENIE MODEMOV V SISTEME ISPOLXZOVANIE I KONFIGURIROVANIE LINII IZMENENIE SKOROSTEJ OBMENA ZAHVAT DANNYH INSTRUMENTALXNYE SREDSTVA DLYA KOMMUNIKACIONNYH LINIJ cuchk - Cu check - proverka svobodnoj linii dlya cu talk - Obrashchenie k posledovatel'nomu portu DOSTUP IZ UNIX V UNIX SVYAZYVANIE UNIX-MASHIN OBLASTI DLYA PEREDAVAEMYH FAJLOV SETEVAYA BEZOPASNOSTX OGRANICHITELXNYE FAJLY OTLADKA KOMMUNIKACIJ uust Sostoyanie uucp i sluzhebnye dejstviya uutrans Peredacha fajlovyh derev'ev iz odnoj sistemy UNIX v druguyu sistemu UNIX KONFIGURACIONNYE RESHENIYA PODKLYUCHENIE UNIX K MODEMU I GLAVNOJ MASHINE PODKLYUCHENIE UNIX I TERMINALA K MODEMU PODKLYUCHENIE UNIX K TERMINALU, MODEMU I GLAVNOJ MASHINE SISTEMA UNIX, MIKRO-|VM I MODEM ALXTERNATIVNOE RESHENI TRI SISTEMY UNIX

    VVEDENIE

V dannoj glave my rassmatrivaem sredstva kommunikacii v sisteme UNIX. V to vremya kak v mire MS-DOS kommunikacii ogranicheny obychno "chernym yashchikom" (programmnymi paketami i dovol'no standartnymi modemami), kommunikacii v sisteme UNIX bolee slozhny. UNIX predlagaet neskol'ko urovnej kommunikacij, vklyuchaya peredachu fajlov, udalennuyu registraciyu v sisteme, distancionnuyu pochtu i razvitye sistemy obmena soobshcheniyami, kotorye mogut svyazyvat' mezhdu soboj sotni sistem UNIX. Odnako, v bol'shinstve sistem UNIX net udobno oformlennyh, upravlyaemyh s pomoshch'yu menyu sredstv kommunikacii. Vmesto etogo imeyutsya slozhnye sistemnye komandy i neobhodimost' podderzhivat' mnogo fajlov. Obychno trebuetsya takzhe vladet' mnogimi podrobnostyami konfiguracii i ispol'zovaniya modemov. My predlagaem teoreticheskoe obosnovanie i prakticheskie rekomendacii, a takzhe instrumental'nye sredstva, kotorye pomogut vam osvoit' dannyj aspekt sistemy UNIX i obespechit' rabotosposobnost' kommunikacij v vashej sisteme. My rassmotrim ne tol'ko pryamuyu svyaz' mezhdu mashinami, no i svyaz' s udalennymi terminalami i modemami. Snachala my zajmemsya fizicheskimi soedineniyami, chto yavlyaetsya pervym etapom ustanovki linii svyazi. My rassmotrim model' interfejsa RS232-C i vyyasnim, kak podklyuchit' pryamuyu mezhmashinnuyu svyaz'. Zatem my obsudim obrashchenie k sisteme UNIX s mikro-|VM. Pogovorim o tom, kakie sushchestvuyut vidy protokolov i kakie iz nih luchshe ispol'zovat'. Dalee my rassmotrim, kak pol'zovat'sya modemom, chtoby vyzvat' iz UNIX drugie sistemy, naprimer doski ob座avlenij i sistemy, otlichnye ot UNIX. Vy mozhete izuchit', kak najti vse modemnye soedineniya v sisteme, podklyuchit'sya k posledovatel'nomu portu i upravlyat' modemom. Pri obrashchenii k drugoj sisteme vy mozhete perehvatit' vse dannye, postupayushchie na vash terminal, i sohranit' ih v fajle dlya posleduyushchego ispol'zovaniya. Komandnye fajly (cuchk i talk), predstavlennye v dannom razdele, sledyat za dostupnost'yu linii svyazi i ustanavlivayut svyaz' s modemom. V zavershenie my rassmotrim svyaz' mezhdu sistemami UNIX s pomoshch'yu utility uucp. My uvidim, kak i kuda peredavat' fajly mezhdu sistemami, kak fajly zashchity dannyh upravlyayut sredoj uucp i izuchim sposoby otladki mehanizma peredachi fajlov s pomoshch'yu uucp. Zdes' predstavleny komandnye fajly uust dlya vypolneniya rutinnoj raboty po obsluzhivaniyu uucp i uutrans dlya kopirovaniya drevovidnoj struktury katalogov iz odnoj sistemy v druguyu.

    FIZICHESKOE PODKLYUCHENIE

Bol'shinstvo mashin, na kotoryh rabotaet UNIX, imeyut odin ili neskol'ko posledovatel'nyh portov. |ti porty - glaza i ushi mashin, pozvolyayushchie sisteme svyazyvat'sya s vneshnim mirom. Ih mozhno ispol'zovat' dlya podklyucheniya lyubogo ustrojstva s interfejsom RS-232-C i dlya svyazi ili upravleniya. V dannom razdele my rassmotrim, kak podklyuchit' interfejs RS -232-C dlya obespecheniya svyazi tipa UNIX-UNIX, terminal-UNIX i modem-UNIX. Nachnem s rassmotreniya bazovoj modeli RS-232-C, pokazannoj na ris. 8-1. |ta model' illyustriruet, kak mogut obshchat'sya drug s drugom dve mashiny i/ili terminaly libo cherez modemy po telefonnym liniyam, libo po pryamoj (provodnoj) svyazi. Hotya posleduyushchee obsuzhdenie my vedem preimushchestvenno v terminah telefonnyh soedinenij, te zhe bazovye principy otnosyatsya i k pryamoj svyazi, za isklyucheniem togo, chto kommunikacionnye ustrojstva (DCE, data communication equipment) v etom sluchae ne nuzhny. Ris. 8-1. Standartnaya model' interfejsa RS-232-C ------------------------------------------------------------------- _||_ +-------+ 2 ***** _||_ ***** 2 +-------+ | |------>* *----\ || /----* *<------| | | DTE-1 | * DCE * \ || / * DCE * | DTE-2 | | |<------* * / || \ * *------>| | +-------+ 3 * *<---/ || \--->* * 3 +-------+ ***** || ***** ------------------------------------------------------------------- Na kazhdom konce nahodyatsya terminal'nye ustrojstva, nazyvaemye DTE (data terminating equipment). V roli DTE mozhet vystupat' terminal, naprimer, VT-100, ili central'nyj processor mikro-, mini- ili bol'shoj |VM. Kazhdoe terminal'noe ustrojstvo DTE dolzhno ispol'zovat' kommunikacionnoe ustrojstvo DCE, nazyvaemoe obychno modemom, dlya modulyacii i demodulyacii signalov, prohodyashchih po telefonnym liniyam. Kazhdoe DTE ispol'zuet vyvod nomer 2 dlya peredachi dannyh i vyvod nomer 3 dlya polucheniya dannyh. Poskol'ku to, chto peredano s vyvoda 2 na kazhdoj mashine, prinimaetsya na vyvode 3 drugoj mashiny, voznikaet perekreshchivanie telefonnyh linij mezhdu ustrojstvami DCE. Podsoedinenie i obrabotka signala mezhdu DTE i DCE polnost'yu sootvetstvuyut standartu RS-232-C. Apparatnyj protokol pozvolyaet DTE ispol'zovat' DCE dlya posylki i priema dannyh ot drugogo DTE. Kabel', svyazyvayushchij fizicheski DTE i DCE, nazyvaetsya "pryamolinejnym" kabelem. On pozvolyaet ustrojstvu DTE posylat' komandy (ili signaly s vyvodov) na DCE, a ustrojstvu DCE otpravlyat' komandy obratno na DTE. Podklyuchenie DCE odnoj mashiny k DCE drugoj mashiny proizvoditsya cherez obychnye telefonnye linii. Ustrojstva DCE neobhodimy po toj prichine, chto ustrojstva DTE yavlyayutsya cifrovymi, a telefonnye linii - analogovymi. Edinstvennyj sposob peredat' cifrovuyu informaciyu po analogovym liniyam - zakodirovat' cifrovuyu informaciyu v analogovyj signal, poslat' etot signal po telefonnym liniyam, a zatem dekodirovat' analogovyj signal obratno v cifrovuyu informaciyu.

    PODKLYUCHENIE BEZ KOMMUNIKACIONNYH USTROJSTV

Esli vashi mashiny raspolozheny dovol'no blizko (v predelah 50 futov / 15 metrov. Odin fut sostavlyaet okolo 30.5 sm. - Primech. perev./), vam ne nuzhen modem, vy mozhete ispol'zovat' kabel' "nulevogo modema" vmesto DCE. Kabel' nulevogo modema imitiruet takoj zhe protokol, chto i DCE, no ne trebuet nalichiya modema dlya kommunikacij. Osnovnaya zadacha podklyucheniya nulevogo modema - obespechit' perekreshchivanie mezhdu peredayushchimi i prinimayushchimi signalami. Na ris. 8- 2 pokazana obshchaya shema podklyucheniya bez ustrojstv DCE. Ris. 8-2. Konfiguraciya s nulevym modemom ------------------------------------------------------------------- +-------+ 2 2 +-------+ | |------>... ...<------| | | DTE | 3 \./ 3 | DTE | | |<------.../ \...------>| | +-------+ +-------+ ------------------------------------------------------------------- Dlya togo chtoby vypolnit' podklyuchenie, imitiruyushchee DCE, trebuyutsya nekotorye manipulyacii s signalami. |ti manipulyacii takzhe standartizovany v kabele nulevogo modema. Po sheme etogo kabelya, pokazannoj na ris. 8-3, rassmotrim, kak on imitiruet signaly DCE. Ris. 8-3. Kabel' nulevogo modema RS-232-C ------------------------------------------------------------------- DTE-1 DTE-2 || || ZASHCHITNAYA ZEMLYA 1 ||-------------------------|| 1 (PROTECTIVE GROUND) || || || || SIGNALXNAYA ZEMLYA 7 ||-------------------------|| 7 (SIGNAL GROUND) || || || || PEREDACHA DANNYH 2 ||----------\ /----------|| 2 (TRANSMIT DATA) || . || PRIEM DANNYH 3 ||<---------/ \--------->|| 3 (RECEIVE DATA) || || || || ZAPROS PEREDACHI 4 ||----- -----|| 4 (REQUEST TO SEND) || | | || || | | || GASHENIE PEREDACHI 5 ||<----\ /---->|| 5 (CLEAR TO SEND) || \---\ /---/ || || . || IDET PEREDACHA DANNYH 8 ||<---------/ \--------->|| 8 (DATA CARRIER DETECT) || || || || GOTOVNOSTX NABORA DANNYH 6 ||<---------\ /--------->|| 6 (DATA SET READY) || . || GOTOVNOSTX TERMINALA 20 ||----------/ \----------|| 20 (DATA TERMINAL READY) || || || || ------------------------------------------------------------------- Linii 1 i 7 ispol'zuyutsya dlya shassi i signal'noj zemli sootvetstvenno. Linii 2 i 3 peresekayutsya takim obrazom, chtoby kogda odna storona govorit, drugaya slushala. Obe storony mogut govorit' odnovremenno (eto nazyvaetsya polnodupleksnym rezhimom), esli my ispol'zuem razlichnye nabory provodov. Dlya imitacii upravlyayushchih signalov linii 4, 5 i 8 podsoedinyayutsya tak, kak pokazano na ris. 8-3. Kazhdyj raz, kogda ustrojstvo DTE-1 aktiviziruet liniyu "Request to Send" ("Zapros peredachi"), t.e. peredaet po nej signal, ono poluchaet nazad signal "Clear to Send" ("Gashenie peredachi"), ukazyvayushchij, chto drugaya storona gotova prinyat' dannye. Zatem, posylaya signal po linii "Data Carrier Detect" ("Idet peredacha dannyh"), ustrojstvo DTE-1 soobshchaet drugoj storone, chto postupayut dannye. Takoe metodichnoe "apparatnoe rukopozhatie" garantiruet, chto nikakie dannye ne budut otpravleny, poka drugaya storona ne budet gotova ih prinyat'. Linii 6 i 20 podsoedinyayutsya tak, chtoby obespechit' poslednie upravlyayushchie signaly nulevogo modema. Poka DTE aktivno ("Data Terminal Ready" - "Gotovnost' terminala", liniya 20), drugaya storona schitaet, chto imeet delo s aktivnym modemom ("Data Set Ready" - "Gotovnost' nabora dannyh", liniya 6). Pri takom sposobe soedineniya linij 6 i 20 vsyakij raz, kogda vy vydergivaete vash kabel' iz mashiny ili pereklyuchaete ego na drugoj kanal soedinitel'noj korobki, drugaya storona teryaet vash signal aktivnosti i otklyuchaetsya (ili generiruet signal HUP - hangs up, povesit' trubku telefona). CHtoby sdelat' takoj kabel', kotoryj ne vyzyvaet otklyucheniya pri vynimanii shtepselya (t.e. NOHUP), prisoedinite vyhod "Data Terminal Ready" ko vhodu "Data Set Ready" na tom zhe ustrojstve DTE. |to zastavlyaet sistemu soobshchat' samoj sebe, chto modem vsegda gotov. Zametim, chto rassmotrennaya shema podklyucheniya nulevogo modema yavlyaetsya rekomenduemoj, no sushchestvuyut i drugie sposoby, poetomu ne dumajte, chto vse nulevye modemy odinakovy. V kazhdom konkretnom sluchae dlya nulevyh modemov uchityvaetsya opredelennoe okruzhenie ili funkciya, naprimer nalichie bezobryvnogo (nohup) varianta podklyucheniya. Teper', kogda my znaem dva razlichnyh sposoba soedineniya mashin, my mozhem rassmotret' sposoby kommunikacij i tipy podklyucheniya, kotorye mogut nam prigodit'sya. DOSTUP MIKRO-|VM ILI TERMINALA K SISTEME UNIX V etom razdele my rassmotrim razlichnye sposoby obshcheniya mikro-|VM i avtonomnyh terminalov s sistemoj UNIX. My predpolagaem, chto odno ustrojstvo DTE rabotaet ne pod upravleniem UNIX i obrashchaetsya k drugomu ustrojstvu, upravlyaemomu sistemoj UNIX.

    PRYAMOE PODKLYUCHENIE

V prostejshem sluchae imeetsya terminal ili mikro-|VM, podsoedinennye neposredstvenno k sisteme UNIX. |to ochen' chasto vstrechaetsya v sistemah razrabotki, kogda UNIX ispol'zuetsya v kachestve kross-kompilyatora, a rezul'tiruyushchij kod zagruzhaetsya v mikro-|VM. Drugaya situaciya - kogda terminaly nahodyatsya na rabochih stolah sotrudnikov i primenyayutsya dlya vypolneniya bumazhnoj raboty, otpravki pochty, pechati dokumentov i t.d. Tipichnye konfiguracii s pryamym podsoedineniem pokazany na ris. 8-4. Obychnyj scenarij podklyucheniya terminala vyglyadit primerno takim obrazom. Pol'zovatel' s pomoshch'yu terminala, naprimer DEC VT-100, registriruetsya v sisteme UNIX po pryamoj svyazi. Terminal'noe ustrojstvo DTE dolzhno byt' ustanovleno v sootvetstvii s pravil'noj vnutrennej konfiguraciej, vklyuchaya skorost' v bodah, startovye i stopovye bity, chislo bitov dannyh i chetnost'. |to obychnye ustanovki terminala, kotorye mozhno zadat' libo tumblernymi pereklyuchatelyami, libo pri pomoshchi terminal'noj mikroprogrammy "SETUP". Mikro-|VM, v otlichie ot terminala, dolzhna zapustit' nekotoroe kommunikacionnoe programmnoe obespechenie dlya korrektnogo upravleniya apparaturoj. |ti programmy obychno snabzheny menyu ili kakim-to drugim sposobom ukazaniya parametrov - takih zhe, kak u terminalov. Dejstvitel'no, imeyutsya programmnye pakety, obespechivayushchie polnuyu ili pochti polnuyu emulyaciyu populyarnyh terminalov, takih kak VT-100. Kommunikacinnoe programmnoe obespechenie, ispol'zuemoe vami, ustanavlivaetsya ne special'no dlya UNIX, a dlya obrabotki signalov RS-232-C, kotorye obychno ne zavisyat ot togo, pryamoe li podsoedinenie ili cherez modem. Ris. 8-4. Pryamoe podklyuchenie terminalov i mikro-|VM k UNIX --------------------------------------------------------------------- DTE-1 DTE-2 DEJSTVIE DEJSTVIE +----------+ +--------+ Mikroprogramma | | Nulevoj modem| | getty 9600 tty00 SETUP | terminal |--------------| tty00 | login imya_pol'z | | | | sh +----------+ | | | UNIX | +----------+ | | Kommunikacionnoe | | Nulevoj modem| | programmnoe | mikro-|VM|--------------| tty01 | obespechenie | | | | +----------+ +--------+ --------------------------------------------------------------------- V kachestve kabelya, soedinyayushchego terminal (ili mikro-|VM) s sistemoj UNIX, nuzhno ispol'zovat' nulevoj modem. Kogda kommunikacionnoe ustrojstvo DCE otsutstvuet, primenyaetsya kabel' nulevogo modema. V sisteme UNIX na terminal'nom ustrojstve DTE dolzhna byt' utilita getty (chto pervonachal'no oznachalo "get teletype" - dostup k teletajpu), kotoraya rabotaet s opredelennym portom i obnaruzhivaet moment, kogda kto-to pytaetsya zaregistrirovat'sya v sisteme. Programma getty (opisannaya v init(M) i getty(M)) vyvodit podskazku "login:" i chitaet simvoly, postupayushchie po linii. Pri pryamom podklyuchenii process getty mozhet rabotat' so skorost'yu 9600 bod, poetomu pol'zovateli mogut poluchit' vyigrysh ot primeneniya etoj skorosti. |to znachitel'no bystree, chem 1200 ili inogda 2400 bod - skorostej, kotorye ispol'zuyutsya chashche vsego pri rabote s obychnymi telefonnymi liniyami. V zavisimosti ot togo, kak ustanovlen fajl gettydefs, vy mozhete obychno izmenit' skorost' raboty getty, nazhimaya klavishu break. Klavisha break generiruet ne simvol, a signal v liniyu, kotoryj dlitsya opredelennyj interval vremeni. Drajvery ustrojstv v sisteme UNIX raspoznayut etot signal i dejstvuyut sootvetstvuyushchim obrazom. Rassmotrenie samogo metoda, s pomoshch'yu kotorogo getty rabotaet na razlichnyh skorostyah, vyhodit za predely dannoj knigi. Vazhno znat', chto esli getty rabotaet na skorosti 9600 bod, a vy ispol'zuete terminal, ustanovlennyj na 1200 bod, to vam nuzhno prokrutit' pereklyuchenie skorostej getty s 9600 bod cherez vse promezhutochnye skorosti do dostizheniya znacheniya 1200 bod. Derzhite klavishu break nazhatoj do teh por, poka getty ne ustanovitsya na nuzhnuyu vam skorost'. Sleduyushchij primer vzyat iz fajla gettydefs v OC XENIX System V i pokazyvaet, kak svyazany mezhdu soboj skorosti obmena. -------------------------- | 5# B9600 PARENB CS7 OPOST ONLCR # B9600 SANE IXANY #Login: #1 | 4# B4800 PARENB CS7 OPOST ONLCR # B4800 SANE IXANY #Login: #5 | 3# B2400 PARENB CS7 OPOST ONLCR # B2400 SANE IXANY #Login: #4 | 2# B1200 CS8 OPOST ONLCR # B1200 SANE IXANY #Login: #3 | 1# B300 CS7 OPOST ONLCR # B300 SANE IXANY #Login: #2 | Zdes' ukazanie #5 v fajle inittab (ili v fajle ttys dlya pol'zovatelej XENIX i System III) porozhdaet process getty, rabotayushchij na skorosti 9600 bod. Esli vy nazhimaete klavishu break, sleduyushchim po poryadku yavlyaetsya nomer 1 (kak ukazano v konce stroki nomer 5). Esli vy nazhimaete break eshche raz, to sleduyushchej yavlyaetsya stroka nomer 2, i t.d. Esli vy nazhmete break dostatochnoe kolichestvo raz, skorost' getty vernetsya po ciklu k znacheniyu 9600 bod. Vsya posledovatel'nost' dejstvij, svyazannyh s registraciej v sisteme, vyglyadit primerno tak. Snachala init porozhdaet process getty (iniciiruemyj iz fajla /etc/inittab) na opredelennom nomere terminala i s opredelennoj skorost'yu. Pri etom ustanavlivayutsya harakteristiki linii i vydaetsya registracionnaya podskazka. Kogda pol'zovatel' vvodit registracionnoe imya, getty proveryaet ego na pravil'nost', a zatem vypolnyaet programmu login. Login zaprashivaet parol', zashifrovyvaet ego i sveryaet s zashifrovannym parolem v fajle /etc/passwd. Esli paroli sovpadayut, login zapuskaet process shell, kotoryj pechataet shell-podskazku i chitaet vashi komandy, postupayushchie s terminala. Kakoj imenno shell budet zapushchen - opredelyaetsya zapis'yu v fajle parolej, sootvetstvuyushchej dannomu registracionnomu imeni. Moemu registracionnomu imeni sootvetstvuet takaya zapis': russ:j9egLecqEpXLg:201:51:Russ Sage:/usr/russ:/bin/shV V etom sluchae zapuskaetsya System V shell, odin iz novyh shell-interpretatorov firmy AT&T.

    DISTANCIONNOE PODKLYUCHENIE

Al'ternativoj pryamomu podklyucheniyu yavlyaetsya distancionnoe podklyuchenie cherez modemnuyu liniyu, pokazannoe na ris. 8-5. Ustanovka terminala ili konfigurirovanie mikro-|VM vyglyadyat primerno tak zhe, kak i v predydushchem sluchae, za isklyucheniem skorosti obmena, na kotoroj rabotaet terminal. Dlya bol'shinstva modemov ona dolzhna ravnyat'sya 1200 bodam. Ris. 8-5. Distancionnoe podklyuchenie terminalov i mikro-|VM k UNIX --------------------------------------------------------------------- DEJSTVIE Komandy modema DTE-1 DTE-2 +----------+ ***** +--------+ | | pryamoj * * | | | terminal |-------* modem *\ | | | | kabel' * * \ ***** | UNIX | +----------+ ***** \ _||_ * * pryamoj | | \ _||_ ---* modem *-------| tty00 | / || * * kabel' | | +----------+ ***** / || ***** | | | | pryamoj * * / +--------+ | mikro-|VM|-------* modem */ getty 1200 tty00 | | kabel' * * login imya_pol'z +----------+ ***** sh Kommunikacionnoe obespechenie, komanda nabora telefonnogo nomera --------------------------------------------------------------------- Terminal (kogda on ustanovlen na 1200 bod) obshchaetsya neposredstvenno s modemom. Pri etom zadejstvovany modemnye komandy "nabrat' telefonnyj nomer" (dial), "povesit' trubku" (hang up) i t.d. Mikro-|VM, zapuskayushchaya kommunikacionnoe programmnoe obespechenie, obychno imeet komandu nabora nomera, kotoraya generiruet komandu dlya modema. Soedinenie mezhdu terminalom/mikro-|VM i modemom dolzhno byt' vypolneno v vide pryamolinejnogo kabelya. Modem imeet takzhe telefonnyj kabel', idushchij v telefonnuyu sistemu. Poskol'ku my imeem delo s UNIX, posledovatel'nost' dejstvij pri registracii v sisteme takaya zhe, kak i rassmotrennaya ranee, za isklyucheniem togo, chto getty iniciiruetsya obychno so skorost'yu 1200 bod, chtoby sootvetstvovat' skorosti modema. Esli getty imeet druguyu skorost', pereklyuchite ee s pomoshch'yu klavishi break na znachenie 1200 bod. Kak tol'ko vse dejstviya po konfigurirovaniyu zaversheny, terminal ili mikro-|VM mozhet svyazat'sya s sistemoj UNIX. Kak eto sdelat'? Pri registracii pol'zovatelya v sisteme struktura dannyh termcap ispol'zuetsya dlya podderzhki upravleniya ekranom. Esli u vas eshche net zapisi v fajle termcap, obratites' k predydushchej glave, gde opisano, kak podgotovit' takuyu zapis'. Terminaly (poskol'ku obychno oni yavlyayutsya prosto apparaturoj) ne slishkom gibki i druzhestvenny po otnosheniyu k pol'zovatelyu. Oni ne obladayut shirokim spektrom vozmozhnostej pomimo registracii v sisteme i zapuska nekotoryh programm. Mikro-|VM, s drugoj storony, imeyut bol'shuyu gibkost' i mogut mnogoe dobavit' k pol'zovatel'skomu interfejsu s sistemoj UNIX. Kommunikacionnye programmy imeyut obychno bufer pamyati s pryamoj adresaciej (RAM), kotoryj vy mozhete ispol'zovat' dlya togo, chtoby zahvatit' dannye i pomestit' ih na disk. Blagodarya primeneniyu etogo bufera, vy mozhete izbavit'sya ot neobhodimosti ispol'zovat' special'nye komandy UNIX dlya peredachi fajlov. Vy mozhete dat' komandu vklyucheniya zahvata dannyh, zatem otobrazit' fajl na ekran (ispol'zuya, naprimer, komandu cat ili prosmatrivaya fajl redaktorom), esli tol'ko etot fajl ne slishkom bol'shoj dlya bufera. Sleduet imet' v vidu, odnako, chto programmnye fajly ili drugie fajly, trebuyushchie stoprocentnoj tochnosti pri peredache, nuzhno peredavat' s yavnym ispol'zovaniem protokola proverki oshibok, poskol'ku telefonnye linii ili dazhe pryamoe podklyuchenie mogut vnosit' "shumy" i odin nevernyj simvol mozhet sdelat' programmu bespoleznoj. Nekotorye protokoly, podderzhivaemye v mire mikro-|VM, prisposobleny k mashinam s sistemoj UNIX, naprimer programmy xmodem i kermit. Iz etih dvuh protokolov xmodem bolee shiroko rasprostranen v mire mikro-|VM i podderzhivaetsya pochti vsemi sistemami tipa dosok ob座avlenij. Kermit ochen' populyaren v mire UNIX, imeet rastushchuyu populyarnost' v mire mikro-|VM i dostupen pochti dlya kazhdoj modeli mikro-|VM za cenu, nemnogim bol'shuyu stoimosti diska. Ispol'zuya eti protokoly, mikro-|VM mozhet posylat' i prinimat' fajly iz sistemy UNIX, i vam ne nuzhno zabotit'sya o kontrole oshibok pri peredache dannyh. CHtoby podrobnee uznat' ob etih protokolah, prokonsul'tirujtes' u administratorov vashej sistemy UNIX i u pol'zovatelej mikro-|VM, imeyushchih te zhe problemy. DOSTUP IZ SISTEMY UNIX K MIKRO-|VM Obratnaya situaciya, v otlichie ot tol'ko chto rassmotrennoj, sostoit v obrashchenii iz sistemy UNIX k sisteme, otlichnoj ot UNIX, funkcioniruyushchej na mikro-|VM ili na bol'shoj mashine. Dlya togo chtoby eto sdelat', neobhodimo znat', kak poluchit' dostup k posledovatel'nomu portu, kakuyu komandu modema ispol'zovat' dlya nabora telefonnogo nomera, kak zaregistrirovat'sya v toj sisteme, v kotoruyu my obrashchaemsya. Model' etoj situacii pokazana na ris. 8-6. Terminal'noe ustrojstvo DTE-1, t.e. sistema UNIX, ispol'zuet pryamoj kabel' dlya podklyucheniya modema. Dlya posledovatel'noj linii, kotoroj v nashem primere yavlyaetsya tty00, ne nuzhno zapuskat' process getty. Programma getty nuzhna tol'ko dlya registracii v sisteme, a ne dlya obrashcheniya k drugoj sisteme. Posledovatel'nym portom UNIX-mashiny upravlyaet programma cu. Sistema, otlichnaya ot UNIX, imeet registracionnuyu posledovatel'nost' nekotorogo vida. Esli vy obrashchaetes' k mikro-|VM, na kotoroj funkcioniruet programmnoe obespechenie tipa doski ob座avlenij, to sistema, otlichnaya ot UNIX, obychno zaprashivaet vashe imya, gorod i t.d., a takzhe parol'. (Obychno vy mozhete zaregistrirovat'sya kak novyj pol'zovatel' i zavesti parol', no eto zavisit ot konkretnoj doski ob座avlenij.) Esli drugoj sistemoj yavlyaetsya bol'shaya mashina, to ee registracionnuyu posledovatel'nost' nuzhno znat' zaranee. Kak uzhe otmechalos', osnovnoj programmoj, kotoruyu predostavlyaet UNIX dlya obrashcheniya k drugoj sisteme, yavlyaetsya cu(1), chto oznachaet "call unix" ("vyzvat' UNIX"). Na praktike, kak i v nashem primere, drugaya sistema ne obyazana byt' sistemoj UNIX, poetomu etu programmu bylo by bolee pravil'no harakterizovat' kak "podklyuchenie k UNIX-portu". Ris. 8-6. Obrashchenie UNIX k sisteme, otlichnoj ot UNIX ------------------------------------------------------------------- DTE-1 DTE-2 +--------+ +------+ | | ***** _||_ ***** | | | UNIX | pryamoj * * _||_ * * pryamoj | Ne | | |-------* modem *-- || --* modem *-------| UNIX | | tty00 | kabel' * * || * * kabel' | | | | ***** || ***** | | +--------+ +------+ DEJSTVIE DEJSTVIE Vmesto komandy getty tty00 Specificheskaya komanda cu -ltty00 dir registracionnaya posledovatel'nost' ------------------------------------------------------------------- Programma cu otkryvaet posledovatel'nyj port i pomeshchaet "fajl zanyatosti" ("lock file") v katalog /usr/spool/uucp. Prisutstvie etogo fajla zanyatosti prosto oznachaet, chto port zadejstvovan, i prepyatstvuet dostupu k nemu drugih pol'zovatelej. Vy imeete pravo isklyuchitel'nogo dostupa do teh por, poka ne vyjdete iz programmy cu i ne otdadite etot port komu-nibud' drugomu. Pri vyzove utility cu nachinayut rabotat' dva processa: chitatel' (kotoryj chitaet iz posledovatel'nogo porta) i pisatel' (kotoryj pishet v posledovatel'nyj port). Kogda vy vvodite simvoly dlya programmy cu, ona proveryaet nalichie sredi nih special'nyh simvolov, na kotorye ona dolzhna reagirovat'. Obychno cu srazu reagiruet na special'no prednaznachennye ej komandnye simvoly. Ostal'nye simvoly peredayutsya cherez posledovatel'nyj port drugoj storone. Pomimo peredachi simvolov vpered i nazad, programma cu predostavlyaet mnogie funkcii, analogichnye funkciyam kommunikacionnogo paketa mikro-|VM.

    OBNARUZHENIE MODEMOV V SISTEME

Esli vy rabotaete na bol'shoj mashine, vam nuzhno vyyasnit', kakie porty v vashej sisteme podsoedineny k modemu i vneshnej linii. Esli vy administrator, to vy dolzhny znat', kak skonfigurirovat' eti linii. Nachinat' nuzhno s fajla /usr/lib/uucp/L-devices. |to osnovnoj fajl, opredelyayushchij, kakie porty ispol'zuyutsya i kakim obrazom oni ispol'zuyutsya. Vot primer raspechatki s informaciej o portah: --------------------- | | ACU cul0 cua0 1200 | DIR tty00 0 300 | DIR tty00 0 1200 | DIR tty00 0 2400 | DIR tty00 0 4800 | DIR tty00 0 9600 | V fajle L-devices kazhdyj port opredelyaetsya libo kak pryamoe podklyuchenie (DIR - direct connection), libo kak special'noe ustrojstvo, nazyvaemoe ustrojstvom avtomaticheskogo vyzova (ACU - automatic call unit). Ob ustrojstvah vyzova my pogovorim pozzhe. Sejchas nam nuzhno rassmotret' tol'ko zapisi tipa DIR. Programma cu ispol'zuet zapisi tipa pryamogo podklyucheniya, a uucp - tipa ACU. Teper' ochen' prosto identificirovat' kazhdyj posledovatel'nyj port: kak k nemu obrashchat'sya, na kakoj skorosti on rabotaet i mozhem li my osushchestvit' vyzov cherez etot port. Dannye fajla L-devices pokazyvayut, naprimer, chto posledovatel'nyj port tty00 ispol'zuetsya kak liniya pryamogo vyzova. Vam razreshaetsya ispol'zovat' dlya vyzova cherez etot port skorosti ot 300 do 9600 bod. |to polnyj diapazon ispol'zuemyh obychno skorostej obmena, prichem bolee vysokie skorosti primenyayutsya dlya pryamogo podklyucheniya k drugim mashinam, a ne k modemu. A kak naschet modemnyh linij, kotorye VHODYAT v mashinu? Dlya togo chtoby ih najti, nuzhno posmotret' katalog /etc. Tam dva fajla dialin i dialup opredelyayut, na kakih liniyah tty primenyaetsya vtorichnaya registracionnaya parol'naya posledovatel'nost' dlya udalennyh pol'zovatelej. |ti linii tty prednaznacheny tol'ko dlya obrashcheniya izvne v dannuyu sistemu i obychno ne mogut byt' ispol'zovany dlya dostupa iz etoj sistemy vo vneshnij mir.

    ISPOLXZOVANIE I KONFIGURIROVANIE LINII

Teper', kogda my znaem, po kakoj linii osushchestvit' vyzov, nam neobhodima komanda vyzova. V poslednih versiyah System V utilita cu bolee razvita, chem v predydushchih versiyah. Nam, kak pravilo, ne nuzhny osobo moshchnye vozmozhnosti, poetomu nashi komandnye stroki dovol'no prosty i smogut rabotat' prakticheski s lyubym variantom programmy cu. K osnovnym vozmozhnostyam, kotorye my imeem, otnosyatsya: vybor nomera linii (t.e. ustrojstva tty), skorosti funkcionirovaniya i podklyuchat'sya li k ustrojstvu napryamuyu dlya ruchnogo nabora nomera libo zhe nabirat' nomer avtomaticheski. Samyj prostoj sposob - chtoby nomer nabirala programma cu, no esli eto nevozmozhno, to vy dolzhny podklyuchit'sya neposredstvenno k modemu. Sleduyushchij primer pokazyvaet, kak neposredstvenno podklyuchit'sya k ustrojstvu i vruchnuyu upravlyat' modemom s cel'yu nabora nomera. V dannom sluchae ispol'zuetsya dovol'no shiroko rasprostranennyj modem Hayes 1200 Smartmodem. Esli u vas modem, kotoryj ne yavlyaetsya "Hayes-sovmestimym", to vy dolzhny najti ekvivalentnye upravlyayushchie posledovatel'nosti v vashej dokumentacii. $ cu -ltty00 dir # Poluchit' pryamoj dostup k terminal'noj # linii so skorost'yu 1200 bod Connected # Otzyv programmy cu ATdt555-1212 # Vnimanie modemu, ustanovka svyazi putem # nabora sleduyushchego nomera CONNECT # Modem podtverzhdaet fakt podklyucheniya # Otpravka vozvrata karetki v sistemu-adresat Welcome to Micro BBS # Poluchenie privetstviya ot mikro-|VM . . vypolnenie seansa raboty s udalennoj sistemoj . . exit # Vyjti iz mikro-sistemy ILI, +++ # esli vy etogo ne hotite, vremenno # vyjti iz modemnogo podklyucheniya # (po komande escape, a ne exit) OK # Otvet modema na vremennyj vyhod ATh0 # Poprosit' modem zanyat' telefon OK # Otvet modema ~. # Zavershit' rabotu s cu Dlya togo chtoby ukazat' programme cu avtomaticheskij nabor nomera, ispol'zujte drugoj sintaksis v komandnoj stroke. My primenyaem ustrojstvo avtomaticheskogo vyzova ACU dlya togo, chtoby sdelat' vyzov. Fakticheskaya komanda nabora nomera generiruetsya programmoj /usr/lib/uucp/dial. Primer vyzova vyglyadit tak: $ cu -acua0 555-1212

    IZMENENIE SKOROSTEJ OBMENA

Modemy tipa Smartmodem mogut rabotat' so skorostyami 300 i 1200 bod. Po umolchaniyu, programma cu podklyuchaetsya k posledovatel'nomu portu na skorosti 1200 bod. Esli vy podklyuchaetes' s ispol'zovaniem umolchanij, prover'te skorost', vremenno vyjdya iz programmy cu (po komande escape, a ne exit), i primeniv komandu stty, kotoraya otobrazhaet skorost' obmena: ~!stty < /dev/tty00 |ta komanda dolzhna soobshchit' obychnye ustanovki stty dlya posledovatel'nogo porta /dev/tty00. Skorost' obmena dolzhna ravnyat'sya 1200. Modemy tipa Smartmodem avtomaticheski ponizhayut skorost' do 300 bod pri otvete po telefonu. Pri vyzove vy mozhete ponizit' skorost' modema do 300 bod dvumya razlichnymi sposobami. Pervyj sposob - zastavit' cu otkryt' liniyu so skorost'yu 300 bod, ukazav 300 v komandnoj stroke programmy cu. Zametim, chto kogda vy primenyaete al'ternativnuyu skorost' (otlichnuyu ot 1200 bod), zapis' o skorosti obmena DOLZHNA prisutstvovat' v fajle L-devices I v komandnoj stroke cu, kak v sleduyushchem primere: $ cu -ltty00 -s300 dir Vtoroj metod hitree, no zato predostavlyaet bol'she gibkosti. My mozhem vyzvat' cu so znacheniem po umolchaniyu 1200, zatem vremenno (po komande escape) vyjti iz cu i vyzvat' programmu stty, chtoby ukazat' skorost' obmena posledovatel'nogo porta ravnoj 300 bodam. |to nuzhno sdelat' posle togo, kak vy obratilis' k linii s pomoshch'yu cu. |ta izmenennaya skorost' obmena dejstvitel'na do teh por, poka vy ne zakroete liniyu (t.e. okonchatel'no vyjdete iz cu po komande exit). V etot moment port inicializiruetsya zanovo. Naprimer: $ cu -ltty00 dir # Zahvatit' liniyu na 1200 bod Connected # Otzyv programmy cu ~!stty 300 < /dev/tty00 # Vremenno vyjti iz cu i # ustanovit' dlya linii tty # skorost' 300 bod Otmetim, chto etot metod NE trebuet nalichiya zapisi o skorosti 300 bod v fajle L-devices, poskol'ku my rabotaem s posledovatel'nym portom vne oblasti dejstviya programmy cu. Poputno zametim, chto vremennyj vyhod (po komande escape) iz cu sovershenno analogichen vremennomu vyhodu iz lyuboj komandy sistemy UNIX. Vy mozhete vremenno vyjti dlya zapuska opredelennoj komandy, naprimer: ~!echo "you can run any command here" Vy mozhete takzhe perejti v shell i rabotat' tak, kak vy vsegda rabotaete: ~!sh Vy dolzhny, odnako, pomnit', chto vy vse eshche podklyucheny s pomoshch'yu programmy cu k posledovatel'nomu portu, a telefon po-prezhnemu podsoedinen k udalennoj sisteme do teh por, poka vy ne dadite vruchnuyu komandu vyhoda ili otklyucheniya telefona, ili poka udalennaya sistema ne otklyuchit telefon po tajm-autu.

    ZAHVAT DANNYH

Teper' my umeem najti modem, podklyuchit'sya k posledovatel'noj linii i ustanovit' svyaz' s drugoj sistemoj. Esli my vyzyvaem dosku ob座avlenij, nam mozhet ponadobit'sya zahvatyvat' fajly s cel'yu posleduyushchego ispol'zovaniya. Programma cu ne predostavlyaet takoj vozmozhnosti. Kak my uzhe otmechali, mikro-|VM delayut eto obychno pri pomoshchi RAM-bufera, kotoryj sohranyaetsya na diske, kogda on zapolnyaetsya. A UNIX ne mozhet dejstvovat' takim obrazom. Prostejshij sposob, pridumannyj mnoyu dlya zahvata dannyh iz drugoj sistemy - propustit' po konvejeru vse, chto vydaetsya na terminal, cherez komandu tee sistemy UNIX. Ves' vvod s vashej klaviatury ne perehvatyvaetsya, a vse, chto idet na standartnoe ustrojstvo vyvoda (stdout) popadaet v vyhodnoj fajl utility tee. |to vyglyadit tak: cu -ltty00 dir | tee fajl_perehvata Odno iz posledstvij perehvata informacii takim metodom sostoit v tom, chto vse simvoly vozvrata karetki, pechataemye iz udalennoj sistemy, popadayut v vyvodnoj fajl komandy tee. Vy obnaruzhivaete ih v vide "^M" v konce kazhdoj stroki fajla. Izbavit'sya ot vseh etih vozvratov karetki legko, poprobujte vypolnit' takuyu posledovatel'nost' komand redaktora ed: ed fajl_perehvata 1,$s/^M//g w q Smysl etih komand sleduyushchij. Dlya kazhdoj stroki vo vsem fajle (1, $) zamenit' vozvrat karetki (^M) na nichego (//). Sdelat' eto dlya proizvol'nogo kolichestva simvolov vozvrata karetki v otdel'noj stroke ("g" oznachaet global'nuyu zamenu v stroke). Vy mozhete prevratit' control-M v zamenyaemuyu stroku libo vvodom simvola obratnoj kosoj cherty (\) i nastoyashchim nazhatiem na klavishu vozvrata karetki, libo v redaktore vi ispol'zovat' prefiks control-V dlya razresheniya vvoda upravlyayushchih simvolov. Posle redaktirovaniya zapishite fajl i vyjdite iz redaktora ed. Konechno, vse eto vy mozhete dlya udobstva oformit' v vide komandnogo fajla interpretatora shell.

    INSTRUMENTALXNYE SREDSTVA DLYA KOMMUNIKACIONNYH LINIJ

Dve utility, kotorye my zdes' predlagaem, svyazany s dostupom k posledovatel'nomu portu. Kogda liniya osvobozhdaetsya, vy srazu zhe uznaete ob etom i mozhete upravlyat' liniej s pomoshch'yu neskol'kih nazhatij klavish. -------------------------------------------------------- IMYA: cuchk -------------------------------------------------------- cuchk Cu check - proverka svobodnoj linii dlya cu

    NAZNACHENIE

Oprashivaet tablicu sostoyaniya processov i ishchet processy cu. Kogda oni zavershayutsya, na vash ekran vydaetsya soobshchenie i programma prekrashchaet rabotu.

    FORMAT VYZOVA

cuchk - Soobshchit', kogda cu osvobodit liniyu

    PRIMER VYZOVA

cuchk

    TEKST PROGRAMMY

1 : 2 # @(#) cuchk v1.0 Check for a free cu line Author: Russ Sage Proverka svobodnoj linii dlya cu 4 if [ "$#" -gt "0" ] 5 then echo "cuchk: too many arguments" >&2 6 echo "usage: cuchk" >&2 7 exit 1 8 fi 10 while : 11 do 12 ps -e | fgrep cu > /dev/null \ 13 && sleep 5 14 || { echo "\ncu is free"; exit; } 15 done & OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL cuchk? Pohozhe, chto bol'shinstvo sistem UNIX skupy na posledovatel'nye porty. |to stanovitsya vazhnym momentom, kogda imeetsya tol'ko odin vyvodnoj port dlya shesti ili semi chelovek. Opyt pokazyvaet, chto esli vy ne poluchite dostup k portu srazu, to vam prijdetsya zhdat' snova i snova i vy ne budete znat', kak dolgo sobiraetsya tekushchij pol'zovatel' zanimat' opredelennyj port. Vmesto togo chtoby teryat' vremya na postoyannuyu proverku zanyatosti porta, pochemu by ne poruchit' mashine soobshchit' vam, kogda etot port osvoboditsya? CHTO DELAET cuchk? Pri vyzove programmy cuchk ona zapuskaetsya v fonovom rezhime. Ona upravlyaetsya beskonechnym ciklom, obespechivayushchim ee rabotosposobnost'. Programma cuchk nablyudaet za sistemoj, vedya poisk sredi vseh aktivnyh processov. Esli ona obnaruzhivaet process cu (kotoryj mozhet rabotat' s interesuyushchim nas portom, a mozhet i net), ona zasypaet na 5 sekund i snova vedet poisk. Esli net processov cu, funkcioniruyushchih na mashine, ona vydaet soobshchenie "cu is free" ("cu svobodna") i zavershaetsya. Takim obrazom, my ne obyazany vruchnuyu sledit' za rabotoj cuchk, ona sama zapuskaetsya i sama zavershaetsya. |to imeet smysl, poskol'ku vsya cennost' etoj utility svelas' by na net, esli by ee samu nuzhno bylo periodicheski proveryat'!

    POYASNENIYA

V strokah 4-8 vypolnyaetsya proverka na oshibki. Poskol'ku cuchk ne imeet nikakih opcij, v komandnoj stroke ne dolzhno byt' nikakih parametrov. Esli parametry prisutstvuyut, eto schitaetsya oshibkoj. Stroki 10-15 organizuyut vechnyj cikl while. Obratite vnimanie, chto ampersand v stroke 15 avtomaticheski zapuskaet cuchk v fonovom rezhime, ved' net nikakogo rezona vypolnyat' etu programmu v prioritetnom rezhime. V stroke 12 vypolnyaetsya komanda "ps -e", kotoraya vydaet informaciyu o sostoyanii vseh znachitel'nyh pol'zovatel'skih processov. |ti dannye propuskayutsya po konvejeru cherez fgrep. Utilita fgrep ishchet nalichie simvolov "cu". My nadeemsya, chto eti simvoly sootvetstvuyut tol'ko processam cu, kotorye my ishchem. Oni mogut, odnako, otnosit'sya k chemu-to sovershenno neozhidannomu, naprimer "picuser" ili k kakomu-to analogichno postroennomu imeni. Rezul'tat raboty komandy fgrep napravlyaetsya na ustrojstvo /dev/null, chtoby izbavit'sya ot lishnej informacii. Nas interesuet tol'ko status zaversheniya komandy fgrep. On soobshchaet nam, najdeno li vhozhdenie simvolov "cu" ili net. V konce stroki 12 prisutstvuet simvol obratnoj kosoj cherty, ukazyvayushchij interpretatoru shell, chto sleduyushchaya fizicheskaya strochka yavlyaetsya na samom dele chast'yu toj zhe samoj programmnoj stroki i chto nuzhno dobavit' ee k stroke 12, a ne vypolnyat' samostoyatel'no. Razbienie dlinnyh strok na neskol'ko men'shih strok s pomoshch'yu simvolov obratnoj kosoj cherty pozvolyaet nam poluchat' krasivo oformlennyj, bolee naglyadnyj ishodnyj kod. Stroka 13 vypolnyaetsya v tom sluchae, esli fgrep otrabotala uspeshno (t.e. esli ona vydaet nulevoj status zaversheniya). |to oznachaet, chto simvoly "cu" najdeny, a znachit process cu rabotaet i v nastoyashchee vremya ne dostupen. Poetomu process cuchk zasypaet na 5 sekund. Kogda on probuzhdaetsya, vypolnenie prodolzhaetsya so stroki 10, vozobnovlyaetsya vechnyj cikl i proverka processov prodolzhaetsya. Esli fgrep ne nahodit simvoly "cu" (vozvrashchaetsya nenulevoj status zaversheniya), to vypolnyaetsya stroka 14, kotoraya vydaet soobshchenie o tom, chto programma cu svobodna, i rabota programmy zavershaetsya. Takim obrazom, my srazu zhe znaem, chto liniya cu otkryta dlya ispol'zovaniya, poetomu my mozhem poskoree zanyat' ee. ---------------------------------------------------- IMYA: talk ---------------------------------------------------- talk Obrashchenie k posledovatel'nomu portu

    NAZNACHENIE

Vypolnyaet komandnuyu stroku, podgotavlivayushchuyu posledovatel'nyj port dlya obshcheniya s drugoj sistemoj.

    FORMAT VYZOVA

talk [-bBAUD] [-l] [-tTTY] [-u] Opcii: -b ustanovit' novuyu skorost' obmena -l protokolirovat' vse postupayushchie dannye -t ispol'zovat' drugoj port tty -u ispol'zovat' prinyatuyu v UNIX skorost' obmena 9600

    PRIMER VYZOVA

talk -b300 -t01 -l Obratit'sya k posledovatel'nomu portu tty01 na skorosti 300 bod i protokolirovat' vyvodnye dannye v tekstovyj fajl.

    TEKST PROGRAMMY

1 : 2 # @(#) talk v1.0 Talk to the serial port Author: Russ Sage Obrashchenie k posledovatel'nomu portu 4 BAUD="1200" 5 TTY="tty11" 6 PIPE="" 8 for ARG in $@ 9 do 10 case $ARG in 11 -b*) BAUD="`echo $ARG|cut -c3-`";; 12 -l) echo "logging in /tmp/talk.$$" 13 PIPE="| tee /tmp/talk.$$";; 14 -t*) TTY="tty`echo $ARG|cut -c3-`";; 15 -u) BAUD="9600";; 16 *) echo "talk: invalid argument $ARG" >&2 17 echo "usage: talk [-bBAUD] [-l] [-tTTY] [-u]" >&2 18 echo " -b baud rate" >&2 19 echo " -l log the output" >&2 20 echo " -t use another tty" >&2 21 echo " -u 9600 baud to UNIX" >&2 22 exit 1;; 23 esac 24 done 26 eval cu -s$BAUD -l$TTY dir $PIPE

    PEREMENNYE SREDY VYPOLNENIYA

ARG Argument iz komandnoj stroki BAUD Skorost' obmena, kotoruyu nuzhno ukazat' programme cu PIPE Soderzhit stroku, sozdayushchuyu konvejer dlya zahvata dannyh TTY Nomer ispol'zuemogo porta tty OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL talk? Registraciya v udalennoj sisteme rasshiryaet gorizonty vashih vychislitel'nyh vozmozhnostej. Uchityvaya, chto UNIX stanovitsya vse bolee rasprostranennoj sistemoj sredi mikro-|VM, sistemy UNIX, prigodnye dlya svyazi, skoro budut vezde. Krome togo, vy mozhete vyzvat' iz vashej sistemy UNIX mnogo sistem tipa dosok ob座avlenij, funkcioniruyushchih na mikro-|VM. Nam nuzhen horoshij interfejs dlya upravleniya modemnoj liniej i oblegcheniya ee ispol'zovaniya. Nam neobhodimo zahvatyvat' dannye, esli eto vozmozhno, izmenyat' skorost' obmena i menyat' terminal'nyj port, esli v etom est' potrebnost'. Vse eto delaet komandnyj fajl talk. CHTO DELAET talk? Programma talk generiruet komandnuyu stroku, osnovannuyu na podrazumevaemoj konfiguracii. |ta konfiguraciya takova: 1200 bod, podklyuchenie k terminal'noj linii /dev/tty11 (posledovatel'nyj port 1 v sisteme SCO XENIX), zahvat dannyh ne proizvodit'. Vse podrazumevaemye parametry mozhno izmenit' v tekste ishodnogo fajla, a terminal'naya liniya dolzhna byt' ustanovlena s uchetom specifiki vashej sistemy. Esli vy hotite izmenit' skorost' obmena, ukazhite s pomoshch'yu opcii -b nuzhnuyu vam skorost' (podrazumevaetsya, chto eto odna iz standartnyh skorostej, podderzhivaemyh programmoj cu). Naprimer,"talk -b2400" ustanavlivaet skorost' 2400 bod. Ukazannaya skorost' peredaetsya komande cu, kotoraya neposredstvenno izmenyaet harakteristiki vashego podklyucheniya. Vazhno imet' v vidu, chto eta skorost' dolzhna byt' opredelena v fajle L-devices. Esli vy hotite zahvatit' vse dannye, vyvodimye na vash ekran, vklyuchite opciyu protokolirovaniya, ukazav -l. Fajl s zahvachennymi dannymi budet nazyvat'sya /tmp/talk.$$, gde $$ - unikal'nyj identifikatora processa vashego tekushchego interpretatora shell. |to imya vydaetsya na ekran pri vyzove dannoj opcii, tak chto vy uvidite ego na vashem ekrane. Unikal'nost' imen fajlov obespechivaetsya dlya togo, chtoby vy ne poteryali po nedosmotru registracionnye fajly ot predydushchih seansov raboty (ili chtoby, po krajnej mere, bylo ochen' malo shansov, chto eto proizojdet). Esli u vas fakul'tativnyj posledovatel'nyj port s modemom ili esli vy hotite podklyuchat'sya k lyuboj iz vozmozhnyh linij, primenite opciyu -t. Vmeste s etoj opciej ukazhite nomer tty, kotoryj budet zatem peredan v komandu cu. |to ochen' poleznaya opciya, esli u vas mnogo razlichnyh linij dlya ispol'zovaniya cu. Esli vy ne ispol'zuete vash posledovatel'nyj port dlya podklyucheniya modema, a imeete pryamoe podsoedinenie k drugoj sisteme UNIX, opciya -u totchas zhe ustanovit skorost' obmena 9600 bod. Zametim, chto togo zhe effekta mozhno bylo by dostich', ukazav -b9600, no opciyu -u proshche vvodit' i zapominat'.

    PRIMERY

1. $ talk -l -t12 Podklyuchit'sya k dopolnitel'nomu posledovatel'nomu portu i zahvatyvat' dannye, kotorye prohodyat na ekrane. 2. $ talk -u Podklyuchit'sya k osnovnomu posledovatel'nomu portu s ispol'zovaniem skorosti 9600 bod. Ne vklyuchat' zahvat dannyh. 3. $ talk -b2400 -t04 -u Vnimanie! Snachala opciya -b ustanavlivaet skorost' 2400, no dalee sleduet opciya -u, kotoraya pereustanavlivaet znachenie skorosti na 9600. 4. $ talk -u -l -b4800 Snova bud'te vnimatel'ny! Snachala liniya podklyuchaetsya napryamuyu so skorost'yu 9600 bod. Zatem vklyuchaetsya protokolirovanie. Nakonec, znachenie skorosti menyaetsya s 9600 na 4800. Esli na samom dele liniya, k kotoroj vy obrashchaetes', rabotaet na skorosti 9600 bod, vy dolzhny, esli eto vozmozhno, ponizit' skorost', nazhimaya ~%b dlya generacii signala break.

    POYASNENIYA

V strokah 4-6 ustanavlivayutsya dejstviya, vypolnyaemye programmoj talk po umolchaniyu. |ti dejstviya mozhno polnost'yu izmenit' putem redaktirovaniya ishodnogo fajla. Glavnoe dostoinstvo etih umolchanij v tom, chto esli takuyu konfiguraciyu vy ispol'zuete chashche vsego, to vam dostatochno prosto vvesti "talk", bez vsyakih opcij. Stroka 4 inicializiruet peremennuyu BAUD znacheniem 1200, eto znachenie po umolchanie dlya skorosti modema. Stroka 5 prisvaivaet peremennoj TTY znachenie tty11, chto sootvetstvuet pervomu posledovatel'nomu portu apparatury. Obychno nuzhno tty00, no SCO XENIX imeet virtual'nuyu konsol', prichem tty02-tty10 yavlyayutsya otdel'nymi ekranami, dostup k kotorym osushchestvlyaetsya s odnogo konsol'nogo ustrojstva. Esli eto ne tak v vashej sisteme, ukazhite zdes' pravil'noe znachenie TTY. V stroke 6 peremennaya PIPE inicializiruetsya pustoj strokoj, tak kak konvejer primenyaetsya dlya protokolirovaniya dannyh, a po umolchaniyu zahvat dannyh ne vypolnyaetsya. Stroki 8-24 predstavlyayut soboj cikl, kotoryj perebiraet vse argumenty komandnoj stroki. V strokah 10-23 ispol'zuetsya operator vybora sredi opcij dlya vypolneniya trebuemyh funkcij. Stroka 11 proveryaet, nachinaetsya li dannaya opciya s simvolov -b, posle kotoryh sleduet chto-to eshche. Esli da, to simvoly, sleduyushchie posle -b, vyrezayutsya i zanosyatsya v peremennuyu BAUD. Obratite vnimanie, chto imenno poetomu vy dolzhny nabirat' "-b2400", a ne "-b 2400". V stroke 12 proveryaetsya, hotite li vy vklyuchit' protokolirovanie. Esli da, to na ekran vyvoditsya imya protokol'nogo fajla, a peremennaya PIPE ustanavlivaetsya tak, chtoby napravit' standartnyj vyvod po konvejeru programme tee sistemy UNIX. Programma tee - eto universal'naya konvejernaya programma rasshchepleniya, kotoruyu mozhno ispol'zovat' dlya posylki kopii potoka dannyh v opredelennyj punkt naznacheniya, ne vozdejstvuya na osnovnoj konvejer. V dannom sluchae my primenyaem programmu tee dlya posylki dannyh, prohodyashchih cherez posledovatel'nyj port, na ekran i v nash registracionnyj fajl /tmp/talk/.$$. (Esli vy predstavite sebe vodyanuyu trubu s T-obraznym stykom, to pojmete, chto proishodit.) Stroka 14 proveryaet, nachinaetsya li opciya s -t. Esli eto tak, to vyrezaetsya nomer terminala. Zdes' mozhno peredat' lyuboe znachenie tty, no ne zabyvajte, chto etot nomer tty dolzhen takzhe prisutstvovat' v fajle /usr/lib/uucp/L-devices. Blagodarya etomu fajlu, programma cu znaet, chto terminal'noe ustrojstvo podklyucheno k razreshennomu portu. V stroke 15 proveryaetsya, sobiraetes' li vy podklyuchat'sya k sisteme UNIX napryamuyu. Esli da, skorost' obmena avtomaticheski ustanavlivaetsya na 9600 bod v celyah povysheniya propusknoj sposobnosti terminala. Stroki 16-22 vypolnyayut proverku oshibok. Esli kakaya-libo opciya, peredannaya v komandnoj stroke, ne sootvetstvuet nikakomu iz predydushchih obrazcov operatora case, etot fakt fiksiruetsya zdes', vydayutsya soobshcheniya ob oshibkah i komandnyj fajl zavershaetsya. Stroka 26 - eto volshebnaya stroka. Poskol'ku vse shell-peremennye poluchili svoi znacheniya, my mozhem ispol'zovat' ih v komandnoj stroke, chtoby podstavit' v nee neobhodimye znacheniya. Snachala primenyaetsya komanda eval. Ona raskryvaet vse imena peremennyh, zamenyaya ih na sootvetstvuyushchie znacheniya. V dannom sluchae my formiruem polnuyu komandnuyu stroku utility cu: skorost' beretsya iz peremennoj BAUD, liniya iz TTY, a podsoedinenie pryamoe. Esli my ne vedem protokolirovanie dannyh, znachenie PIPE nulevoe i ono budet otbrosheno pri sintaksicheskom razbore. Esli zhe peremennaya PIPE soderzhit komandu dlya otpravki dannyh v protokol'nyj fajl, komanda eval obespechivaet eto, organizovyvaya takoj konvejer, kak my ukazali. DOSTUP IZ UNIX V UNIX Teper' davajte rassmotrim polnovesnoe obshchenie dvuh sistem UNIX. Imeetsya oblast', v kotoroj UNIX operedila svoe vremya. Sistema uucp pozvolyaet svyazat' neskol'ko mashin voedino i sozdat' to, chto v nekotoryh otnosheniyah yavlyaetsya virtual'nym okruzheniem, pozvolyayushchim vam rabotat' na lyuboj mashine. Funkcionirovanie takoj seti osnovano na udalennoj registracii v sisteme (cu(1)), distancionnom vypolnenii komand (uux(1)), elektronnoj pochte (mail(1)), peredache fajlov (uucp(1), uucico(1)) i opoznavanii uzla sistemy (uname(1) i uuname(1)). Poskol'ku my zanimaemsya realizaciej kommunikacij tipa UNIX-UNIX, davajte rassmotrim nekotorye sposoby fizicheskogo soedineniya UNIX-mashin v odnu rabochuyu sredu. SVYAZYVANIE UNIX-MASHIN V rabochej obstanovke mashinnye konfiguracii postoyanno menyayutsya v celyah testirovaniya, iz-za apparatnyh izmenenij, perestanovok i pereezdov i t.d. Planirovat' konfiguraciyu vashih mashin nuzhno tak, chtoby ona byla maksimal'no gibkoj, eto pomozhet izbezhat' haosa i razlada. Vashi potrebnosti vliyayut na to, kak vy soedinite razlichnye UNIX-mashiny. Esli imeetsya blok opredeleniya prioritetnogo zaprosa k portu (port contender), vam prihoditsya imet' s nim delo. Odni linii mogut byt' podsoedineny napryamuyu, drugie napryamuyu cherez blok oprede- leniya prioritetnogo zaprosa k portu, tret'i cherez modemnye kommutato- ry. Dlya togo chtoby nauchit'sya imet' delo so vsemi etimi vozmozhnostyami, poprobuem predstavit' eti konfiguracii v graficheskom vide. Pervyj tip podklyucheniya - pryamoe podklyuchenie (sm. ris. 8-7). Sleva pokazana vyzyvayushchaya sistema, sprava vyzyvaemaya. Vyzyvayushchaya sistema ispol'zuet posledovatel'nyj port dlya vyvoda, poetomu na etom portu ne dolzhno byt' processa getty. Iniciiruyushchaya komanda "cu -ltty00 -s9600 dir" obespechivaet podklyuchenie k posledovatel'nomu portu tty00 na ochen' vysokoj skorosti obmena. Pryamye podsoedineniya mogut podderzhivat' takuyu skorost'. Sam kabel' dolzhen byt' vypolnen v vide nulevogo modema (rassmotrennogo ranee v dannoj glave). V vyzyvaemoj sisteme zadejstvovany processy getty, rabotayushchie so skorost'yu 9600 bod na vhodyashchej terminal'noj linii. Kogda pol'zovatel' vvodit registracionnoe imya, getty vypolnyaet process login, zaprashivayushchij parol', i esli etot parol' vernyj, zapuskaetsya shell. Ris. 8-7. Pryamoe podklyuchenie odnoj sistemy UNIX k drugoj ------------------------------------------------------------------- DTE-1 DTE-2 +---------+ +---------+ | | | | | UNIX 1 | | UNIX 2 | | | Nulevoj modem | | | tty00 |-------------------->| tty00 | | | | | | | | | +---------+ +---------+ DEJSTVIYA DEJSTVIYA 1. Net getty 1. getty 9600 tty00 cu -ltty00 -s9600 dir login imya_pol'zovatelya sh 2. uucp fajl 2. getty 9600 tty00 unix 2!~/user login uucp uucico ------------------------------------------------------------------- Pri ispol'zovanii uucp proishodyat analogichnye veshchi. Komanda uucp generiruet process uucico, iniciiruyushchij vyzov sistemy, pokazannoj sprava. Registracionnaya posledovatel'nost' ta zhe samaya, za isklyucheniem togo, chto vmesto zapuska interpretatora shell v konce etoj posledovatel'nosti dejstvij zapuskaetsya eshche odin process uucico, kotoryj obshchaetsya s vyzyvayushchim processom. Sleduyushchaya konfiguraciya - pryamoe podklyuchenie cherez selektor porta - pokazana na ris. 8-8. Zdes' tozhe kabel', idushchij ot DTE-1 k selektoru porta, dolzhen byt' nulevym modemom. Ris. 8-8. Pryamoe podklyuchenie cherez selektor porta ------------------------------------------------------------------- +---------+ +----------+ +---------+ | | | | | | | UNIX 1 | | | | UNIX 2 | | | Nulevoj | Selektor | Pryamoj | | | tty00 |--------->| porta |-------->| tty00 | | | modem | | kabel' | | | | | | | | +---------+ +----------+ +---------+ DEJSTVIYA DEJSTVIYA 1. cu -ltty00 -s9600 dir 1. getty tty00 9600 login imya_pol'zovatelya sh 2. uucp fajl 2. getty 9600 tty00 unix 2!~/user login uucp uucico ------------------------------------------------------------------- Selektor porta prinimaet lyuboe kolichestvo vhodnyh linij i pereklyuchaet ih na men'shee kolichestvo fiksirovannyh vhodnyh linij komp'yutera. Takim obrazom, mozhno poluchit' dostup ko vsem terminalam, ne imeya vhodnoj linii, kotoraya chasto by pustovala, poskol'ku ona prednaznachena opredelennomu licu. Registracionnaya posledovatel'nost' v tochnosti takaya zhe, kak i dlya pryamogo podklyucheniya, krome kakih-libo dopolnitel'nyh nazhatij na klavishi, primenyaemyh dlya prohozhdeniya cherez selektor. Obychno vozvrat karetki aktiviziruet liniyu, chtoby poluchit' registracionnuyu podskazku. Poslednyaya konfiguraciya (na ris. 8-9) predstavlyaet soboj distancionnoe podklyuchenie dvuh sistem UNIX. Kazhdoe terminal'noe ustrojstvo DTE soedinyaetsya so svoim modemom pryamym kabelem. DTE-1 vyzyvaet DTE-2 libo vruchnuyu s pomoshch'yu cu, libo s pomoshch'yu utility uucp, ispol'zuyushchej uucico i programmu nabora telefonnogo nomera. Samoe bol'shoe otlichie v tom, chto eto podsoedinenie rabotaet na skorosti 1200 bod. |to znachit, chto libo DTE-2 zapuskaet 1200-bodovyj process getty, libo esli getty imeet skorost' 9600, to vam nuzhno sbrosit' ee. Dlya togo chtoby ponizit' skorost', v programme cu trebuetsya vvesti ~%b v kachestve signala break. Ili, esli vy rabotaete s pomoshch'yu uucp, mozhno pomestit' stroku BREAK v fajle L.sys, chtoby otpravit' ee v vyzvannuyu sistemu. Ris. 8-9. Distancionnoe soedinenie dvuh sistem UNIX ------------------------------------------------------------------- +---------+ +---------+ | | | | | UNIX 1 | ***** _||_ ***** | UNIX 2 | | | Pryamoj * * _||_ * * Pryamoj | | | tty00 |------->* modem *-- || --* modem *------->| tty00 | | | kabel' * * || * * kabel' | | | | ***** || ***** | | +---------+ +---------+ DEJSTVIYA DEJSTVIYA 1. cu -ltty00 -s9600 dir 1. getty 1200 tty00 login imya_pol'zovatelya sh 2. uucp fajl 2. getty 1200 tty00 unix 2!~/user login uucp uucico -------------------------------------------------------------------

    OBLASTI DLYA PEREDAVAEMYH FAJLOV

Kogda vy peresylaete fajly mezhdu mashinami, uucp priderzhivaetsya opredelennyh protokolov i standartov. Odin iz nih svyazan s tem, otkuda i kuda mogut postupat' fajly. CHtoby svesti vozmozhnuyu nerazberihu k minimumu i obespechit' opredelennuyu stepen' zashchity, sozdayutsya zashchishchennyj i publichnyj katalogi dlya hraneniya stoyashchih v ocheredi zadanij i peredannyh fajlov. Naibolee vazhen katalog /usr/spool/uucp. On soderzhit LOGFILE, chto daet vozmozhnost' s pomoshch'yu komandy "tail -f LOGFILE" zaglyanut' v operacii peredachi vo vremya ih vypolneniya. Tranzakcii uucp i mail popadayut v etot katalog. Obychno tranzakciya sostoit iz upravlyayushchego fajla (C.*) i fajla dannyh (D.*). Kogda odna mashina ispol'zuetsya v kachestve central'nogo uzla, ee katalog uucp mozhet zapolnit'sya ochen' bol'shim kolichestvom fajlov. Neobhodimo obychnoe soprovozhdenie i postoyannoe slezhenie za fajlami zanyatosti (LCK* i STST*), chtoby byt' uverennym, chto vse rabotaet pravil'no. Sleduyushchij interesnyj katalog /usr/spool/uucppublic, chashche vsego izvestnyj pod nazvaniem PUBDIR (eto shell-peremennaya). On soderzhit katalogi, nazvannye po imeni kazhdogo pol'zovatelya, chtoby hranit' fajly, prohodyashchie tranzitom s odnoj mashiny na druguyu. Bol'shinstvo katalogov imeyut vse prava dostupa, chto obespechivaet drugim pol'zovatelyam vozmozhnost' kopirovat' fajly. YA poschital poleznym sozdat' peremennuyu sredy interpretatora shell, kotoraya soderzhit marshrutnyj prefiks moego kataloga v /usr/spool/uucppublic, t.e. P=/usr/spool/uucppublic/russ. Teper' ya mogu obrashchat'sya k fajlam, vvodya $P/*. |to znachitel'no sokrashchaet vvod i uproshchaet peresylku fajlov v etot katalog i iz nego. Peremennaya PUBDIR podderzhivaetsya sintaksisom uucp. V dannom primere ispol'zuetsya sintaksis uucp: $ uucp * remote!~/user |ta komanda kopiruet kazhdyj fajl tekushchego kataloga v sistemu "remote", zatem oboznachenie ~/ prevrashchaetsya v prefiks /usr/spool/uucppublic. Esli v etoj komande user ne yavlyaetsya katalogom, kopiruemye fajly poluchayut imya user, a ne kopiruyutsya v katalog s imenem user. Vy dolzhny sami sozdat' katalog, posle chego primenit' k nemu komandu chmod 777, chtoby v nego mozhno bylo kopirovat'. Dlya spravki otmetim, chto ukazanie ^user prevrashchaetsya programmoj uucp v $HOME/user, a ^/user prevrashchaetsya uucp v $PUBDIR/user. Eshche odin sposob vvoda komandy s pomoshch'yu shell-peremennyh vyglyadit tak: $ uucp * remote!$P Takaya komanda kopiruet vse fajly v moj katalog PUBDIR. Esli ya zaregistrirovalsya v etoj sisteme, ya mogu vvesti: $ ls -al $P ili $ cd $P $ ls -al dlya togo, chtoby uvidet' vse skopirovannye fajly. Odin iz momentov, za kotorym vy dolzhny sledit',- razrushitel'nye komandnye fajly tipa "uuclean". |ti programmy obychno zapuskayutsya processom cron ili nekotorymi drugimi fonovymi programmami. Oni prohodyat po vsem oblastyam sistemy, svyazannym s uucp, nahodyat fajly, k kotorym ne bylo obrashchenij opredelennyj period vremeni, i udalyayut ih. |to mozhet byt' katastroficheskim, esli vy ispol'zuete PUBDIR v kachestve vremennoj oblasti hraneniya. Vot kak mozhet vyglyadet' odna iz takih "ochishchayushchih" operacij: PATH=/usr/bin:/bin export PATH cd /usr/spool/uucp find C. D. TM. X. XTMP -type f -mtime +7 -exec rm {} \; cd /usr/spool/uucppublic find . -type f -mtime +7 -exec rm {} \; Esli v vashej sisteme rabotayut takie ochishchayushchie komandnye fajly, imeetsya neskol'ko sposobov sohraneniya fajlov ot neumyshlennogo unichtozheniya. Pervyj sposob - postoyanno obrabatyvat' vse fajly utilitoj touch, chtoby oni ne raspoznavalis' operatorom find, kotoryj ishchet starye fajly. |to mozhno sdelat' tak: $ find $P -exec touch {} \; Utilita touch obnovlyaet datu dostupa i izmeneniya fajla. Figurnye skobki oznachayut, chto nuzhno pomestit' v nih literal'noe imya, sootvetstvuyushchee operatoru find. Vam zhelatel'no oformit' eto v vide zaplanirovannogo processa, kotoryj zapuskaetsya chashche, chem programma ochistki! Drugaya strategiya - proanalizirovat' ochishchayushchuyu programmu (ili komandnyj fajl). Ona zapuskaetsya superpol'zovatelem (root)? Esli net, to komanda "chmod 000 $P" mozhet pomeshat' ej vesti poisk imen vnutri moego kataloga. Esli zhe programma ochistki zapushchena superpol'zovatelem, to, konechno, nikakie ogranicheniya prav dostupa ee ne ostanovyat. V kakoe vremya ona zapuskaetsya? Mogu li ya prikazat' ej projti mimo menya, ne zaglyadyvaya v moi fajly? CHto yavlyaetsya startovym katalogom dlya ochishchayushchego komandnogo fajla? Uglublyayas' v eti voprosy, my mozhem sobrat' mnogo informacii o tom, chto delaet etot komandnyj fajl i kakie dejstviya my mozhem predprinyat', chtoby on nam ne navredil. Mozhet pokazat'sya, chto samyj legkij sposob - prosto udalit' programmu ochistki (v predpolozhenii, chto vy imeete na eto pravo). |to, odnako, ne sposobstvuet podderzhke svobodnogo prostranstva i chistyh katalogov. K tomu zhe esli vy hotite zapretit' ochistku katalogov, kotorye ochen' vazhny dlya vas, to vy dolzhny nesti otvetstvennost' za ih soprovozhdenie.

    SETEVAYA BEZOPASNOSTX

Katalog uucppublic, kak my uzhe videli, soderzhit fajly, peredavaemye tranzitom mezhdu sistemami. Obychno vse podkatalogi v uucppublic imeyut rezhim dostupa rwxrwxrwx. |to srazu zhe porozhdaet problemu zashchity, ved' kto ugodno mozhet sozdat', razrushit' ili izmenit' fajly v etih katalogah. Takie prava dostupa dolzhny soblyudat'sya dlya lyubogo kataloga, kotoryj yavlyaetsya istochnikom ili adresatom dlya fajlov, peredavaemyh s pomoshch'yu uucp. Uucp trebuet, chtoby vse promezhutochnye katalogi imeli razreshenie na chtenie i zapis' dlya vseh pol'zovatelej. Esli uucp beret iz kataloga ishodnye fajly, dolzhny byt' obespecheny prava na chtenie. Esli zhe uucp zapisyvaet fajly v etot katalog, nuzhny prava na zapis' v katalog-adresat. Esli vy hotite, chtoby fajly uucp popadali pryamo v vash registracionnyj katalog, vy dolzhny razreshit' zapis' v vash katalog dlya vseh okruzhayushchih. SHiroko otkrytyj dostup na zapis' pozvolyaet dostavlyat' fajly pryamo k vashemu porogu, no vy ne znaete, komu vy otkryvaete dveri. Esli vy zabotites' o bezopasnosti, vam ne pon PRIEMY P. mozhet zapisat' vse, chto ugodno, v vashe rabochee prostranstvo. Odno iz reshenij - razblokirovat' vash registracionnyj katalog, no zablokirovat' vse vashi podkatalogi, krome teh, kotorye nuzhny dlya uucp. Osnovnaya problema pri etom - tak ustanovit' vse prava dostupa, chtoby kazhdyj fajl obrabatyvalsya nadlezhashchim obrazom. Bolee prostoe reshenie - derzhat' vashi katalogi dlya uucp za predelami vashego registracionnogo dereva katalogov. |to izbavlyaet vas ot problemy bezopasnosti, no oznachaet, chto vy dolzhny vruchnuyu kopirovat' fajly posle ih popadaniya v katalog tuda, gde vy hotite ih fakticheski razmestit'.

    OGRANICHITELXNYE FAJLY

Kogda udalennaya sistema registriruetsya v central'noj sisteme s pomoshch'yu uucp, neskol'ko fajlov v central'noj sisteme opredelyayut, kakie vozmozhnosti imeet udalennaya sistema. |ti konfiguracionnye fajly razmeshchayutsya v kataloge /usr/lib/uucp. Pervyj iz takih fajlov nazyvaetsya L.cmds. On soderzhit imena vseh komand central'noj sistemy, kotorye mozhno vypolnit' iz udalennoj sistemy. Esli udalennaya sistema posylaet komandu posredstvom uux, to komanda vypolnyaetsya tol'ko pri uslovii, chto imya etoj komandy prisutstvuet v fajle L.cmds. Sleduyushchij fajl - USERFILE - opredelyaet, k kakim katalogam central'noj sistemy mozhet imet' dostup udalennaya sistema. Vy mozhete ogranichit' peresylki odnim katalogom ili razreshit' dostup k lyubomu fajlu sistemy. Po umolchaniyu v fajle USERFILE imeetsya takaya zapis': uucp, / chto pozvolyaet pol'zovatelyu uucp (podrazumevaemomu pol'zovatel'skomu imeni processa uucico) chitat' i pisat' fajly v lyubom meste dereva, nachinaya ot kornya i dvigayas' vniz, t.e. fakticheski vo vsej sisteme. |to otkryvaet lazejki v sisteme zashchity, naprimer: uucp central!/etc/passwd /tmp Zdes' izvlekaetsya parol'nyj fajl iz drugoj sistemy. S pomoshch'yu etogo fajla mozhno najti imena pol'zovatelej bez parolej, i drugie lyudi mogut prorvat'sya v vashu sistemu. Bolee strogij fajl USERFILE vyglyadit tak: uucp /usr/spool/uucppublic /tmp chto ogranichivaet fajlovye peresylki tol'ko ukazannymi katalogami. |to prepyatstvuet predydushchej popytke peresylki parol'nogo fajla. Poslednij fajl L.sys, veroyatno, naibolee vazhen dlya uucp s tochki zreniya sistemy zashchity. On soderzhit imena uzlov, telefonnye nomera, registracionnye imena i paroli dlya vseh udalennyh sistem, izvestnyh central'noj sisteme. Esli by kakaya-to chast' etoj informacii byla dostupna shirokoj publike, kto-nibud' smog by vypolnit' peresylku s pomoshch'yu uucp iz udalennoj sistemy i pretendovat' na rol' central'noj sistemy. Novaya sistema HoneyDanber uucp v System V koe-chto delaet dlya togo, chtoby ne davat' udalennym sistemam perehvatyvat' pochtu i peresylki dannyh putem maskirovki pod drugie udalennye sistemy. V glave 9 bolee podrobno rassmatrivayutsya voprosy bezopasnosti programmy uucp i kommunikacij voobshche. V sleduyushchem primere pokazan fajl L.sys, v kotorom opredeleny dva raznyh vida sistem: sistemy tipa pryamogo podklyucheniya i udalennye sistemy s nomeronabiratelem (dial-up systems). remote Any ACU 1200 5551212 ogin:--ogin: uucp word: uucp selector Any ACU 1200 5551213 \d--CLASS--CLASS A ogin:--ogin: uucp word: uucp direct Any tty00 9600 tty00 ogin:-@-ogin: uucp word: uucp Zapis' dlya sistemy "remote" otrazhaet, chto eto liniya s naborom nomera, mozhet byt' vyzvana proizvol'noe chislo raz ("any time"), dostupna cherez ACU (automatic call unit - avtomaticheskoe ustrojstvo vyzova) so skorost'yu 1200 bod i po nomeru 5551212. Registracionnaya posledovatel'nost' opredelena v vide registracionnogo imeni uucp i parolya uucp. Slovo "ogin" - ne opechatka. Uucp ispol'zuet podskazku "ogin:" dlya togo, chtoby otlichit' ee ot obychnoj podskazki login sistemy UNIX. Raspoznavanie shablona "ogin:" bolee nadezhno, chem ispol'zovanie "Login:" ili "login:". Ukazanie "Any" mozhno zamenit' na opredelennye intervaly vremeni, esli 24-chasovyj dostup ne razreshen. Zametim, chto oboznachenie "ACU" sootvetstvuet zapisi ACU v fajle L-devices (kak rassmotreno ranee). V sleduyushchej zapisi fajla L-devices imena cua0 i cul0 svyazany s ustrojstvom, prisoedinennym k modemu, v dannom sluchae /dev/tty00: ACU cul0 cua0 1200 |tu svyaz' mozhno proverit' s pomoshch'yu komandy "ls -li /dev/tty* /dev/cul* /dev/cua*". Sistema "selector" v nashem fajle L.sys takzhe imeet nabor nomera, tol'ko podklyuchaetsya cherez kommutator porta. Dlya obshcheniya s kommutatorom porta neobhodima dopolnitel'naya informaciya, kotoraya nachinaetsya s simvolov "\d". Polya v fajle L.sys sleduyut v takom poryadke: "ozhidanie posylka ozhidanie posylka ...". Kogda my v pervyj raz podklyuchaemsya k selektoru porta, v nashu liniyu nichego ne vyvoditsya. Prosto on tak rabotaet. Selektoru nuzhen simvol , chtoby stat' aktivnym, a pervoe pole uucp oznachaet ozhidanie. Kak nam nichego ne dozhdat'sya i poslat' vozvrat karetki? Putem ukazaniya uucp ozhidat' nevozmozhnyj simvol, naprimer control-D (\d). Uucp nikogda ne poluchit ego, poetomu po tajm-autu eta programma vydast vozvrat karetki (-). Esli slovo CLASS prihodit nazad, kogda my posylaem CR, to my otpravlyaem simvol "A", kotoryj oznachaet klass sistemnoj identifikacii, ukazannyj v dannoj zapisi. Kogda svyaz' ustanavlivaetsya, my ishchem "ogin:" v kachestve registracionnoj podskazki. Esli my ne nahodim ee, to posylaem simvoly vozvrata karetki. |to mozhet potrebovat'sya po toj prichine, chto iniciiruyushchij process getty v sisteme A mozhet byt' nastroen na 9600 bod. Togda my dolzhny budem poslat' libo simvoly vozvrata karetki, libo simvoly break, chtoby sbrosit' skorost' obmena do 1200 bod. Poslednyaya sistemnaya zapis' "direct" ne ispol'zuet ACU i telefonnyj nomer. Ona sobiraetsya obrashchat'sya k terminal'noj linii tty00 na skorosti 9600 bod, chtoby poluchit' registracionnuyu posledovatel'nost'. Zdes' net selektora porta, cherez kotoryj nuzhno projti, a est' prosto pryamaya liniya. V fajle L-devices eta liniya opisana tak: DIR tty00 0 9600

    OTLADKA KOMMUNIKACIJ

V teh sluchayah, kogda uucp rabotaet nepravil'no, mozhno vospol'zovat'sya nekotorymi hitrostyami otladki. Posledovatel'nost' dejstvij po otladke obychno prohodit po takomu ciklu: popytat'sya peredat' fajl, lokalizovat' problemu, razreshit' ee, sdelat' eshche odnu peredachu. Zdes' my rassmotrim lokalizaciyu problemy i vypolnenie eshche odnoj peresylki. Esli posle proverki i pereproverki vseh konfiguracionnyh fajlov imeyut mesto otkazy pri peredache fajlov, zapustite vruchnuyu programmu /usr/lib/uucico s nekotorymi aktivnymi otladochnymi flagami. Oni pomogut uvidet', kak proishodit rukopozhatie. Vot komandnaya stroka dlya otladochnogo rezhima: /usr/lib/uucp/uucico -r1 -x9 -ssystem_name gde r1 ukazyvaet programme uucico startovat' v vedushchem (master) rezhime, vyzyvaya system_name, a x9 ukazyvaet uroven' otladochnyh soobshchenij. Esli vy hotite poluchat' ot uucico pomen'she podrobnostej, mozhete ponizit' uroven' otladki do x4 ili drugogo znacheniya. Otladochnyj vyvod var'iruetsya v diapazone ot x1 do x9. Tipichnaya posledovatel'nost' dlya etoj komandy vyglyadit tak. Vo -pervyh, postavit' nekotorye fajly v ochered' dlya togo, chtoby napravit' ih v druguyu sistemu. Blagodarya postanovke fajlov v ochered', vy izbegaete avtomaticheskogo zapuska processa uucico. Posle togo kak fajly postavleny v ochered' i gotovy k peredache, zapustite otladochnyj rezhim i sledite za proishodyashchim. |to vyglyadit primerno tak: --------------------------------- | | $ uucp -r *.c remote!~/src | $ /usr/lib/uucp/uucico -r1 -x4 -sremote | Esli vam nuzhno tol'ko aktivizirovat' peredachu s pomoshch'yu uucp v obychnom rezhime, to proshche vsego primenit' komandu mail. Naprav'te pochtoj nekotoryj tekst pol'zovatelyu drugoj sistemy - i mehanizm uucp srazu zhe nachnet rabotu. Sleduyushchaya komanda privodit k tomu, chto etot mehanizm vyzyvaet sistemu "remote" i zapuskaet utilitu rmai(1) v drugoj sisteme, chtoby peredat' po pochte fajl "dummy" pol'zovatelyu "user": $ mail remote!user < dummy Est' komanda, kotoraya yavno vyzyvaet /usr/lib/uucp/uucico - eto komanda uusub(1M), razmeshchennaya v kataloge /usr/lib/uucp. Ona vyzyvaetsya s ukazaniem imeni sistemy, s kotoroj vy hotite svyazat'sya. Bol'shinstvo sistem imeyut takuyu komandu. Esli u vas ee net, pol'zujtes' uucico. Esli takaya komanda est', vy imeete eshche odin sposob zapuska uucico. Sintaksis vyglyadit tak: $ /usr/lib/uucp/uusub -c system Teper' kogda my znaem, kak ispol'zovat' vse eti komandy vruchnuyu, my mozhem rassmotret' nekotorye instrumental'nye sredstva, avtomatiziruyushchie bol'shuyu chast' vashej raboty s uucp. ------------------------------------------------------------- IMYA: uust ------------------------------------------------------------- uust Sostoyanie uucp i sluzhebnye dejstviya

    NAZNACHENIE

Predostavlyaet upravlyaemyj s pomoshch'yu menyu dostup ko mnogim sluzhebnym funkciyam, svyazannym s utilitoj uucp i peredachej fajlov.

    FORMAT VYZOVA

uust Opcii menyu: c - podklyuchit'sya k drugoj sisteme v otladochnom rezhime d - pokazat' fajly v vashem kataloge PUBDIR f - dlinnoformatnyj spisok fajlov v kataloge podkachki (spool directory) l - dinamicheski otobrazhat' registracionnyj fajl r - povtornoe podklyuchenie k drugoj sisteme s - dat' pol'zovatelyu svodku o tranzakciyah u - razblokirovat' vse terminal'nye linii (OSTOROZHNO: eto mozhet narushit' seans raboty) w - otobrazit' registracionnyj fajl za poslednyuyu nedelyu

    PRIMER VYZOVA

uust Dinamicheski otobrazhat' registracionnyj fajl, chtoby sledit' za tranzakciyami uucp

    TEKST PROGRAMMY

1 : 2 # @(#) uust v1.0 Uucp status utility Author: Russ Sage 4 if [ $# -gt 0 ] 5 then echo "uust: argument error" >&2 6 echo "usage: uust" >&2 7 exit 1 8 fi 10 UUNODE=`uuname -l` 11 echo " 12 UUST MENU system node: $UUNODE 13 --------- 14 c - connect with another system in debug mode 15 d - show files in your directory under PUBDIR 16 f - long list files in the spool directory 17 l - display the logfile dynamically 18 r - reconnect with another system 19 s - give user summary of transactions 20 u - unlock the tty line 21 w - display logfile for the last week 22 - exit program 24 Press c,d,f,l,r,s,u,w,or : \c" 25 read CMD 27 case $CMD in 28 "") exit 0;; 29 c) echo "\nSystem name ( to exit): \c" 30 read SYSTEM 31 if [ "$SYSTEM" = "" ] 32 then exit 0 33 fi 34 echo "\nrm /usr/spool/uucp/STST.$SYSTEM : \c" 35 rm /usr/spool/uucp/STST.$SYSTEM 2>/dev/null \ 36 && echo "" || echo "no STST files" 37 echo "\n/usr/lib/uucp/uucico -r1 -x4 -s$SYSTEM:" 38 /usr/lib/uucp/uucico -r1 -x4 -s$SYSTEM;; 39 d) echo "\n/usr/spool/uucppublic/$LOGNAME:" 40 ls -l /usr/spool/uucppublic/$LOGNAME;; 41 f) echo "\n/usr/spool/uucp:" 42 ls -l /usr/spool/uucp | more;; 43 l) echo "\n/usr/spool/uucp/LOGFILE:" 44 tail -20f /usr/spool/uucp/LOGFILE;; 45 r) echo "\nSystem name ( to exit): \c" 46 read SYSTEM 47 if [ "$SYSTEM" = "" ] 48 then exit 0 49 fi 50 echo "\nrm /usr/spool/uucp/STST.$SYSTEM : \c" 51 rm /usr/spool/uucp/STST.$SYSTEM 2>/dev/null \ 52 && echo "" || echo "no STST files" 53 echo "uusub -c$SYSTEM:" 54 if [ -f /xenix ] 55 then /usr/bin/uusub -c$SYSTEM 56 else /usr/lib/uucp/uusub -c$SYSTEM 57 fi 58 tail -20f /usr/spool/uucp/LOGFILE;; 59 s) echo "\nuulog -u$LOGNAME:" 60 uulog -un$LOGNAME | more;; 61 u) echo \\nrm /usr/spool/uucp/LCK* : 62 rm /usr/spool/uucp/LCK* 2>/dev/null || echo "no lock files";; 63 w) echo "\n/usr/spool/uucp/Log-WEEK:" 64 more /usr/spool/uucp/Log-WEEK;; 65 *) echo "uust: invalid argument '$CMD'" >&2;; 66 esac

    PEREMENNYE SREDY VYPOLNENIYA

CMD Soderzhit simvol vhodnoj komandy, postupivshij iz standartnogo vvoda LOGNAME Soderzhit vashe registracionnoe imya SYSTEM Uzlovoe imya uucp toj sistemy, v kotoruyu vy obrashchaetes' UUNODE Uzlovoe imya uucp lokal'noj sistemy OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL uust? Mnogie oblasti sistemy UNIX yavlyayutsya fakticheski samostoyatel'nymi podsistemami. Uucp odna iz nih. Ona ispol'zuet konfiguracionnye fajly, fajly podkachki (spool files), fajly blokirovki (lock files) i imeet mnogo ispolnyaemyh modulej, obrazuyushchih celuyu sistemu. Esli vy intensivno ispol'zuete uucp, vy chasto zanimaetes' prosmotrom registracionnyh fajlov, ochistkoj katalogov posle avarijnyh zavershenij raboty uucp i nablyudeniem za sistemoj v celom. Esli delat' vse eto vruchnuyu, trebuetsya zapominat' katalogi, fajly, komandy, opcii. Trudno zapomnit' tak mnogo simvolov dlya vvoda komand. Uust znachitel'no sokrashchaet izderzhki i oblegchaet ispol'zovanie utility uucp. CHTO DELAET uust? Uust - eto upravlyaemyj s pomoshch'yu menyu interfejs, predostavlyayushchij osnovnye sluzhebnye funkcii, neobhodimye dlya sredy uucp. Vam nuzhno nabrat' tol'ko komandu uust, a zatem trebuemye opcii. Vpolne vozmozhno takzhe, chto vy obnaruzhite trudosberegayushchie funkcii, o kotoryh vy ne znali ran'she. Pervoe, chto pechataet dannye komandnyj fajl - eto glavnoe menyu: ------------------------- | | UUST MENU system node: russ | --------- | c - connect with another system in debug mode | d - show files in your directory under PUBDIR | f - long list files in the spool directory | l - display the logfile dynamically | r - reconnect with another system | s - give user summary of transactions | u - unlock the tty line | w - display logfile for the last week | - exit program | | Press c,d,f,l,r,s,u,w,or : Pervaya opciya 'c' prednaznachena dlya podklyucheniya linii uucp v otladochnom rezhime. |ta opciya generiruet takuyu zhe komandnuyu stroku, kak pri ruchnom sposobe zapuska processa uucico (sm. predydushchij razdel). Uust zaprashivaet u vas imya sistemy, k kotoroj vy hotite podklyuchit'sya. Sleduyushchaya opciya 'd' daet dlinnoformatnyj listing fajlov vashego kataloga, opredelyaemogo vashej peremennoj $PUBDIR, t.e. /usr/spool/uucppublic/$LOGNAME. Esli vy chasto delaete peresylki s pomoshch'yu uucp, zdes' mozhet sobrat'sya mnogo fajlov. Dannaya opciya predostavlyaet vam prostoj sposob ih prosmotra. Opciya 'f' vydaet dlinnoformatnyj listing vseh fajlov, nahodyashchihsya v kataloge podkachki. Vyhod komandy "ls -l" peredaetsya po konvejeru komande more, chto udobno pri nalichii bol'shogo kolichestva fajlov. |tot katalog yavlyaetsya serdcem ispolnyayushchej sistemy uucp. Pochti vse nahoditsya ili v etom kataloge, ili kak-to svyazano s nim. Opciya 'l', vidimo, naibolee chasto ispol'zuemaya vo vsej utilite. Ona pozvolyaet uvidet' v dinamike funkcionirovanie uucp, nablyudaya za registracionnym fajlom. Pri pervom vyzove ona pechataet poslednie 20 strok etogo fajla, a zatem vedet nablyudenie, poka ne budet ostanovlena ee rabota. Obshchee kolichestvo nazhatij na klavishi dlya vyzova etoj komandy s pomoshch'yu uust ravno 5: 4 dlya vyzova uust i 1 dlya ukazaniya opcii menyu. Dlya togo chtoby nabrat' tu zhe komandu vruchnuyu, trebuetsya 31 simvol. Vot gde ekonomiya vremeni i izbavlenie ot lishnih problem! Ochen' interesna opciya 'r'. Ukazhite ej imya sistemy - i ona ustanovit svyaz' s etoj sistemoj pri pomoshchi uucp. Ispol'zuemyj pri etom metod otlichaetsya ot metoda, primenyaemogo v opcii 'c', no rabotaet v System V. Otmetim, odnako, chto v bol'shinstve sistem komanda uusub, zadejstvovannaya zdes', trebuet vozmozhnostej superpol'zovatelya. Uusub vozvrashchaet upravlenie obratno vashemu interpretatoru shell, no zatem zapuskaet uucp v fonovom rezhime. Kogda eto proizojdet, uust prodvigaetsya vpered i pokazyvaet dinamicheskij hvost registracionnogo fajla, kak opisano vyshe. Posle etogo vy mozhete nablyudat' vse dejstviya uucp po vyzovu, peredache fajlov i zaversheniyu raboty. Opciya 's' pokazyvaet vse vashi tranzakcii k utilite uucp, vybiraya iz registracionnogo fajla tol'ko to, chto otnositsya k vashemu imeni. Obychno imeetsya mnogo zapisej, poetomu vyvod peredaetsya po konvejeru komande more v celyah udobstva chteniya. Sleduyushchuyu opciyu 'u' nuzhno ispol'zovat' s bol'shoj ostorozhnost'yu. Ona udalyaet fajly blokirovki, ustanavlivaemye sistemoj uucp dlya samoj sebya. Esli v eto vremya uucp rabotaet, drugoj pol'zovatel' mozhet obratit'sya pri pomoshchi cu k linii i vse razrushit'. |ti fajly blokirovki sushchestvuyut takzhe, kogda kto-to primenyaet cu na posledovatelnoj linii. Dannaya opciya predusmotrena po toj prichine, chto inogda uucp ili cu zavershaetsya avarijno. Kogda takoe proishodit, nuzhno udalit' fajly blokirovki, chtoby nachat' vse snachala. |tu opciyu sleduet ispol'zovat' tol'ko dlya etoj celi libo dlya zaplanirovannogo eksperimenta, chtoby posmotret', chto pri etom mozhet proizojti. Poslednyaya opciya 'w' prednaznachena dlya otobrazheniya iz registracionnogo fajla teh tranzakcij uucp, kotorye otnosyatsya k poslednej nedele. |to netrudno sdelat', no esli by vy iskali opredelennuyu tranzakciyu, vy mogli by primenit' dlya etogo sredstva poiska simvol'nyh strok komandy more.

    PRIMER

$ uust r |to popytka povtornogo podklyucheniya k linii uucp. Ee mozhno ispol'zovat' dlya oprosa drugoj sistemy ili dlya otpravki ili priema dannyh, stoyashchih v ocheredi. Pervym delom zaprashivaetsya imya sistemy, k kotoroj nuzhno obratit'sya. Zatem eta komanda pytaetsya udalit' vse fajly, ostavshiesya posle predydushchih avarijnyh zavershenij, i proizvesti vyzov.

    POYASNENIYA

Uust yavlyaetsya odnoprohodnoj utilitoj, t.e. ne imeet vnutrennih ciklov. Vy vybiraete opciyu, i posle zaversheniya ee vypolneniya zavershaetsya ves' komandnyj fajl. Takim sposobom eto sdelano glavnym obrazom po toj prichine, chto vy dolzhny obryvat' vyvod komandy tail, kooraya ispol'zuetsya nekotorymi opciyami menyu. Odnako, klavisha break prekrashchaet vse, dazhe vypolnenie uust. Ne imeet smysla delat' vnutrennij cikl, tak kak etot cikl redko smog by povtorit'sya. V strokah 4-8 vypolnyaetsya proverka komandnoj stroki na nalichie oshibok. Esli peredany kakie-to argumenty, vydaetsya soobshchenie ob oshibke i komandnyj fajl zavershaetsya. Stroka 10 inicializiruet peremennuyu UUNODE tekushchim imenem uucp toj sistemy, v kotoroj vy rabotaete. |to obespechivaetsya vyzovom utility uuname. Stroki 11-24 otobrazhayut glavnoe menyu odnim bol'shim operatorom echo. Imya sistemy, postupivshee v peremennuyu UUNODE, vydaetsya dlya spravki v pravoj verhnej chasti ekrana. V stroke 25 chitaetsya otvet pol'zovatelya, a stroki 27-66 proveryayut komandu i vypolnyayut ee. Esli vy vveli tol'ko vozvrat karetki, eto sootvetstvuet stroke 28, i programma zavershaetsya. Stroki 29-38 obrabatyvayut komandu 'c' - podklyuchenie v otladochnom rezhime. Zaprashivaetsya imya sistemy i proveryaetsya, ne pustoe li ono. Esli ono pustoe, komandnyj fajl zavershaetsya. V protivnom sluchae stroka 34 soobshchaet, chto uust pytaetsya udalit' vse fajly STST, kotorye sozdavalis' pri neudachnyh vyzovah. Pered tem kak obratit'sya k sisteme, vy dolzhny udalit' vse fajly STST. Esli takih fajlov net, komanda rm ne srabatyvaet i vydaetsya soobshchenie "no STST files". Stroki 39-40 vypolnyayut opciyu 'd'. Snachala otobrazhaetsya dlya spravki nazvanie kataloga, kotoryj my prosmatrivaem. Zatem raspechatyvaetsya katalog PUBDIR v dlinnom formate. Zametim, chto LOGNAME sootvetstvuet lyubomu pol'zovatelyu, zapustivshemu dannuyu programmu, poetomu net neobhodivosti vpisyvat' v tekst programmy kakoe-to znachenie. V strokah 41-42 analogichnym obrazom obrabatyvaetsya opciya 'f'. My raspechatyvaem zdes' katalog podkachki. Komanda 'l' v strokah 43-44 soobshchaet, chto otobrazhaetsya registracionnyj fajl. Zatem ispol'zuetsya komanda "tail -f". Opciya -f oznachaet, chto nuzhno proizvodit' otobrazhenie togo, chto nahoditsya v fajle sleduyushchim obrazom: kak tol'ko tranzakcii pechatayutsya v fajl, oni otobrazhayutsya na vash ekran. Pol'zovatel' dolzhen nazhat' klavishu break dlya vyhoda iz programmy. Stroki 45-58 vypolnyayut komandu 'r', kotoraya pytaetsya proizvesti povtornoe podklyuchenie. Snachala zaprashivaetsya imya sistemy i sravnivaetsya s pustoj strokoj. Esli imya vvedeno, my pytaemsya udalit' fajly STST i vydaem soobshchenie o tom, bylo li eto udalenie uspeshnym. Zatem pechataetsya soobshchenie o tom, chto zapuskaetsya process uusub. V stroke 54 proveryaetsya, yavlyaetsya li kornevym fajlom XENIX. Esli eto tak, to utilita uusub vyzyvaetsya s uchetom ee novogo mestonahozhdeniya v sisteme XENIX. V protivnom sluchae ona vyzyvaetsya s ukazaniem ee obychnogo mestonahozhdeniya - /usr/lib/uucp. Posle vypolneniya uusub otobrazhaetsya dinamicheskij hvost registracionnogo fajla, poka pol'zovatel' ne nazhmet klavishu break, posle chego komandnyj fajl zavershaetsya. V strokah 59-60 vypolnyaetsya proverka svodki o tranzakciyah. Ispol'zuetsya komanda uulog, ej peredaetsya LOGNAME tekushchego pol'zovatelya. Podrobnosti o komande uulog mozhno najti v dokumentacii. Opciya 'u' rassmatrivaetsya v strokah 61-62. Snachala otobrazhaetsya komanda rm, kotoraya budet vypolnena, chtoby uvedomit' ob etom pol'zovatelya. Zatem eta komanda vypolnyaetsya, chtoby popytat'sya udalit' fajly blokirovki. Esli komanda udaleniya zavershaetsya neudachej, vydaetsya soobshchenie ob oshibke, ukazyvayushchee na otsutstvie fajlov blokirovki. Stroki 63-64 zapuskayut opciyu 'w', chtoby posmotret' deyatel'nost' uucp za poslednyuyu nedelyu. S pomoshch'yu komandy more pechataetsya fajl LogWEEK. |tot fajl sozdaetsya utilitoj uucp, chtoby obespechit' szhatuyu svodku o rabote v techenie nedeli. Stroka 65 sootvetstvuet lyubym komandam, kotorye ne byli raspoznany ranee. Takie komandy yavlyayutsya oshibochnymi, i vydaetsya soobshchenie ob etom. Kogda vypolnenie programmy dohodit do etogo mesta, ona zavershaetsya. ------------------------------------------------------------ IMYA: uutrans ------------------------------------------------------------ uutrans Peredacha fajlovyh derev'ev iz odnoj sistemy UNIX v druguyu sistemu UNIX

    NAZNACHENIE

Kopiruet polnuyu ierarhiyu fajlovoj sistemy s pomoshch'yu uucp v druguyu sistemu UNIX i podderzhivaet strukturu fajlovogo dereva.

    FORMAT VYZOVA

uutrans

    PRIMER VYZOVA

cd $HOME/backup uutrans remote ~russ Nachinaya s podkataloga backup moego registracionnogo kataloga, zapustit' uutrans s cel'yu peredachi vseh moih fajlov. Fajly posylayutsya v sistemu remote i razmeshchayutsya tam v moem registracionnom kataloge (/usr/russ).

    TEKST PROGRAMMY

1 : 2 # @(#) uutrans v1.0 Transfer file trees via uucp 3 # Author: Russ Sage 4 if [ $# -gt 0 ] 5 then echo "uutrans: argument count error" >&2 6 echo "usage: uutrans" >&2 7 exit 1 8 fi 10 SELF=`uuname -l` 12 echo "source directory( to exit): \c" 13 read SOURCE 14 if [ "$SOURCE" = "" -o ! -d "$SOURCE" ] 15 then exit 1 16 fi 18 echo "\ndestination system( for $SELF): \c" 19 read SYSTEM 20 echo "\ndestination directory( for ~/$LOGNAME): \c" 21 read DEST 23 : ${SYSTEM:="$SELF"} 24 : ${DEST:="~/$LOGNAME"} 26 echo "\nQUEUEING:" 28 find $SOURCE -type f -print | sort | while read FILE 29 do 30 echo $FILE 31 uucp -c -d -r $FILE $SYSTEM!$DEST/$FILE 32 done

    PEREMENNYE SREDY VYPOLNENIYA

DEST Mesto naznacheniya, kuda nuzhno kopirovat' fajly FILE Opredelennyj kopiruemyj fajl LOGNAME Soderzhit registracionnoe imya SELF Soderzhit uzlovoe imya tekushchej sistemy SOURCE Istochnik vseh kopiruemyh fajlov SYSTEM Imya sistemy, v kotoruyu nuzhno kopirovat' OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL uutrans? Kopirovanie fajlov iz odnoj sistemy v druguyu s pomoshch'yu uucp - dovol'no prostaya zadacha: dostatochno ukazat', kakie fajly kuda nuzhno napravit'. No kak byt' v sluchae, kogda vam nuzhno skopirovat' ierarhiyu fajlov? Kak garantirovat', chto fajly raspolozhatsya v sisteme-adresate v vide ierarhii, a ne budut zasunuty v odin i tot zhe katalog? Edinstvennoe predlozhenie v dokumentacii po uucp (dazhe ne na stranicah rukovodstva) govorit o tom, kak eto sdelat'. Esli vy nikogda ne chitali ego, to skoree vsego vashi peresylki zavershatsya neudachej. Nam nuzhno instrumental'noe sredstvo, kotoroe peredaet drevovidnye struktury v drugie sistemy, sohranyaya pri etom formu etih struktur. My hotim obespechit' prostoj sposob vypolneniya etoj raboty, chtoby ne iskat' kazhdyj raz pripryatannuyu informaciyu. CHTO DELAET uutrans? Uutrans predostavlyaet gibkij interfejs, garantiruyushchij pravil'noe kopirovanie fajlovyh ierarhij. |tot komandnyj fajl znaet, kakie fajly peredavat', v kakuyu sistemu ih napravit' i gde ih razmestit' v etoj sisteme. Kogda vy zapuskaete uutrans, pervym delom on zaprashivaet ishodnyj katalog dlya peresylki fajlov. Esli vy ne hotite prodolzhat', nazhmite vozvrat karetki dlya vyhoda. Obratite vnimanie, chto ispol'zuetsya komanda find, poetomu put', kotoryj vy ukazyvaete v otvet na podskazku, yavlyaetsya prefiksom marshrutnogo imeni dlya vseh peredavaemyh fajlov. Naprimer, esli vashim tekushchim katalogom yavlyaetsya $HOME i vy hotite sdelat' ego katalogom-istochnikom, vvedite ".". Operator find sgeneriruet dlya fajla /src/f.c marshrutnoe imya ./src/f.c. Esli zhe vy vvedete, naprimer, imya /usr/russ, to rezul'tiruyushchim marshrutnym imenem budet /usr/russ/src/f.c. Takim obrazom, trebuetsya nebol'shaya predusmotritel'nost', chtoby izbezhat' sozdaniya lishnih urovnej kataloga v sisteme-adresate. Zatem zaprashivaetsya imya sistemy-adresata. Esli vy hotite, chtoby eto byla vasha sobstvennaya sistema, nazhmite vozvrat karetki. |to pozvolit skopirovat' fajly v predelah togo zhe zhestkogo diska ili v drugie fajlovye sistemy. V zaprose kataloga-adresata umolchaniem yavlyaetsya PUBDIR. Esli vam eto ne podhodit, ukazhite tochnoe marshrutnoe imya kataloga, s kotorogo vy hotite nachat' ierarhiyu v sisteme-adresate. (Napomnim takzhe, chto mnogie sistemy nakladyvayut ogranicheniya na to, kuda vy mozhete kopirovat' fajly s pomoshch'yu uucp.) Sposob, kotorym uutrans podderzhivaet pravil'noe fajlovoe derevo - eto ukazanie absolyutnogo marshrutnogo imeni v sisteme-adresate, nizhe kotorogo budut raspolagat'sya vse peredavaemye fajly. Edinstvennyj sposob sdelat' eto - zanesti marshrutnoe imya v peremennuyu i ispol'zovat' ee v kachestve putej kak istochnika, tak i adresata pri vyzove uucp. Kogda vsya vhodnaya informaciya vvedena, ispol'zuetsya komanda find, chtoby najti vse fajly, otnosyashchiesya k dannoj ierarhii. Zatem kazhdoe marshrutnoe imya peredaetsya po konvejeru v cikl, kotoryj otobrazhaet imya i peredaet fajl adresatu pri pomoshchi uucp. Dlya togo chtoby uskorit' ves' process i sekonomit' svobodnoe prostranstvo, fajly stavyatsya v ochered' v kataloge podkachki (t.e. ne delaetsya popytka vyzvat' udalennuyu sistemu), i nikakie fajly ne kopiruyutsya v katalog podkachki. |to ekonomit vremya, kotoroe ushlo by na kopirovanie bol'shih kolichestv fajlov, i dazhe mozhet obezopasit' vashu mashinu ot avarijnyh zavershenij raboty, tak kak kopirovanie bol'shogo chisla fajlov zabiraet vse svobodnoe prostranstvo. Kogda vse fajly postavleny v ochered', vam nuzhno vruchnuyu podsoedinit'sya k uucp s pomoshch'yu komandy 'c' ili 'r' utility uust. Vse katalogi v sisteme-adresate dolzhny sozdavat'sya avtomaticheski po mere peresylki fajlov. Neskol'ko nepriyatnyj vopros - prava sobstvennosti i dostupa k fajlam na prinimayushchej storone. Obychnaya posledovatel'nost' dejstvij takova: 1. Postavit' fajly v ochered' k uucp, ispol'zuya instrumental'noe sredstvo uutrans. 2. Vyjti iz sistemy-istochnika. 3. Vojti v sistemu-adresat. 4. Zapustit' uust i povtorno podklyuchit'sya k uucp. Esli vy priderzhivaetes' takoj tehnologii postanovki v ochered' i peredachi, to vy polnost'yu kontroliruete, kakie fajly kuda napravlyayutsya. Imeetsya pobochnyj effekt, zaklyuchayushchijsya v tom, chto prava dostupa k fajlam v kataloge-adresate ustanavlivayutsya v sootvetstvii s maskoj interpretatora shell (shell umask) togo processa, kotoryj proizvodit povtornoe podklyuchenie. Neobhodimo otmetit', chto esli u vas net prav dostupa na zapis' v vashej umask, to sozdaetsya peresylochnyj katalog, no v nego ne mogut byt' pomeshcheny nikakie fajly, chto podryvaet peredachu fajlov s pomoshch'yu uucp. Dlya razresheniya etoj problemy izmenite vashu umask na "000" (po umolchaniyu ona ravnyaetsya 777 dlya katalogov i 644 dlya obychnyh fajlov).

    PRIMERY

1. cd $P uutrans . remote Smenit' katalog na PUBDIR. Peredat' vse fajly iz tekushchego kataloga (.) v udalennuyu sistemu, razmeshchaya ih v podrazumevaemom kataloge ~/$LOGNAME, t.e. v moem kataloge PUBDIR. 2. uutrans /etc remote /tmp/etc Peredat' vse fajly iz kataloga /etc v sistemu remote, pomeshchaya ih v katalog /tmp/etc.

    POYASNENIYA

Stroki 4-8 proveryayut nalichie oshibok. Esli v komandnoj stroke est' argumenty, pechataetsya soobshchenie ob oshibke. Stroka 10 inicializiruet peremennuyu SELF imenem vashego sistemnogo uzla, ispol'zuemogo utilitoj uucp. Stroki 12-16 zaprashivayut katalog-istochnik i chitayut otvet v peremennuyu SOURCE. Esli nichego ne vvedeno ili ukazan ne katalog, programma zavershaetsya. Stroki 18-21 zaprashivayut sistemu-adresat i katalog-adresat. Umolchaniyami yavlyayutsya vasha sobstvennaya sistema i katalog PUBDIR dlya razmeshcheniya fajlov. |ti umolchaniya oblegchayut konfigurirovanie, svyazannoe s peresylkoj informacii, chtoby ne bylo neobhodimosti vvodit' mnogo dannyh. V strokah 23 i 24 proveryaetsya, inicializirovany li peremennye. Esli peremennoj SYSTEM prisvoen vozvrat karetki, v nee zanositsya znachenie SELF. Esli peremennaya DEST pustaya, ej prisvaivaetsya ~/$LOGNAME. |ti operatory ustanavlivayut znacheniya po umolchaniyu. Stroka 26 pechataet soobshchenie o tom, chto fajly stavyatsya v ochered'. Ves' fokus zaklyuchaetsya fakticheski v strokah 28-32. Komanda find nachinaet rabotat' s kataloga SOURCE i nahodit vse obychnye fajly. |tot spisok peredaetsya utilite sort, tak chto uucp peresylaet fajly v otsortirovannom poryadke. |to oblegchaet otslezhivanie togo, kakie fajly byli peredany, esli voznikayut kakie-to problemy. Otsortirovannyj spisok popadaet v cikl while, chitayushchij imena fajlov. Kazhdoe imya otobrazhaetsya na ekran dlya spravki, i fajl stavitsya v ochered' k udalennoj sisteme. V stroke 31 ukazany takie opcii uucp: -r dlya postanovki v ochered', -c dlya togo, chtoby ne kopirovat' fajly v katalog podkachki, i -d dlya sozdaniya katalogov, neobhodimyh v udalennoj sisteme. Dlya podderzhki drevovidnoj struktury my primenyaem magicheskij sintaksis $SYSTEM!$DEST/$FILE. Nam nuzhno ne tol'ko skopirovat' fajly v sistemu i v katalog, no i opredelit' marshrutnoe imya vplot' do samogo fajla. |to garantiruet, chto fajly budut rasfasovany po katalogam. Esli by byl ispol'zovan sintaksis $SYSTEM!$DEST, to vse fajly popali by v odin katalog i ih ierarhicheskaya struktura byla by uteryana. Posle togo kak vse fajly postavleny v ochered', oni nahodyatsya v etoj ocheredi do teh por, poka ih ne pozovet udalennaya sistema. Togda fajly budut skopirovany v etu sistemu.

    KONFIGURACIONNYE RESHENIYA

Zachastuyu na praktike vokrug nashej sistemy UNIX nakaplivaetsya mnogo ne osobenno sovmestimoj apparatury, vklyuchaya terminaly, mikro-|VM i modemy. Kak zastavit' ih rabotat' sovmestno? Teper' kogda my rassmotreli osnovnye osobennosti apparatury i programmmnogo obespecheniya dlya kommunikacij v sisteme UNIX, my gotovy predstavit' nekotorye primery raboty kommunikacij v kompleksah s sistemoj UNIX. My hotim rassmotret' ryad konfiguracij, ispol'zuyushchih razlichnye kombinacii apparatury. Problemy menyayutsya, no nash obshchij podhod ostaetsya. PODKLYUCHENIE UNIX K MODEMU I GLAVNOJ MASHINE Pervaya zadacha, kotoruyu my rassmotrim, eto ispol'zovanie "personal'noj" sistemy UNIX, modema i glavnoj mashiny. U nas est' sistema UNIX s odnim posledovatel'nym portom, no my imeem kak modem, tak i liniyu pryamogo podklyucheniya k sisteme bol'shego razmera. Kak nam ispol'zovat' odin posledovatel'nyj port i dlya modema, i dlya glavnoj mashiny? Reshenie pokazano na ris. 8-10. Ris. 8-10. Podklyuchenie sistemy UNIX k modemu i glavnoj mashine --------------------------------------------------------------- ***** +----------------+ * * | | * modem * | glavnaya mashina | * * | | ***** +----------------+ ^ ^ | Pryamoj kabel' | Nul'-modem | | | +---------------+ | ------>| |------- | pereklyuchatel' | | | \ / \___________/ ^ | | Pryamoj kabel' | v +-------------+ | | | UNIX | | | +-------------+ --------------------------------------------------------------- Nam nuzhen blok pereklyucheniya. |tot blok imeet odin vhod na odnoj storone i dva vhoda na drugoj. My podsoedinyaem UNIX k glavnomu vhodu, chto pozvolyaet pereklyuchat'sya libo na modem, libo na glavnuyu mashinu. Zdes' dva razlichnyh podsoedineniya: UNIX <-- --> modem Vyzov iz UNIX pri pomoshchi cu, uucp i obrashchenie v UNIX s udalennogo terminala UNIX --> glavnaya mashina UNIX obrashchaetsya k glavnoj mashine, kak pryamo podklyuchennyj terminal PODKLYUCHENIE UNIX I TERMINALA K MODEMU |ta konfiguraciya analogichna predydushchej, za isklyucheniem togo, chto vsya apparatura lokal'na. My hotim ispol'zovat' modem kak dlya terminala, tak i dlya UNIX. Konfiguraciya pokazana na ris. 8-11. Port sistemy UNIX podsoedinyaetsya k odnoj storone pereklyuchatelya, a terminal k drugoj. Otmetim, chto terminal NE budet obrashchat'sya v sistemu UNIX. Vse kabeli pryamolinejnye. V takom komplekse vozmozhny sleduyushchie konfiguracii: UNIX <-- --> modem Obrashchenie v UNIX s udalennogo terminala i vyzov iz UNIX s pomoshch'yu cu, uucp terminal --> modem Dlya vyzova iz UNIX tol'ko v kachestve nemogo terminala Ris. 8-11. Podklyuchenie UNIX i terminala k modemu ---------------------------------------------------------------- ***** * * * modem * * * ***** ^ | | Pryamoj kabel' | v /-----------\ / \ | | | pereklyuchatel' | | | ------->| |<------- | |_______________| | Pryamoj | | Pryamoj kabel' | | kabel' | | v | +-----------+ +--------------+ | | | | | UNIX | | terminal | | | | | +-----------+ +--------------+ ---------------------------------------------------------------- PODKLYUCHENIE UNIX K TERMINALU, MODEMU I GLAVNOJ MASHINE |ta situaciya dovol'no slozhna i trebuet dvuh blokov pereklyucheniya. Sootvetstvuyushchaya arhitektura pokazana na ris. 8-12. Ris. 8-12. Podklyuchenie sistemy UNIX k terminalu, modemu i glavnoj mashine -------------------------------------------------------------------- ***** +----------------+ * * | | * modem * | glavnaya mashina | * * | | ***** +----------------+ ^ ^ Pryamoj | | Nul'- kabel' | | modem | +---------------+ | +-------------+ ----->| |----- | | | pereklyuchatel' | | terminal | | 2 | | | \ / +-------------+ \___________/ | ^ | Nul'-modem | Pryamoj kabel' | | | +---------------+ | ------>| |<------ | pereklyuchatel' | | 1 | \ / \___________/ ^ | | Pryamoj kabel' | v +-------------+ | | | UNIX | | | +-------------+ -------------------------------------------------------------------- Nachnem s sistemy UNIX. V nej imeetsya liniya, idushchaya v pereklyuchatel' 1 v kachestve glavnogo vhoda. Pereklyuchatel' 1 osushchestvlyaet pereklyuchenie mezhdu terminalom i blokom pereklyucheniya 2. |to pozvolyaet sisteme UNIX libo poluchat' terminal dlya registracii v sisteme (v predpolozhenii, chto rabotaet getty), libo poluchat' modem dlya registracii v sisteme, libo posylat' informaciyu modemu ili glavnoj mashine (predpolagaetsya, chto processa getty net). Zametim, chto mezhdu terminalom i UNIX dolzhen byt' nulevoj modem, no my ne mozhem sdelat' nul'-modem srazu posle UNIX, potomu chto nam nuzhen pryamoj kabel' dlya podsoedineniya k modemu. Zatem blok pereklyucheniya 2 vypolnyaet kommutaciyu mezhdu modemom i glavnoj mashinoj. Liniya k modemu dolzhna byt' pryamoj, a liniya v glavnuyu mashinu dolzhna byt' nul'-modemom. Vozmozhny sleduyushchie vzaimosvyazi: UNIX <-- terminal Obrashchenie v UNIX s terminala po linii getty UNIX <-- --> pereklyuchatel' <-- --> modem Vyzov iz UNIX s pomoshch'yu cu, uucp i obrashchenie v UNIX s udalennogo terminala UNIX --> pereklyuchatel' --> glavnaya mashina Obrashchenie iz UNIX pri pomoshchi cu, uucp SISTEMA UNIX, MIKRO-|VM I MODEM V etoj konfiguracii takzhe trebuetsya dva bloka pereklyucheniya. U nas est' mashina s dvumya posledovatel'nymi liniyami, na kotoroj rabotaet UNIX, avtonomnaya mikro-|VM i modem, kotoryj oni dolzhny sovmestno ispol'zovat'. UNIX-mashina takzhe vosprinimaet registraciyu s avtonomnoj mashiny, pozvolyaya ej emulirovat' terminal, esli u nas est' sootvetstvuyushchee programmnoe obespechenie. Reshenie pokazano na ris. 8-13. Ris. 8-13. Sistema UNIX, mikro-|VM i modem ------------------------------------------------------------------- ***** * * * modem * * * ***** ^ | pryamoj kabel' | v ______________ / \ / \ | pereklyuchatel' | | 2 | ------------------- ^ ^ | | | | ----------------- ------------------- | | | ------------------------------- | | | | | | | | | | | ------------------- | | | | | | | pereklyuchatel' | | | \ 1 / | | \_____________/ Pryamoj | | Nul'-modem ^ kabel' | | | v v | +--------+ +-------------+ | | | | | UNIX | | mikro-|VM | | | | | +--------+ +-------------+ ------------------------------------------------------------------- Mikro-|VM mozhet rabotat' dvumya sposobami: libo kak terminal v sisteme UNIX, libo kak terminal dlya obrashcheniya k modemu. Sistema UNIX imeet odin posledovatel'nyj port, pozvolyayushchij svyazyvat'sya s mikro-|VM cherez pereklyuchatel' 1. Drugaya posledovatel'naya liniya idet v blok pereklyucheniya 2, podsoedinennyj k modemu. Po etoj linii mozhno libo obrashchat'sya iz sistemy UNIX vo vneshnij mir, libo prinimat' vneshnie vyzovy s cel'yu udalennoj registracii v sisteme cherez modem. Pereklyuchatel' 2 kommutiruet modem mezhdu mikro-|VM i sistemoj UNIX. Vozmozhny takie kombinacii: mikro-|VM --> pereklyuchatel' --> modem Obrashchenie vovne s pomoshch'yu kommunikacionnyh sredstv mikro-|VM --> pereklyuchatel' --> UNIX Registraciya v sisteme putem emulyacii terminala UNIX <-- pereklyuchatel' <-- mikro-|VM Registraciya s terminala, podklyuchennogo napryamuyu UNIX <-- --> pereklyuchatel' <-- --> modem Vyzov iz UNIX pri pomoshchi cu, uucp, udalennaya registraciya modem <-- pereklyuchatel' <-- mikro-|VM Vyzov modema s mikro-|VM modem <-- --> pereklyuchatel' <-- --> UNIX Vyzov iz UNIX ili obrashchenie v UNIX; trebuetsya izmenenie getty dlya posledovatel'noj linii i avtootveta modema

    ALXTERNATIVNOE RESHENIE

Vozmozhno eshche odno reshenie predydushchej zadachi. Ono ispol'zuet neskol'ko bol'she vozmozhnostej, chem predydushchee reshenie. Te zhe osnovnye problemy resheny, no podhod pri etom sil'no otlichaetsya. V konfiguracii, pokazannoj na ris. 8-14, bloki pereklyucheniya podsoedinyayutsya inache, chem v predydushchem komplekse. Dostupny te zhe puti peredachi informacii, a takzhe nekotorye novye. Ris. 8-14. Sistema UNIX, mikro-|VM i modem v al'ternativnoj konfiguracii --------------------------------------------------------------------- ***** * * ------->* modem * | * * -------------------- | ***** | | | | | | pryamoj kabel' | | v | _______________ | | | | nulevoj | pereklyuchatel' | | modem \ 2 / | \-----------/ | ^ | | pryamoj kabel' | | | v | /-----------\ | / \ | | pereklyuchatel' | | | 1 | | +_______________+ | ^ ^ | | | | pryamoj kabel' | | pryamoj kabel' | ------------------- -------------- | | | v v | +--------+ +---------------+ | | | | | UNIX | | mikro-|VM | | | | | +--------+ +---------------+ ---------------------------------------------------------------------- Kak mikro-|VM, tak i sistema UNIX podklyucheny k pereklyuchatelyu 1. |tot pereklyuchatel' prisoedinen k bloku pereklyucheniya 2 glavnym vhodom. Linii ot mikro-|VM, ot UNIX, mezhdu pereklyuchatelyami i modemnaya liniya dolzhny byt' pryamymi kabelyami. Tol'ko vhodnaya liniya sistemy UNIX dolzhna byt' nul'-modemom. Pereklyuchatel' 2 kommutiruet odin iz central'nyh processorov mezhdu modemom i vtoroj posledovatel'noj liniej sistemy UNIX. Modemnaya liniya mozhet idti ot modema ili k nemu, no liniya sistemy UNIX dolzhna byt' tol'ko vhodyashchej, potomu chto v UNIX rabotaet getty. Vozmozhny takie kombinacii: mikro-|VM --> pereklyuchatel' --> modem Obrashchenie vovne pri pomoshchi kommunikacionnyh sredstv mikro-|VM --> pereklyuchatel' --> UNIX Registraciya v sisteme putem emulyacii terminala UNIX <-- --> pereklyuchatel' <-- --> modem Obrashchenie iz ili v UNIX s pomoshch'yu cu, uucp UNIX --> pereklyuchatel' --> UNIX Vyhod s pervoj linii idet vo vtoruyu liniyu dlya registracii v sisteme modem <-- --> pereklyuchatel' <-- --> processor Vybor central'nogo processora zavisit ot pereklyuchatelya 1 UNIX <-- pereklyuchatel' <-- processor V zavisimosti ot pereklyuchatelya 1, odin iz processorov mozhet zaregistrirovat'sya v sisteme TRI SISTEMY UNIX Poslednyaya konfiguraciya, kotoruyu my rassmotrim, eto soedinenie treh sistem UNIX. Dannoe reshenie bylo podskazano konfiguraciej s pryamym podsoedineniem 16-razryadnoj mashiny PC XENIX, 32-razryadnoj mashiny PC XENIX i glavnoj mashiny VAX. Dlya togo chtoby vypolnit' takoe podklyuchenie, nam nuzhno tri dvunapravlennyh bloka pereklyucheniya. Ne tak vazhno, kakaya iz mikro-|VM 1 i mikro-|VM 2 yavlyaetsya 32- ili 16-razryadnoj mashinoj. Oni mogut byt' v vashem pomeshchenii, a glavnaya mashina mozhet stoyat' gde-to v drugom meste i soedinyat'sya kabelem s vashim pomeshcheniem. Pri etom predpolagaetsya, chto kabel' ot glavnoj mashiny uzhe yavlyaetsya nul'-modemom v vashem podklyuchenii. Eshche odin nulevoj kabel' raspolagaetsya mezhdu dvumya sistemami UNIX na mikro-|VM, chtoby mozhno bylo zaregistrirovat'sya s odnoj iz etih sistem v drugoj sisteme v kachestve terminala. Ostal'nye kabeli pryamye (sm. ris. 8-15). Ris. 8-15. Tri sistemy UNIX --------------------------------------------------------------------- +------------------+ | | | UNIX | | glavnaya mashina | | | +------------------+ ^ | nul'-modem | ______________ / \ / \ | pereklyuchatel' | | 3 | |__________________| ^ ^ | | pryamoj kabel' | | pryamoj kabel' ---------------- ---------------- | | | ----------------------- | | | nul'-modem | | | v v | --------------- --------------- | | | | | pereklyuchatel' | | pereklyuchatel' | \ 1 / \ 2 / \___________/ \___________/ ^ ^ pryamoj | | pryamoj kabel' | | kabel' v v +-------------+ +-------------+ | | | | | UNIX | | UNIX | | Mikro-|VM 1 | | Mikro-|VM 2 | | | | | +-------------+ +-------------+ --------------------------------------------------------------------- Kazhdaya mikro-|VM podsoedinena k bloku pereklyucheniya cherez glavnoe soedinenie. |ti pereklyuchateli 1 i 2 kommutiruyutsya drug s drugom i s blokom pereklyucheniya 3. Mikro-|VM 1 mozhet pereklyuchat'sya na mikro-|VM 2 v kachestve interfejsa terminal/uucp i na glavnuyu mashinu v kachestve udalennogo terminala. V etom sluchae liniya glavnoj mashiny prohodit cherez selektor porta. Mikro-|VM 2 mozhet pereklyuchat'sya mezhdu mikro-|VM 1 i glavnoj mashinoj analogichnym obrazom. Pereklyuchatel' 3 kommutiruet glavnuyu mashinu mezhdu mikro-|VM 1 i mikro-|VM 2. Vozmozhny sleduyushchie kombinacii: mikro-|VM 1 --> pereklyuchatel' --> glavnaya mashina Zaregistrirovat'sya v kachestve udalennogo terminala mikro-|VM 1 <-- --> pereklyuchatel' <-- --> mikro-|VM 2 Obrashchenie v UNIX ili iz UNIX v zavisimosti ot getty mikro-|VM 2 <-- --> pereklyuchatel' <-- --> mikro-|VM 1 Obrashchenie v UNIX ili iz UNIX v zavisimosti ot getty mikro-|VM 2 --> pereklyuchatel' --> glavnaya mashina Zaregistrirovat'sya v kachestve udalennogo terminala glavnaya mashina <-- pereklyuchatel' <-- mikro-|VM 1 Zaregistrirovat'sya s udalennogo terminala glavnaya mashina <-- pereklyuchatel' <-- mikro-|VM 2 Zaregistrirovat'sya s udalennogo terminala *** Veroyatno, rassmotrennye nami konfiguracii mogut ne v tochnosti sootvetstvovat' vashim potrebnostyam. Odnako my predstavili ih s toj cel'yu, chtoby vy uvideli raznoobrazie tipovyh reshenij, kotorye vy mozhete adaptirovat' dlya sebya. V sleduyushchej glave my neskol'ko otojdem ot vseh etih gaek i boltikov i podrobnee rassmotrim voprosy, svyazannye s administrirovaniem sistemy, osobenno voprosy bezopasnosti.

    * GLAVA 9. Administrirovanie i bezopasnost' *

OBYAZANNOSTI I OTVETSTVENNOSTX ADMINISTRATORA PODDERZHKA BEZOPASNOSTI V SISTEME TIPICHNYE PROBLEMY BEZOPASNOSTI access pokaz vseh besparol'nyh vhodov v sistemu chkset proverka nalichiya v sisteme fajlov s razreshennoj ustanovkoj identifikatora pol'zovatelya ili gruppy suw otslezhivanie narushitelej po protokol'nomu fajlu komandy su

    ADMINISTRIROVANIE I BEZOPASNOSTX

    ZACHEM NAM IZUCHATX ADMINISTRIROVANIE

----------------------------------- Vashu kar'eru v sisteme UNIX v kachestve uchenika (stat' by posko- ree masterom!) mozhno predstavit' sebe v vide treh stupenej kvalifika- cii. Pervaya stupen' - posvyashchenie v rabotu sistemy UNIX v celom, oso- benno izuchenie ee serdceviny - fajlovoj sistemy. Pervye tri glavy zalozhili etot fundament i predostavili prakticheskie instrumental'nye sredstva dlya obsluzhivaniya sistemy. Vtoraya stupen' masterstva - pod- derzhka vashej sobstvennoj raboty i personal'noj sredy - rassmatrivaet- sya v glavah s chetvertoj po shestuyu. V glavah 7 i 8 bolee podrobno rassmatrivayutsya dva special'nyh aspekta prakticheskoj raboty s siste- moj UNIX - ustrojstva i kommunikacii. Teper' my gotovy dostich' tret'ej stupeni masterstva - kurirovat' rabotu samoj sistemy, chto bolee prozaicheski nazyvaetsya sistemnym ad- ministrirovaniem. Esli vy v nastoyashchij moment takoj pol'zovatel', kotoryj zanimaet- sya programmirovaniem, ili esli vy vse vremya rabotaete sistemnym prog- rammistom, to vas mozhet udivit', zachem vam stanovit'sya na tochku zre- niya sistemnogo administratora i ovladevat' ego osnovnymi instrumentami raboty. Na eto imeetsya dve ser'eznye prichiny: znanie i neobhodimost'. Sistemnoe administrirovanie trebuet blizkogo znakomstva s tem, gde i chto nahoditsya v sisteme, i ponimaniya vzaimosvyazi konkretnogo processa s sistemoj v celom. Programmisty stremyatsya nahvatat'sya sve- denij o chudesah i rezul'tatah tainstvennyh komand i o vsyacheskih hit- rostyah, kotorye oni schitayut poleznymi, no zachastuyu oni ne hotyat tra- tit' vremya na znakomstvo s sistemoj UNIX v celom. My by hoteli sagitirovat' vas na bolee sistematicheskoe izuchenie sistemy UNIX s toj cel'yu, chtoby vy mogli otkryt' dlya sebya novye kladovye znanij. Vot po- chemu na protyazhenii dannoj knigi my sozdavali instrumental'nye sreds- tva, kotorye ne tol'ko delayut poleznye veshchi, no i pomogayut vam izu- chat' samu sistemu. Neobhodimost' znat' administrirovanie stanovitsya oshchutimoj, kogda vy obnaruzhivaete, chto vam vdrug zadali rabotu sistemnogo administra- tora ili administrator ushel v otpusk, chto pol'zovateli vystroilis' vozle VASHEGO stola v ozhidanii pomoshchi, poskol'ku vas schitayut priznan- nym avtoritetom. Drugoj prichinoj vozniknoveniya neobhodimosti mozhet byt' to, chto vy stali bezrazdel'nym hozyainom vashej sobstvennoj mikro- |VM s sistemoj UNIX i hotite vse ustanovit' i podderzhivat' po svoemu vkusu. Vzglyanite na takuyu neobhodimost' administrirovaniya kak na voz- mozhnost' nakopit' obshirnye i doskonal'nye znaniya o UNIX, kotorye mo- gut sosluzhit' vam dobruyu sluzhbu v vashej budnichnoj rabote s komp'yute- rom. Byt' masterom UNIX - delo chesti i tehnicheskoj gramotnosti. Pyta- yas' udovletvorit' trebovaniyam neobhodimosti, mastera UNIX uchatsya pos- pevat' za potokom neobhodimyh im znanij. Mastera UNIX ne tol'ko horo- sho igrayut, no i proschityvayut igru na odin hod vpered.

    NEKOTORYE NABLYUDENIYA POSVYASHCHENNOGO V ADMINISTRIROVANIE

----------------------------------------------------- Polozhenie sistemnogo administratora takovo, chto trebuet bolee shirokogo ponimaniya sistemy, chem neobhodimo pol'zovatelyu ili dazhe programmistu, i v svyazi s etim bol'shej otvetstvennosti. Sposobnost' vseh, kto ne sil'no znaet UNIX, vypolnit' svoyu rabotu, zavisit ot sposobnosti administratora podderzhivat' rabotosposobnost' sistemy, predvidya i razreshaya problemy do togo, kak oni stanut opasnymi. Odnim iz naibolee vazhnyh voprosov administrirovaniya yavlyaetsya be- zopasnost'. Svedeniya o bezopasnosti, predstavlennye zdes', byli na- kopleny v rezul'tate raboty s administratorami, raboty v kachestve ad- ministratora i inogda neobhodimosti raboty pri nalichii nesoglasovanno dejstvuyushchih administratorov. Pomimo bezopasnosti, rassmotreny nekotorye iz bolee obshchih vopro- sov deyatel'nosti administratora. Nemnogie rukovodstva i knigi uchat, kak byt' administratorom. |ti navyki v osnovnom prihodyat s opytom. Vasha konfiguraciya sistemy, potrebnosti pol'zovatelej i prioritety vse vmeste okazyvayut vliyanie na to, kak vy spravlyaetes' s administrativ- nymi zadachami. My pomozhem vam pokazom instrumental'nyh sredstv i tryu- kov, rasskazom istorij o lovushkah i kapkanah i rassmotreniem razlich- nyh podhodov, rabotayushchih v real'noj praktike.

    ADMINISTRATIVNYE OBYAZANNOSTI

---------------------------- V bol'shinstve bol'shih komp'yuternyh sistem administratory ves'ma uvazhaemye lyudi. Oni otvechayut za podderzhanie rabotosposobnosti vychis- litel'noj sistemy 24 chasa v sutki, narashchivanie ee v sluchae neobhodi- mosti, pomoshch' pol'zovatelyam v razreshenii ih problem, patrulirovanie i obespechenie bezopasnosti. Administrirovanie - eto fakticheski neskol'- ko raznyh rabot v odnoj. My sobiraemsya podrobno rassmotret' kazhduyu iz etih oblastej, a zatem predlozhit' pomoshch' i instrumental'nye sredstva dlya ovladeniya administrirovaniem.

    PODDERZHKA RABOTOSPOSOBNOSTI SISTEMY

Podderzhka rabotosposobnosti sistemy - prioritet nomer odin. |to oznachaet nechto bol'shee, chem prosto izbegat' sokrushitel'nyh sistemnyh krahov, hotya vazhnost' ih nedopushcheniya ochevidna. Obespechenie rabotospo- sobnosti sistemy trebuet takzhe profilakticheskih mer. Odno iz luchshih zanyatij dlya vas posle togo, kak vy zavershite pervoe prochtenie dannoj knigi,- vernut'sya v ee nachalo i rassmotret' izlozhennye v nej idei i instrumental'nye sredstva s tochki zreniya administratora. Naprimer, rassmotrenie togo, kak pravil'no realizovat' rezervnoe kopirovanie fajlov i sborku musora (sm. glavu 3), mozhet pomoch' predotvratit' sis- temnye krahi, vyzvannye usloviyami perepolneniya. Esli zhe krah vse-taki proizojdet, to takoe rassmotrenie pozvolit vam vosstanovit' vse dan- nye nastol'ko bystro i polno, naskol'ko eto vozmozhno.

    ULUCHSHENIE SISTEMNYH VOZMOZHNOSTEJ

Po mere togo, kak vse bol'she i bol'she lyudej ekspluatiruyut siste- mu, trebuetsya vse bol'she resursov, no vy mozhete takzhe najti sposoby ispol'zovaniya imeyushchihsya resursov s bol'shej effektivnost'yu. Razrabaty- vaya sposoby povysheniya proizvoditel'nosti sistemy, vy najdete dlya sebya mnogo poleznogo v instrumental'nyh sredstvah, predstavlennyh v glave 3. V sisteme UNIX redko hvataet printerov, diskovyh ustrojstv, posle- dovatel'nyh portov, setevogo oborudovaniya i t.p., no bolee effektiv- noe primenenie mozhet pomoch' reshit' te zhe zadachi bez dobavleniya novyh resursov. Po vsej vidimosti, naibolee vazhnym resursom yavlyaetsya vremya cent- ral'nogo processora. Posadite tridcat' pol'zovatelej v sisteme, rass- chitannoj na dvadcati chetyreh - i vy srazu pochuvstvuete nehvatku pro- cessornogo vremeni. V rabotu administratora vhodit podderzhka tekushchih resursov, a takzhe planirovanie rosta sistemy na budushchee. Poetomu tre- buetsya, chtoby vy znali tipichnye raskladki ispol'zovaniya vashej siste- my, znali, gde mogut vozniknut' "uzkie mesta", kak effektivno raspre- delit' imeyushchiesya resursy i kakie sposoby narashchivaniya sistemy mogut byt' naibolee effektivnymi po stoimosti. Nekotoruyu poleznuyu informa- ciyu mozhno izvlech' putem "staticheskogo" inspektirovaniya fajlovoj sis- temy s pomoshch'yu sredstv, predstavlennyh v glave 2. Bolee dinamichnuyu kartinu ekspluatacii sistemy vy mozhete poluchit', primenyaya komandu ps, chtoby uvidet', kakie processy aktivny v nastoyashchee vremya, i primenyaya komandu w (v sisteme Berkeley), kotoraya vydaet statistiku zagruzki sistemy i organizacii ocheredej.

    POMOSHCHX POLXZOVATELYAM

Pol'zovateli sistemy - nesomnenno, imeyut vysokij prioritet. Vse v sisteme dolzhno byt' organizovano tak, chtoby oni mogli vypolnit' svoyu rabotu. Administrator dolzhen sledit' za tem, chtoby vse razumnye (i nekotorye nerazumnye) zaprosy pol'zovatelej udovletvoryalis'. V obsluzhivanie potrebnostej pol'zovatelej mozhet vhodit' montiro- vanie lent i drugih fajlovyh sistem, rezervnoe kopirovanie fajlov, otladka kommunikacionnyh linij i zagotovka personal'nyh zapisej dlya pol'zovatelej v privilegirovannyh fajlah tipa crontab i inittab. (|ti dva fajla dayut pol'zovatelyam bol'she gibkosti v organizacii ih sredy i planirovanii zadach, no pri etom oshchutimy takzhe dlya pryamogo pol'zova- tel'skogo dostupa.) |to mozhet pokazat'sya legkim delom, no trebuet mnogo vremeni.

    BEZOPASNOSTX: NUZHEN STOROZHEVOJ PES

Administrator vedaet vsemi voprosami bezopasnosti. Obychno on edinstvennyj, kto zanimaetsya etoj rabotoj. Pol'zovateli ne obespechi- vayut bezopasnost', potomu chto oni ne umeyut ili ne znayut, kak eto sde- lat'. Narushiteli bezopasnosti mogut atakovat' sistemu mnogimi sposo- bami. Oni mogut zanyat' sistemnye resursy, zapolnyaya tablicu processov ili tablicu otkrytyh fajlov i raspredelyaya dlya sebya vse svobodnoe dis- kovoe prostranstvo i vse svobodnye indeksnye deskriptory fajlov. Oni mogut pereputat'sya s drugimi pol'zovatelyami sistemy ili pomenyat' sis- temnoe vremya. Oni mogut povredit' fajly dannyh ili ispolnyaemye moduli i dazhe poddelat' pochtu. No pri vashej organizacii sistemy oni chashche vsego stanovyatsya prosto "pol'zovatelyami-huliganami". Pozzhe my rass- motrim bolee ser'eznye veshchi, chem sistemnoe huliganstvo - teh pol'zo- vatelej, kto mozhet nesankcionirovanno vospol'zovat'sya pravami super- pol'zovatelya. Nailuchshij podhod k problemam bezopasnosti - osoznat', chto dejs- tvitel'no nuzhdaetsya v zashchite, a ne pytat'sya stat' supersyshchikom. Vy dolzhny osobenno zabotit'sya o nuzhdah sistemnyh programmistov i drugih opytnyh avtoritetov v vashej sisteme. V ideale administrator dolzhen rabotat' VMESTE, a ne protiv priznannyh avtoritetov i podderzhivat' s nimi horoshie delovye kontakty. Ne u vseh narushitelej odinakovye moti- vy. Naprimer, kto-to iz avtoritetov mozhet zahotet' poluchit' dostup k pravam superpol'zovatelya dlya togo, chtoby samostoyatel'no delat' neko- toruyu rabotu, a ne zhdat', kogda ee sdelaete vy. Kto-to drugoj mozhet byt' obizhen na kogo-to ili voobshche na ves' mir i stremitsya otomstit' putem razrusheniya fajlov. Kazhdaya situaciya trebuet individual'noj ocen- ki. Napomnim, chto razdelyayushchaya liniya mezhdu administratorami i sistem- nymi avtoritetami zachastuyu neopredelennaya i nepostoyannaya. Bezopas- nost' inogda prevrashchaetsya v igru, v kotoroj opredelennye pol'zovateli pytayutsya razglyadet', chego oni mogut izbezhat', a administratory pyta- yutsya sohranit' kontrol' nad sistemoj. V rabote storozhevogo psa zadejstvovano pyat' funkcij: 1. Zashchita ot nerazreshennyh vhodov v sistemu, fajlov, programm i komand su. 2. Sohranenie konfidencial'nosti opredelennyh dannyh. 3. Nablyudenie za ispol'zovaniem modemov. 4. Predotvrashchenie nerazreshennyh peresylok fajlov. 5. Svedenie k minimumu vozmozhnostej vzloma. Zdes' mnogo raboty! Sistema UNIX tak obshirna, i fajly mogut skryvat'sya v takom bol'shom kolichestve mest, chto odin lish' poisk sa- mozvancev zanimaet pochti vse vremya. |to trebuet ot administratora ne stol'ko tyazheloj, skol'ko izobretatel'noj raboty. Dlya togo chtoby obes- pechit' sebe shansy na pobedu v etoj bor'be, vy dolzhny sdelat' tak, chtoby sistema pomogala sebya zashchishchat'. Neskol'ko pozdnee v etoj glave my predlozhim instrumental'nye sredstva access i suw, kotorye pomogayut vam zashchishchat'sya ot zapreshchennyh vhodov v sistemu, i komandnyj fajl chkset, imeyushchij delo s zashchitoj konfidencial'nyh fajlov. My takzhe predlagaem bolee detal'nyj vzglyad na konkretnye problemy bezopasnos- ti.

    ZASHCHITA OT ZAPRESHCHENNYH VHODOV V SISTEMU, FAJLOV,

PROGRAMM I KOMAND su Imeetsya mnogo sposobov polucheniya nesankcioniovannyh privilegij v sisteme UNIX. Samyj prostoj sposob - imet' kornevoj (superpol'zova- tel'skij) interpretator shell. |to takoj shell, kotoryj zapuskaetsya kak osobo privilegirovannyj process, imeyushchij vozmozhnost' chitat', uda- lyat' ili modificirovat' LYUBOJ fajl v sisteme nezavisimo ot togo, ka- kie prava dostupa ustanovleny dlya etogo fajla ego vladel'cem. Korne- voj shell mozhno zapoluchit', uznav kornevoj parol' u neostorozhnogo administratora ili pri pomoshchi drugih sredstv, rassmatrivaemyh nizhe. Nesankcionirovannyj pol'zovatel', imeya dostup k pravam super- pol'zovatelya, mozhet podgotovit' "potajnye dveri", obespechivayushchie dal'nejshij zapreshchennyj dostup. Oni pozvolyayut narushitelyu zapuskat' shell s kornevymi privilegiyami. Bolee podrobno my rassmotrim ih pozd- nee. Potajnye dveri mogut vystupat' v razlichnom oblich'e. Oni mogut byt' ispolnyaemymi modulyami, latkami v sistemnyh utilitah ili latkami v sistemnyh fajlah. Administrator dolzhen vesti postoyannoe nablyudenie za izmeneniyami v sisteme i umet' protivodejstvovat' vsyacheskim vmesha- tel'stvam. Nizhe my rassmotrim nekotorye instrumental'nye sredstva i priemy, pomogayushchie vam obnaruzhivat' takoe proniknovenie.

    VHODY V SISTEMU

Nachnem s nesankcionirovannyh vhodov v sistemu. |to mozhet proi- zojti mnogimi sposobami. Byvaet, chto narushitel' dobavlyaet svoe sobs- tvennoe registracionnoe imya v parol'nyj fajl i pomeshchaet tuda svoj pa- rol'. Esli administrator ne znakom s parol'nym fajlom ili davno tuda ne zaglyadyval, to takuyu nesankcionirovannuyu zapis' mozhno proglyadet'. Drugoj metod nesankcionirovannogo vhoda v sistemu zaklyuchaetsya v tom, chto kto-to mozhet zavladet' vsemi parolyami, vstavlyaya v programmu login "latku" s tekstom, napravlyashchim vse vvedennye pol'zovatelyami pa- roli v potajnoj fajl. Nizhe my rassmotrim nekotorye tipy takih "la- tok". Konechno, takaya izyskannaya rabota zachastuyu sovsem ne obyazatel'na. Kak izvestno, lyudi ostavlyayut svoi paroli napisannymi na listkah buma- gi v nezapertyh yashchikah stola. Dlya nekotoryh verhom sekretnosti yavlya- etsya primenenie kombinacii pervogo i poslednego imeni v kachestve pa- rolya. Odnako esli uzh narushitel' znaet mnogo parolej, on mozhet primenyat' kazhdyj raz razlichnye registracionnye imena, chtoby ne popa- dat'sya na opasnom imeni. Probit' sistemu zashchity UNIX mozhno s pomoshch'yu "ispolnyaemyh regist- racionnyh imen". |to imena, kotorye zapuskayut programmu, a ne prosto predostavlyayut vam shell, chto yavlyaetsya obychnym sposobom nachala seansa raboty pol'zovatelya v sisteme. |to mozhet vyglyadet' primerno tak: date::100:50:Print the date:/bin:/bin/date who::101:50:Print all logged on users:/bin:/bin/who |to mozhet zapustit' lyuboj, kto imeet dostup k terminalu ili mo- demnomu portu. Inogda eto pravil'nye imena, naprimer date, who ili sync. Hotya dlya administratora mozhet byt' udobnym nalichie programm, zapuskaemyh pri vhode v sistemu, oni chasto stanovyatsya lazejkami, che- rez kotorye kto-nibud' mozhet proniknut' v sistemu i obnaruzhit' mnogo informacii o sisteme. Samye krupnye lazejki poyavlyayutsya togda, kogda eti registracion- nye imena vypolnyayut komandnye fajly interpretatora shell. Kak tol'ko narushitel' poluchaet privilegii superpol'zovatelya (dazhe esli oni lish' vremennye), on mozhet pomestit' v parol'nyj fajl takuyu zapis', kotoraya v moment vhoda v sistemu zapuskaet komandnyj fajl interpretatora shell (ili mozhet izmenit' imeyushchuyusya zapis' s komandnym fajlom). Sami eti komandnye fajly mozhno v lyuboj moment izmenit' tak, chtoby oni ra- botali po zadaniyu nesankcionirovannogo pol'zovatelya. Naprimer, v pa- rol'nom fajle mozhet byt' takaya zapis': break::102:50::/:/usr/bin/break Takaya zapis' pozvolila by komu ugodno nabrat' imya "break" v otvet na registracionnuyu podskazku, v rezul'tate chego vypolnilsya by fajl /usr/ bin/break. Kogda break otrabotaet, snova postupaet registracionnaya podskazka, i v sisteme poyavlyaetsya novaya lazejka. Pochemu? Potomu chto komandnyj fajl break mozhet soderzhat' komandy dlya redaktora, kotorye otredaktirovali by parol'nyj fajl i dobavili nesankcionirovannye za- pisi. |to stanovitsya vozmozhnym po toj prichine, chto process getty (pe- chatayushchij registracionnuyu podskazku) zapuskaetsya processom init, a vladel'cem fajla init yavlyaetsya superpol'zovatel'. Takaya privilegiya peredaetsya komandnomu fajlu, tak kak on zapushchen v moment registracii v sisteme, a programmam, zapuskaemym pri vhode v sistemu, obychno tre- buetsya superpol'zovatel'skij dostup dlya vypolneniya neobhodimyh inici- alizacij. V dannom sluchae, odnako, on pozvolyaet redaktoru chitat' fajl /etc/passwd i pisat' v nego. Takim obrazom, kak tol'ko narushitel' ODIN RAZ poluchaet dostup na zapis' v /etc/passwd (analogichno "diver- sionnym programmam"), on mozhet ustanovit' postoyannyj dostup, chasto dazhe cherez neskol'ko tochek vhoda. I eshche. V staryh versiyah UNIX popadayutsya nekotorye oshibki, pre- dostavlyayushchie superpol'zovatel'skie vozmozhnosti. Naprimer, esli v pol'zovatel'skoj zapisi parol'nogo fajla ne ukazan nomer pol'zova- tel'skogo identifikatora, to po umolchaniyu on schitaetsya nulevym, t.e. superpol'zovatel'skim. V etu lazejku ochen' legko proniknut'. Primer takoj zapisi: rt::::The Super User:/:/bin/sh Vot nekotorye drugie problemy, za kotorymi dolzhen sledit' admi- nistrator. Esli pervaya stroka parol'nogo fajla pustaya, to pol'zova- tel' mozhet zaregistrirovat'sya kak kornevoj bez parolya. Prover'te tak- zhe zapis' "bin" v parol'nom fajle, kotoraya obychno zapuskaet sistemnye programmy. Esli zapis' bin ne soderzhit parolya, kak v privedennom vyshe primere, kto-to mozhet vojti v sistemu v kachestve bin i otredaktiro- vat' fajl crontab, chtoby primenit' k parol'nomu fajlu komandu chmod (change permission mode, izmenenie prav dostupa) i obespechit' sebe dostup k nemu. Pol'zovatel' bin mozhet takzhe otredaktirovat' fajl /etc /rc, chtoby smenit' parol'nyj fajl. Fajl rc ispol'zuetsya dlya konfigu- rirovaniya sistemy v moment ee starta putem avtomaticheskogo zapuska ryada programm. Vse, chto nuzhno dlya uspeshnogo vtorzheniya,- podozhdat', kogda administrator peregruzit sistemu (poskol'ku imenno v etot mo- ment fajl zapuskaetsya). Posle perezagruzki narushitel' mozhet vojti v sistemu kak obychnyj pol'zovatel', otredaktirovat' parol'nyj fajl, za- pisat' ego, a potom v lyuboj moment vhodit' v sistemu v kachestve su- perpol'zovatelya. |to vsego lish' neskol'ko sposobov, kotorymi mozhno dobit'sya nesankcionirovannogo vhoda v sistemu. K sozhaleniyu, kazhdyj den' vydumyvayut novye sposoby.

    FAJLY I PROGRAMMY

Eshche odna sfera zloupotreblenij svyazana s nesankcionirovannym proniknoveniem v fajly i programmy. Samyj trudnyj etap dlya togo, kto hochet vzlomat' zashchitu sistemy UNIX,- stat' superpol'zovatelem pervyj raz, no kak tol'ko eta cel' dostignuta kakimi-libo sredstvami, fajly- interventy mozhno pomestit' v lyubom meste sistemy. Vtorzhenie mozhet vklyuchat' v sebya razmeshchenie "potajnyh dverej", latanie komandy login s cel'yu ovladeniya parolyami, chtenie i izmenenie sistemnyh uchetnyh fajlov i t.d. Nizhe my rassmotrim primery etih i drugih metodov. Osnovnymi fajlami, v kotorye vtorgaetsya kornevoj narushitel', yav- lyayutsya /etc/passwd, /etc/*rc*, /usr/lib/crontab, /usr/lib/uucp/L.sys. Dlya obnaruzheniya treshchin v vashej administrativnoj brone mozhno poiskat' fajly, dlya kotoryh vzveden bit razresheniya ustanovki pol'zovatel'skogo identifikatora (chto ukazyvaetsya bukvoj "s" v pravah dostupa, otobra- zhaemyh komandoj "ls -l"), i fajly, vladel'cem kotoryh yavlyaetsya super- pol'zovatel'. Naznachenie bita ustanovki pol'zovatel'skogo identifika- tora - razreshit' programme imet' vremennyj dostup k bolee privilegirovannomu sostoyaniyu (naprimer, superpol'zovatel'skomu), chem ona imeet v moment svoego zapuska. Na samom dele eto ochen' poleznoe svojstvo sistemy UNIX, tak kak ono pozvolyaet upravlyat' dostupom ko mnogim takim osobennostyam, k kotorym vy by ne hoteli predostavit' ne- posredstvennyj dostup dlya drugih pol'zovatelej. K sozhaleniyu, v eti programmy mozhet kto-nibud' proniknut', chtoby ispol'zovat' ih vremen- nyj kornevoj status dlya vreditel'stva, kotoroe my uzhe opisyvali. Ta- kih fajlov imeetsya konechnoe chislo, i vse oni mogut byt' provereny. Rassmatrivaemyj dalee komandnyj fajl chkset avtomatiziruet dlya vas process proverki. Tem ne menee, znanie togo, kakie fajly MOGLI byt' podvergnuty vmeshatel'stvu, eshche nichego ne govorit o tom, v kakie fajly DEJSTVITELXNO proizoshlo vtorzhenie i kak. Tyazhelee vsego obnaruzhit' za- latannye sistemnye fajly. Nekotorymi iz chasto lataemyh fajlov yavlyayut- sya login, su, passwd, ps, crypt i mv. Byvaet, chto izoshchrennyj narushitel' skryvaet daty modifikacii faj- la, chtoby nikto ne smog ego obnaruzhit' po etomu priznaku. Edinstven- nyj sposob zafiksirovat' takoe vmeshatel'stvo - imet' KONTROLXNUYU SUM- MU, t.e. zapis' s summoj (kolichestvom bajtov) vseh vazhnyh fajlov i hranit' ee v otdel'nom meste ili v zakodirovannom vide. Putem perio- dicheskoj sverki staryh summ s novymi, mozhno obnaruzhit' izmenennye fajly. Eshche odna veshch', za kotoroj dolzhen sledit' administrator, eto "skrytye fajly". Skrytye fajly yavlyayutsya chast'yu sistemy i imeyut opre- delennyj smysl: oni prednaznacheny dlya togo, chtoby ne zagromozhdat' raspechatki katalogov. Dlya togo chtoby skryt' fajl, nuzhno sdelat' per- vym simvolom imeni fajla tochku (.). Pri ispol'zovanii komandy ls vy dolzhny ukazat' opciyu -a, esli vy hotite uvidet' fajly, nachinayushchiesya s tochki. Obnaruzhenie zapreshchennyh fajlov mozhet byt' zatrudneno, esli fajl zaryt na tri-chetyre urovnya kataloga vniz i nazvan nezametnym imenem. Reshenie zaklyuchaetsya v tom, chtoby vsegda primenyat' opciyu -a komandy ls, esli vy stalkivaetes' s problemami. Nekotorye komandy po umolchaniyu pechatayut fajly, nachinayushchiesya s tochki. Ncheck(1M) pechataet vse fajly, imeyushchie vzvedennyj bit razresheniya ustanovki pol'zovatel'- skogo identifikatora. Esli fajl nazvan strannym obrazom, ego srazu zhe vidno. Odnim iz moih lyubimyh yavlyaetsya fajl "...". On vyglyadit nes- kol'ko stranno, no eto pravil'noe imya fajla. Vy dazhe mozhete zavesti imya fajla, obrazovannoe 14 tochkami - takova maksimal'naya dlina imeni fajla. KOMANDY su Poslednij vopros, za kotorym nuzhno sledit',- zapreshchennye komandy su. Su - eto takoe sredstvo, kotoroe pozvolyaet vam PODSTAVITX drugoj pol'zovatel'skij identifikator vmesto vashego sobstvennogo. Esli kto-to znaet kornevoj parol', on mozhet vojti v sistemu s lyubogo ter- minala i primenit' komandu su s kornevym parolem. Odnako, eto, vero- yatno, tot sluchaj, kogda narushiteli potratyat bol'she vsego vremeni, py- tayas' chego-libo dobit'sya. Delo v tom, chto vse tranzakcii su zapisyvayutsya v protokol'nyj fajl pod nazvaniem sulog. Pravda, k sozha- leniyu, esli uzh narushitel' stal superpol'zovatelem, to emu nichto ne meshaet modificirovat' protokol'nyj fajl s cel'yu udaleniya komprometi- ruyushchih zapisej. K tomu zhe esli redaktor vi vyzvan bez imeni fajla, to nikto ne mozhet uvidet', kakoj fajl redaktiruetsya v to vremya, kogda v sisteme proishodit vreditel'stvo. No bditel'nyj sistemnyj administrator mozhet borot'sya s etim pri pomoshchi komandy ps. Ona pechataet stroku o komande su tochno tak zhe, kak ona delaet eto dlya vseh ostal'nyh processov, poetomu mozhno srazu zhe zametit', chto kto-to prevratilsya v superpol'zovatelya komandoj su. Na- rushitelya vydaet to, chto roditel'skij process imeet registracionnoe imya, a vladel'cem su yavlyaetsya superpol'zovatel'. Nakonec, vse ravno zhe nuzhen kornevoj parol'. A esli kto-to uzhe znaet kornevoj parol', to zachem emu svyazyvat'sya s komandoj su? Primenyat' su bylo by rezonno tol'ko v tom sluchae, esli by zalatat' komandu su tak, chtoby ona ne zapisyvala tranzakciyu v protokol i izmenyala stroku, kotoruyu pechataet ps. My eshche ne znaem, chtoby kto-nibud' dobilsya takogo effekta.

    SOHRANENIE KONFIDENCIALXNOSTI DANNYH

Dazhe esli dopustit', chto sekretnost' obespechena, byvayut sluchai, kogda administratoru nuzhno zashchitit' vazhnye fajly ot lyubopytnyh glaz. V sisteme UNIX eto mozhno sdelat' s pomoshch'yu special'nyh atributov za- shchity fajla, special'nyh gruppovyh prav dostupa, shifrovki ili dazhe razmeshcheniya etih dannyh na diske, kotoryj montiruetsya tol'ko v sluchae neobhodimosti. Odnako, takie dannye ne dolzhny ostavat'sya fizicheski prisutstvuyushchimi v sisteme, esli oni ne montirovany, potomu chto naru- shitel' mozhet ih smontirovat' i poluchit' k nim dostup. Komandnyj fajl mntlook, rassmotrennyj ranee, umeet prosmatrivat' vse ustrojstva i nahodit' takie dostupnye, no nemontirovannye fajlovye sistemy. Neobhodimo soblyudat' takoe pravilo: "Esli vy ne hotite, chtoby kto-nibud' videl etot fajl, ne derzhite ego na vidu". I ne dumajte, chto vy tak horosho ego spryatali, chto nikto ne smozhet ego najti. Esli lyudi imeyut superpol'zovatel'skij dostup v vashu sistemu, oni mogut za schitannye minuty poluchit' raspechatku kazhdogo fajla etoj sistemy. Za- tem, kogda vy ne vidite, oni mogut pri pomoshchi uucp peredat' interes- nyj fajl v druguyu sistemu dlya posleduyushchego izucheniya, skopirovat' ego na gibkij disk ili dazhe otpechatat'. Pomnite, chto esli v vashu sistemu pronik nesankcionirovannyj pol'zovatel', NIKAKOJ BEZOPASNOSTI BOLXSHE NET!

    KONTROLX ZA ISPOLXZOVANIEM MODEMA

Modemy yavlyayutsya odnoj iz krupnyh proboin v zashchite sistemy. Esli tol'ko u vas net special'noj apparatury dlya predvaritel'noj fil'tra- cii obrashchenij v sistemu UNIX, to ona vsegda uyazvima posredstvom mo- demnyh portov. Bol'shie vychislitel'nye sistemy mogut imet' proizvol'noe chislo modemov, kak prinimayushchih, tak i peredayushchih. Vam mozhet pokazat'sya, chto poskol'ku komanda login imeet dopolnitel'nyj parol' dlya linij s nabo- rom nomera, to vse sekretno, no eto ne tak. Imeyutsya programmy, koto- rye mogut probovat' mnogo kombinacij veroyatnyh registracionnyh imen i parolej, i v sluchae podhodyashchej kombinacii komanda login mozhet vpus- tit' narushitelya v sistemu! Obrashchenie vovne, v drugie sistemy cherez modemy - otdel'naya isto- riya. Obychno tot, kto pravil'no zaregistrirovalsya v sisteme, hochet obrashchat'sya k drugim sistemam. No chto, esli na vashej storone imeyutsya ulavlivayushchie registracionnye imena tipa class, education, test i t.d.? Kto-to mozhet vojti v sistemu pod vidom odnogo iz takih pol'zo- vatelej i ispol'zovat' modem bezo vsyakogo riska byt' shvachennym za ruku. Edinstvennyj sposob pojmat' takih narushitelej - po nomeru ter- minal'noj linii, esli u vas imeyutsya special'no vydelennye linii. CHto proizoshlo by, esli by tot, kto voshel v vashu sistemu cherez modem pri pomoshchi odnogo iz perechislennyh registracionnyh imen, obra- tilsya by potom vovne, k kakoj-nibud' "dal'nej zemle"? Togda ne bylo by nikakoj vozmozhnosti usledit' za obratnym vyzovom opredelennogo pol'zovatelya.

    PREDOTVRASHCHENIE ZAPRESHCHENNYH PERESYLOK FAJLOV

Zapreshchennye peresylki fajlov imeyut otnoshenie pochti isklyuchitel'no k sredstvam uucp. V sisteme Berkeley (BSD 4.1 i starshe) setevye ko- mandy takzhe imeyut analogichnye problemy. Vot primer: esli kto-to za- puskaet v sisteme Berkeley komandnyj fajl dlya "vzloma dveri", to ko- manda udalennoj registracii v sisteme (rlogin) registriruet narushitelya na drugoj mashine v kachestve superpol'zovatelya i nikogda ne sprashivaet kornevoj parol'. Razve eto ne ochevidnaya proboina v siste- me? Nesankcionirovannyj pol'zovatel' mozhet takzhe primenit' udalennoe kopirovanie (rcp), chtoby skopirovat' programmu "vzloma dveri" vo vse sistemy. Samoe glavnoe sledit' za protokol'nymi fajlami. No opyat' zhe, chto esli narushitel' udalyaet iz protokol'nyh fajlov vse zapisi, svyazannye s zadaniem voprosov? U vas net sposoba uznat' o tom, chto eto proizosh- lo. Eshche nuzhno sledit' za takim povedeniem narushitelej, kogda oni de- layut vyzov i vydayut sebya za korrektnuyu udalennuyu sistemu. Oni mogut dobit'sya etogo, izmeniv uzlovoe imya svoej sistemy takim obrazom, chto- by ono sootvetstvovalo odnomu ih vashih razreshennyh "korrespondentov". Izoshchrennogo narushitelya ochen' trudno pojmat', no my predlagaem nekoto- rye idei, kotorye dolzhny vam v etom pomoch'.

    SVEDENIE K MINIMUMU VOZMOZHNOSTEJ VZLOMA

|to to, chem administratory chasto prenebregayut. Sovet nomer odin - NIKOGDA ne ostavlyat' bez prismotra terminal, zaregistrirovannyj kak superpol'zovatel'skij. Brosit' bez prismotra terminal s kornevym dos- tupom - vse ravno, chto ostavit' tysyachu klyuchej ot sejfa kompanii na vashem stole. Vse nesankcionirovannye pol'zovateli mogut vospol'zo- vat'sya etim, podgotoviv komandnyj fajl "vzloma dveri", ozhidayushchij ta- kogo momenta. Kak tol'ko oni poluchayut v svoi ruki vash terminal, vsego lish' odna komanda predostavlyaet im bezgranichnye superpol'zovatel'skie vozmozhnosti. S etogo momenta sistema perestaet byt' zashchishchennoj. Sistemnye administratory dolzhny proveryat' svoi sistemy i smot- ret' na nih s tochki zreniya narushitelya. Est' li hot' kogda-nibud' mo- ment, v kotoryj sistema uyazvima? CHto mozhet proizojti sredi nochi, kog- da rabotayut programmy rezervnogo kopirovaniya? Mozhet li kto-nibud' zavladet' konsol'nym terminalom? Ne smozhet li navredit' tot, kto pri- hodit k vam pomogat'? Esli vy na sekundochku vyshli, ne smozhet li kto-to primenit' komandu chmod, a potom zapolnit' ekran chem-nibud' drugim, chtoby vy ne uznali, chto eto bylo sdelano? Vot te opasnosti, o kotoryh vam nuzhno pomnit'.

    TIPICHNYE PROBLEMY BEZOPASNOSTI

Rassmotrev v obshchih chertah obyazannosti sistemnyh administratorov i, v chastnosti, osnovnye voprosy sistemnoj bezopasnosti, my gotovy teper' k bolee detal'nomu izucheniyu togo, kak mogut proizojti narushe- niya zashchity. Kazhdyj metod vmeshatel'stva v sistemu imeet svoi preimu- shchestva i nedostatki s tochki zreniya narushitelya i ostavlyaet vozmozhnost' bor'by s nim. Buduchi osvedomlennym ob etih harakteristikah, administ- rator poluchaet horoshij shans obnaruzhit' proboi v zashchite i vyyavit' po- tencial'nyh narushitelej.

    POTAJNYE DVERI

My uzhe otmechali, chto lyudi, kotorye mogut poluchit' superpol'zova- tel'skij dostup v sistemu hotya by na korotkoe vremya, mogut napisat' programmy, predostavlyayushchie im postoyannyj superpol'zovatel'skij dos- tup. Napomnim, chto tot, kto hochet prorvat' zashchitu sistemy UNIX, per- vym delom pytaetsya najti sposob stat' superpol'zovatelem. Kak my uzhe obsuzhdali, narushenie fizicheskoj zashchity ili ploho oberegaemyj kornevoj parol' mogut dat' narushitelyu vozmozhnost' zapustit' process kak super- pol'zovatel'skij, chto predostavlyaet dostup k fajlam (naprimer, stan- dartnym ispolnyaemym modulyam sistemy UNIX), kotorye ne mozhet izmenit' obychnyj pol'zovatel'. V rezul'tate narushitel' poluchaet dlya sebya "po- tajnuyu dver'". Klyuchevym voprosom yavlyaetsya sposob hraneniya v sisteme UNIX ukaza- nij o vladel'ce i privilegiyah, svyazannyh s fajlom. Pomimo horosho iz- vestnyh prav dostupa dlya vladel'ca, gruppy i prochih pol'zovatelej (eti prava ustanavlivayutsya komandoj chmod), imeetsya dva bolee starshih bita, nazyvaemyh setuid (ustanovka pol'zovatel'skogo identifikatora) i setgid (ustanovka gruppovogo identifikatora). Kak pravilo, process, zapushchennyj dannym pol'zovatelem, imeet tol'ko te privilegii na dostup, kotorye prinadlezhat etomu pol'zovate- lyu. Odnako, mnogie sistemnye komandy dolzhny imet' dostup k takim faj- lam, k kotorym my by ne hoteli razreshat' dostup pol'zovatelya, za isk- lyucheniem ochen' ogranichennogo nabora situacij. YArkim primerom yavlyaetsya komanda passwd, pozvolyayushchaya pol'zovatelyu smenit' svoj parol'. Ochevid- no, chto etoj komande neobhodim dostup na zapis' v fajl /etc/passwd, a takoj dostup imeet obychno tol'ko superpol'zovatel'. Problemu reshaet ispolnyaemyj fajl komandy passwd, v kotorom bit setuid ustanovlen na vladel'ca fajla, a vladel'cem fajlov, sootvets- tvuyushchih obychnym sistemnym komandam, yavlyaetsya superpol'zovatel' (pol'- zovatel'skij identifikator 0). |to oznachaet, chto VO VREMYA RABOTY PRO- CESSA, sootvetstvuyushchego dannoj komande, pol'zovatel' imeet kornevye privilegii! Kogda komanda zavershaetsya, prekrashchaetsya i kornevoj dostup ... esli tol'ko v dannuyu komandu ne bylo kakogo-to vmeshatel'stva ili esli narushitel' ne ustanovil osobuyu programmu setuid. V etih sluchayah ostaetsya tol'ko vojti v potajnuyu dver'. Potajnaya dver' - eto chashche vsego fajl, vladel'cem kotorogo yavlya- etsya superpol'zovatel', no kotoryj podvergnut vmeshatel'stvu nesankci- onirovannogo pol'zovatelya, zavladevshego kakim-to obrazom pravom dos- tupa na zapis' v etot fajl, obychno putem vremennogo superpol'zovatel'skogo dostupa. Vazhno ponimat', chto potajnaya dver' - eto prosto eshche odin process, porozhdennyj iz obychnogo pol'zovatel'sko- go interpretatora shell, no s odnoj sushchestvennoj osobennost'yu: u nego drugoj nomer pol'zovatel'skogo identifikatora - kak pravilo, 0, t.e. identifikator superpol'zovatelya. Poskol'ku pol'zovatel'skij identifi- kator hranitsya v samom processe, on mozhet byt' podvergnut vmeshatel'- stvu. Fakticheskoe proniknovenie v sistemu s obreteniem vozmozhnostej superpol'zovatelya proishodit togda, kogda rabotaet "dvernaya" program- ma. Zdes' ispol'zuetsya volshebstvo bita setuid. Kogda etot bit vzve- den, programma ustanavlivaet (ili izmenyaet) pol'zovatel'skij identi- fikator processa na pol'zovatel'skij identifikator vladel'ca dannogo fajla (kotoryj okazyvaetsya superpol'zovatel'skim). Poka etot pol'zo- vatel'skij identifikator vremenno yavlyaetsya superpol'zovatel'skim, programma prevrashchaetsya v shell-interpretator (obychno putem vypolneniya sistemnogo vyzova exec). Takoj shell nahoditsya po druguyu storonu dve- ri, v carstve superpol'zovatelya, so vsemi prinadlezhashchimi emu privile- giyami. Kak my uzhe otmechali, obsuzhdaya komandy su, bolee izoshchrennye naru- shiteli mogut razlichnymi sposobami maskirovat' svoe pronikonvenie v sistemu. Odin iz sposob maskirovki - imet' "dvernuyu" programmu, koto- raya nichego ne delaet, esli tol'ko ona ne vyzvana s kakoj-nibud' neza- metnoj opciej, naprimer -z. Skoree vsego, programma potajnoj dveri ne vydaet skol'ko-nibud' poleznogo sintaksicheskogo soobshcheniya, esli ee vyzvat' bez pravil'noj opcii. Eshche odna hitrost' zaklyuchaetsya v tom, chto programma potajnoj dve- ri mozhet izmenit' svoyu komandnuyu stroku (kotoruyu mozhno otobrazit' pri pomoshchi komandy "ps -ef", vydayushchej polnoe sostoyanie processa) na kakuyu -nibud' bezobidnuyu, zapuskaemuyu obychno superpol'zovatelem (naprimer, getty). Opytnyj narushitel' vryad li ostavit ishodnyj tekst programmy po- tajnoj dveri v sisteme, poetomu administrator vynuzhden razglyadyvat' tol'ko ispolnyaemyj modul'. Dlya reassemblirovaniya ob容ktnogo koda mozh- no primenit' otladchik (adb), no esli tol'ko vy ne imeete bezumno blizkogo znakomstva s vnutrennostyami sistemy UNIX, vam budet ves'ma trudno predstavit' sebe, chto proishodit. Izoshchrennye programmy potaj- noj dveri izbegayut takzhe prisutstviya legko uznavaemyh strok v ispol- nyaemyh modulyah. Vy mozhete, odnako, primenit' komandu strings (esli ona est' v vashej sisteme) dlya poiska simvol'nyh strok, kotorye tam mogli by byt'.

    PROTOKOLXNYE FAJLY

Odna iz prostejshih lovushek dlya togo, kto pytaetsya dobyt' prava superpol'zovatelya - sozdavat' zapis', pomeshchaemuyu v protokol'nyj fajl. Pri etom administratoram nuzhno sledit' za protokol'nymi fajlami, ne poyavlyayutsya li tam zapisi, kotorye mogut byt' priznakom zlodejstva. Nizhe my pokazhem vam instrumental'noe sredstvo, kotoroe avtomaticheski sledit za odnim iz takih protokol'nyh fajlov - fajlom sulog, soderzha- shchim tranzakcii "zamenennogo pol'zovatelya". Drugoj protokol'nyj fajl, chasto nuzhdayushchijsya v proverke, eto protokol programmy uucp, potomu chto eta programma mozhet byt' ispol'zovana dlya nesankcionirovannyh peresy- lok fajlov. Mnogie narushiteli pytayutsya proverit' protokol'nye fajly i udalit' komprometiruyushchie zapisi, sgenerirovannye pri ih vmeshatel'st- ve. V arsenale administratora est' sredstva bor'by s etim. Oni ne na 100 procentov effektivny, no otlavlivayut nekotoryh narushitelej i, us- lozhnyaya im zhizn', mogut otbit' ohotu vtorgat'sya v sistemu. V dopolnenie k obychnym protokol'nym fajlam, podderzhivaemym sis- temoj UNIX, nekotorye administratory zavodyat svoi sobstvennye proto- kol'nye fajly, a zatem podpravlyayut klyuchevye komandy tak, chtoby oni pomeshchali dannye v eti novye registracionnye fajly v processe svoej raboty. |to mozhet pomoch' obezvredit' neostorozhnyh lazutchikov. Odin znakomyj administrator sdelal protokol'nyj fajl dlya komandy cu i naz- val ego /tmp/.../.culog. Dovol'no umnyj tajnyj fokus, no v /usr/lib/crontab u nego byla zapis' dlya periodicheskoj pechati etogo fajla. |to ego vydavalo: nuzhno bylo maskirovat'sya poluchshe. Zametim takzhe, chto vashi "skrytye" imena protokol'nyh fajlov mogut byt' izvle- cheny putem prosmotra ispolnyaemogo obraza komandy s pomoshch'yu utility strings. Esli u vas est' pol'zovatel', ot kotorogo vy ozhidaete chego-ni- bud' zapreshchennogo, vy dolzhny umet' ustanovit' special'nuyu sistemu re- gistracii, kotoraya zapuskala by bolee sovershennyj mehanizm, kogda ta- koj pol'zovatel' rabotaet v sisteme. Programmu watch iz glavy 6 mozhno modificirovat' tak, chtoby ona vyzyvala special'nuyu protokoliruyushchuyu programmu, kogda v sistemu vhodit pol'zovatel' iz izvestnogo spiska. Protokoliruyushchaya programma mogla by povtoryat' komandy ps (process status, sostoyanie processa) i/ili delat' "momental'nye snimki" obych- nyh registracionnyh fajlov (osobenno uchetnyh fajlov) i napravlyat' re- zul'taty v pripryatannyj protokol'nyj fajl. Ideya sostoit v tom, chto opasnye processy mozhno bylo by obnaruzhit' do togo, kak narushitel' po- luchaet vozmozhnost' vojti v protokol'nye fajly i izmenit' ih. (Vidimo, vam nuzhno izbegat' primeneniya komandy at v takoj programme, a perio- dicheski pol'zovat'sya vmesto nee komandoj sleep. V protivnom sluchae, narushitel' mozhet raspoznat' vashi meropriyatiya po zapisi fajla crontab.) Kak tol'ko vy imeete rezul'tat o seanse raboty opasnogo pol'zovatelya, vy mozhete zapustit' grep dlya poiska interesuyushchih vas imen ili napisat' instrumental'noe sredstvo, kotoroe vypolnyaet dlya vas takoj poisk.

    UCHETNYE FAJLY

Veroyatno, naibolee vazhnym sredi protokol'nyh fajlov yavlyaetsya uchetnyj fajl. V uchetnom fajle imeetsya zapis' o kazhdom i vsyakom pro- cesse, zapuskaemom v sisteme. Tochnuyu strukturu mozhno posmotret' v fajle /usr/include/sys/acct.h. V odnom iz polej etoj struktury zapi- sany processy, imeyushchie superpol'zovatel'skie vozmozhnosti. Kogda kto-libo vhodit v sistemu cherez kornevuyu dver', dlya shell- interpretatora, kotoryj on zapuskaet, i dlya vseh processov, kotorye on porozhdaet, vladel'cem yavlyaetsya koren' (superpol'zovatel'). V uchet- nom fajle otrazhen nomer terminala, s kotorogo zapushchen process, poeto- mu vy mozhete uvidet' kornevye processy, zapushchennye s takih termina- lov, na kotoryh pol'zovatelyam ne razreshen superpol'zovatel'skij dostup. Esli u vas imeyutsya obychnye linii s naborom nomera, to vse takie zapisi mogut predstavlyat' ne odnogo i togo zhe pol'zovatelya. Drugie vhody v sistemu mogut imet' odinakovyj nomer terminala, no raznye pol'zovatel'skie identifikatory. Odnako, vy mozhete znat', kto obychno imeet dostup k nekotorym vydelennym liniyam. Uchetnye fajly mogut horosho razoblachit' processy, imeyushchie ne ta- koj pol'zovatel'skij identifikator, kak u lica, zapustivshego eti pro- cessy. Poishchite processy, vladel'cem kotoryh byl izvestnyj pol'zova- tel', no kotorye imeyut superpol'zovatel'skie vozmozhnosti. Sredi nih mogut byt' korrektnye zapisi, naprimer lpr, tak kak otobrazhayutsya vse sistemnye programmy, zapushchennye so vzvedennym bitom setuid. Zapisi, kotorye my ishchem, otnosyatsya k shell-interpretatoram s ustanovlennym uchetnym flagom superpol'zovatelya. |to vydaet tot fakt, chto byla vy- polnena programma potajnoj dveri. Izuchite podklyuchaemyj fajl acct.h, chtoby uvidet' vse opredeleniya. Ispol'zuya bit ASU dlya proverki polya, my mozhem izolirovat' flagovuyu oblast', otrazhayushchuyu privilegiyu super- pol'zovatelya. Samyj luchshij sposob rassmotret' etu strukturu - napi- sat' programmu na yazyke Si, pechatayushchuyu vse elementy struktury. V sle- duyushchej raspechatke pokazany nekotorye vazhnye uchetnye polya: -------------------------- | | cmd f uid tty btime | | more 0 russ 0 Sat Jul 5 01:25:59 1986 | ls 0 russ 0 Sat Jul 5 01:31:12 1986 | ps 0 russ 0 Sat Jul 5 01:31:59 1986 | id 0 russ 0 Sat Jul 5 01:34:00 1986 | pwd 0 russ 0 Sat Jul 5 01:34:12 1986 | sh 1% russ 0 Sat Jul 5 01:33:51 1986 | \__ kornevoj shell s effektivnym pol'zovatel'skim identifikatorom | | sync 0 russ 0 Sat Jul 5 01:34:21 1986 | df 0 russ 0 Sat Jul 5 01:34:27 1986 | id 0 root 0 Sat Jul 5 01:34:37 1986 | sh 2# root 0 Sat Jul 5 01:34:33 1986 | \__ kornevoj shell s real'nym pol'zovatel'skim identifikatorom, | 2# oboznachaet bit superpol'zovatelya, | vladelec izmenen na root | Otmetim, chto shell-interpretatory s effektivnym pol'zovatel'skim identifikatorom maskiruyut bit vo flage superpol'zovatelya, no vladel'- cem ih processov yavlyaetsya obychnyj pol'zovatel'. Ne izvestno, vse li sistemy primenyayut znachenie 1 v kachestve flaga shell-interpretatora s effektivnym pol'zovatel'skim identifikatorom. Pohozhe, chto Berkeley postupaet imenno tak, a System V net. KOMANDA su Kak my uzhe otmechali, UNIX predostavlyaet pol'zovatelyam obychnyj sposob stat' superpol'zovatelem - eto komanda su. Kak vidno iz predy- dushchego izlozheniya, sut' komandy su zaklyuchaetsya v sistemnom vyzove exec. Tot, kto primenyaet komandu su, dolzhen znat' kornevoj parol', tranzakciya protokoliruetsya v fajle /usr/adm/sulog, a komanda ps ogla- shaet tot fakt, chto aktiven kornevoj shell. |tot priem ne samyj hitro- umnyj.

    DOSTUP K TERMINALU SUPERPOLXZOVATELYA

Pomnite o tom, chto NIKOGDA nel'zya ostavlyat' bez prismotra termi- nal, na kotorom vy rabotaete v kachestve superpol'zovatelya? Poka vy otsutstvuete, kto-to mozhet vospol'zovat'sya etim terminalom, chtoby vy- polnit' komandu chmod s cel'yu ustanovki bita pol'zovatel'skogo iden- tifikatora. Horosho podgotovlennyj narushitel' uzhe imeet otkompiliro- vannuyu programmu potajnoj dveri, vladel'cem kotoroj yavlyaetsya superpol'zovatel', i zhdet, kogda budut izmeneny prava dostupa. Ne os- tayutsya li konsol'nye terminaly dostupnymi v kachestve superpol'zova- tel'skih noch'yu, vo vremya dejstvij po rezervnomu kopirovaniyu? Esli os- tayutsya, to nautro administrator mozhet okazat'sya v nezavidnom polozhenii! BOLEE PODROBNO O POLXZOVATELE bin My uzhe upominali o "lazejke" v nekotoryh sistemah, pozvolyayushchih pol'zovatelyu "bin" bez truda zavladet' superpol'zovatel'skim dostu- pom. Problema "bin" imeet eshche ryad aspektov. Esli nesankcionirovannye pol'zovateli mogut vojti v sistemu cherez bin (yavlyayushchijsya vladel'cem bol'shinstva distributivnyh ispolnyaemyh modulej), to oni pochti naver- nyaka smogut poluchit' prava superpol'zovatelya. Prezhde vsego, v nekoto- ryh versiyah vladel'cem vseh ispolnyaemyh modulej, razmeshchennyh v kata- logah /bin i /usr/bin, yavlyaetsya bin. |to znachit, chto narushiteli mogut perezapisat' ili podpravit' ispolnyaemye moduli svoimi sobstvennymi variantami, vypolnyayushchimi nekotorye osobye dejstviya, naprimer "chmod 4755 door", a zatem vosstanovit' na mesto ishodnuyu versiyu ispolnyaemo- go modulya. Eshche odin sposob prostogo prevrashcheniya bin v superpol'zovatelya zaklyuchaetsya v modifikacii /etc/rc - fajla zapuska komand ("run command"). On zapuskaetsya kazhdyj raz, kogda mashina zagruzhaetsya v mno- gopol'zovatel'skom rezhime. Zapisyvaya v nego "chmod 777 /etc/passwd", narushitel' mozhet prevratit' parol'nyj fajl v obychnyj pol'zovatel'skij posle togo, kak mashina zagruzitsya. Poslednij sposob - ispol'zovat' fajl /usr/lib/crontab. |tot put' izmenen v poslednej versii System V. Teper' polnoe imya etogo fajla /usr/spool/cron/crontabs/xxx, gde xxx - fajl crontab dlya kazhdogo pol'zovatelya. V starom variante vladel'cem fajla /usr/lib/crontab inogda yavlyaetsya bin. Kto-nibud' mozhet otredaktirovat' etot fajl i po- mestit' v nego takie, naprimer, komandy: * * * * * chmod 777 /etc/passwd * * * * * chmod 4755 /tmp/door * * * * * /bin/su root -c "chmod 777 /etc/passwd" Vse eto srabatyvaet po toj prichine, chto cron vypolnyaetsya proces- som init. Poskol'ku init - odin iz pervyh zapushchennyh processov, ego vladel'cem yavlyaetsya superpol'zovatel'. Poetomu lyubaya komanda, kotoruyu vypolnyaet cron, imeet kornevye privilegii. Zvezdochki oznachayut, chto cron dolzhen vypolnit' ukazannye komandy v ocherednoj vozmozhnyj moment vremeni. Cron zapuskaet process, izmenyayushchij prava dostupa k ukazanno- mu fajlu. Narushiteli mogut pomenyat' parol'nyj fajl (chto neskol'ko bo- lee opasno) ili prosto aktivizirovat' programmu potajnoj dveri. Esli dve pervye komandy ne srabotayut, to vladelec budet izmenen na super- pol'zovatelya metodom gruboj sily - vypolneniem komandy su, a zatem peredachej komandy chmod shell-interpretatoru, zapushchennomu komandoj su. Vy dolzhny pochashche proveryat' fajly crontab i /etc/rc!

    VOZMOZHNOSTX ZAPISI V SPECIALXNYE FAJLY

|to redko primenyaemyj metod. On predpolagaet, chto obychnyj pol'- zovatel' imeet pravo na zapis' v ispolnyaemyj modul' ili v special'nyj fajl. Esli kto-to mozhet pisat' v ispolnyaemyj modul', skazhem ls, to on mozhet pomestit' tuda nekotoryj kod, kotoryj ustanavlivaet potajnuyu dver', a zatem zamenyaet sebya nastoyashchej utilitoj. |to rabotaet eshche luchshe, kogda etu komandu zapuskaet pol'zovatel' s kornevymi vozmozh- nostyami, tak kak togda komanda vypolnyaetsya kak privilegirovannyj pro- cess. Takoj sposob upryatyvaniya koda v programmu s vozmozhnost'yu zapus- ka ee ne vyzyvayushchim podozreniya pol'zovatelem nazyvaetsya "troyanskim konem". On vyglyadit bezvrednym, no to, chto spryatano u nego vnutri, krepko b'et po zashchite sistemy. Kak my uzhe otmechali, periodicheskaya proverka kontrol'nyh summ dlya standartnyh ispolnyaemyh modulej - odno iz protivoyadij ot "troyanskih konej". Esli narushiteli ovladevayut vozmozhnost'yu chteniya ili zapisi fajlov ustrojstv, oni mogut prochitat' v etih fajlah informaciyu o superbloke i fajlovoj sisteme i poluchit' dostup k lyubomu fajlu. Im mozhet ponado- bit'sya projti po fajlovoj sisteme v poiskah nuzhnogo fajla, podpravit' ego i zapisat' obratno v fajl ustrojstva. Lyudi, kotorye etim zanima- yutsya i sovershayut pri etom oshibki, mogut dobit'sya kraha vsej sistemy. Esli fajl ustrojstva nahoditsya v pamyati, pol'zovateli mogut prosmatrivat' informaciyu o processah ili yadre neposredstvenno v pamya- ti. Mozhet byt' ispol'zovan staryj priem otslezhivaniya spiskov clist na predmet postupleniya parolya pol'zovatelya, vhodyashchego v sistemu. |to trebuet bol'shih znanij o tom, gde dannaya informaciya razmeshchaetsya v pa- myati i kak k nej dobrat'sya, poetomu etim metodom pol'zuyutsya, veroyat- no, tol'ko opytnye narushiteli.

    PEREZAGRUZKA SISTEMY

V nekotoryh sistemah byvaet, chto posle perezagruzki mashiny na konsoli rabotaet superpol'zovatel'skij shell. Takoe mozhet proizojti v odnopol'zovatel'skom rezhime ili na mikro-|VM, sluzhashchej konsol'yu dlya bol'shoj mashiny. Ochevidnoe reshenie - ogranichit' fizicheskij dostup k konsoli. ISPOLXZOVANIE PREIMUSHCHESTV PEREMENNOJ $PATH Koe-kto mozhet vospol'zovat'sya situaciej, kogda pol'zovatel' ime- et katalog $HOME/bin vperedi sistemnyh katalogov /bin i /usr/bin v svoej peremennoj PATH. Pomeshchaya podpravlennuyu programmu v registraci- onnyj katalog bezvrednogo pol'zovatelya, narushitel' zastavlyaet etu programmu vypolnyat'sya vmesto nastoyashchej, poskol'ku sistema ispolnyaet pervyj fajl, sovpadayushchij s imenem komandy, kotoryj ona obnaruzhivaet v hode prosmotra opredelennogo pol'zovatelem marshrutnogo spiska. Prime- rom mogla by sluzhit' komanda ls. Kogda komanda vypolnyaetsya, ona zapuskaetsya s temi zhe pravami dostupa, chto i zapustivshij ee pol'zovatel'. Konechnaya cel' narushitelej - dobit'sya prav superpol'zovatelya, poskol'ku togda oni smogli by vy- polnit' lyubuyu komandu. Diversionnaya programma mozhet podgotovit' po- tajnuyu dver' dlya ovladeniya pravami superpol'zovatelya ili dazhe nes- kol'ko takih dverej. Ona mozhet udalit' sebya, chtoby pri ocherednom vyzove dannoj komandy vypolnyalas' nastoyashchaya komanda. Nastoyatel'naya neobhodimost' dlya administratora - proveryat' nalichie v rabochem prost- ranstve opasnyh fajlov (v chastnosti, ispolnyaemyh modulej).

    FALXSHIVYE VERSII NA LENTAH

My ne slyshali, chtoby kto-libo eto delal, no imeet smysl ot etogo zashchitit'sya. Staratel'nyj narushitel' mog by snachala podgotovit' pravki dlya sistemy, pomestit' ih na lentu i pereslat' ih vam, administrato- ru. Vy, veroyatno, predpolozhili by, chto eto pravil'nye modifikacii sistemy i ustanovili by ih. I vasha sistema poluchila by "podarochek" ot narushitelya. Poetomu administrator mozhet zahotet' sverit' novye versii s ih izgotovitelem pered tem, kak ustanavlivat' ih u sebya.

    ZASHIFROVANNAYA BAZA DANNYH

Hotya my ne mozhem dat' garantiyu, chto kto-nibud' smekalistyj ne opishet, kak raskolot' parol'nuyu zashchitu, kodirovanie parolya v sisteme UNIX po algoritmu DES schitaetsya dovol'no sekretnym. (Rassmotrenie me- hanizma DES vyhodit za predely dannoj knigi.) K etoj zashchite dobavlya- etsya odna veshch' - dva simvola, generiruemye sluchajnym obrazom, nazyva- emye "sol'yu" (salt) i hranimye v fajle /etc/passwd dlya kazhdoj zapisi. "Sol'" ispol'zuetsya dlya opredeleniya togo, kakoj iz 4096 variantov al- goritma DES primenyaetsya dlya kodirovaniya zadannogo parolya. Narushitel' mog by zahvatit' parol', ispol'zovat' ego "sol'" i zashifrovat' spisok izvestnyh parolej. Esli by rezul'tat sovpadal s probnym parolem, vzlom byl by osushchestvlen. Narushitelyu prishlos' by imet' dostup k nekotoroj dovol'no chuvs- tvitel'noj metodike, chtoby dobit'sya svoego. Nelishnyaya mera, kotoruyu mozhet predprinyat' administrator,- sledit' za chrezmernym ispol'zovani- em komandy crypt (esli ona est' v vashej sisteme). |ta komanda speci- al'no skonstruirovana tak, chtoby zanimat' mnogo processornogo vremeni - ne nastol'ko mnogo, chtoby prichinyat' neudobstva zakonnym pol'zovate- lyam, no dostatochno mnogo, chtoby vyyavit' popytki avtomatizirovannogo vzloma.

    ZAPADNYA

Zapadnya rabotaet tol'ko na special'no vydelennyh liniyah. Kogda UNIX ozhidaet, chto kto-to budet vhodit' v sistemu, ona pechataet re- gistracionnuyu stroku iz fajla /etc/gettydefs. Pol'zovatel' vvodit svoe registracionnoe imya i parol' i popadaet v sistemu. Programma zapadni izvlekaet iz etogo vygodu. Ona imitiruet pove- denie ekrana vo vremya registracii. Kogda pol'zovatel' vvodit svoe imya i parol', takaya programma pechataet soobshchenie "login incorrect" ("ne- vernaya registraciya"), a zatem zapuskaet nastoyashchuyu registracionnuyu programmu. Pol'zovatel' dumaet, chto on sdelal oshibku i povtoryaet po- pytku vhoda v sistemu, na etot raz uspeshno. Registracionnoe imya i pa- rol' mozhno kuda-nibud' otlozhit' dlya posleduyushchego izucheniya. Samaya luch- shaya zashchita administratora ot etogo - obuchenie pol'zovatelej. Vidimo, s pomoshch'yu regulyarnoj pochty ili byulletenej nuzhno napominat' im, chto esli im kazhetsya, chto oni nabrali parol' pravil'no, no poluchili pri etom soobshchenie "incorrect", to oni dolzhny nemedlenno smenit' svoj pa- rol' i soobshchit' ob etom proisshestvii administratoru. Byvayut sluchai, kogda pol'zovatel' dejstvitel'no oshibaetsya pri vvode parolya, no k bol'shomu kolichestvu takih proisshestvij nuzhno otnestits' so vsej ser'- eznost'yu.

    KOMANDA MONTIROVANIYA

Komanda montirovaniya byla sozdana dlya togo, chtoby pozvolit' pri- soedinyat' k sisteme neskol'ko diskovyh ustrojstv. Ran'she, v epohu mi- nikomp'yuterov edinstvennym vidom diskovyh ustrojstv byli bol'shie na- kopiteli, v kotorye vstavlyalis' bol'shie diskovye pakety. Oni obychno nahodilis' v mashinnom zale, i tol'ko administrator montiroval ih. Teper' mnogie sistemy imeyut gibkie diski. Oni gorazdo personal'- nee i namnogo men'she, chem bol'shie diskovye pakety. |to umen'shenie razmera oshchutimo vozdejstvuet na vazhnost' samogo ob容kta. Pohozhe, chto teper' kazhdyj pol'zovatel' mozhet imet' delo so svoimi diskami, i ad- ministratoru bol'she net neobhodimosti zanimat'sya etim. Takoj scenarij raboty privodit k sleduyushchemu. Obychnoe dejstvie, predprinimaemoe v nebol'shih sistemah dlya togo, chtoby dat' pol'zovatelyam vozmozhnost' rabotat' s ih sobstvennymi gib- kimi diskami,- eto ustanovka bita pol'zovatel'skogo identifikatora dlya fajla komandy /etc/mount. Takim obrazom, kogda zapuskaetsya koman- da montirovaniya, ee pol'zovatel'skij identifikator stanovitsya korne- vym, i ona mozhet smontirovat' gibkij disk. Komanda demontirovaniya dolzhna byt' podgotovlena analogichno. Kto-to mozhet izvlech' vygodu iz togo, chto komanda mount mozhet po- luchit' vo vremya svoej raboty prava superpol'zovatelya. Obychno v ne- bol'shih sistemah odna mashina otkryta dlya eksperimentov nesankcioniro- vannogo pol'zovatelya. On mozhet stat' superpol'zovatelem v vashej sisteme, podgotovit' programmu potajnoj dveri i pomestit' ee na gib- kij disk. Vladel'cem yavlyaetsya superpol'zovatel', a prava dostupa 4755. Zatem narushitel' mozhet razmontirovat' gibkij disk i vojti v za- shchishchennuyu sistemu. S etogo momenta narushitel' mozhet prosto vhodit' v sistemu kak obychnyj pol'zovatel', bez vsyakih special'nyh prav dostupa i montiro- vat' gibkij disk, na kotorom imeetsya programma potajnoj dveri. Kogda gibkij disk montiruetsya, fajlovaya sistema gibkogo diska vstraivaetsya v fajlovuyu sistemu zhestkogo diska, i dve sistemy slivayutsya v odnu. |to oznachaet, chto potajnaya dver' dlya ovladeniya pravami superpol'zova- telya gotova dlya fajlovoj sistemy na zhestkom diske. Kogda narushitel' zapuskaet programmu potajnoj dveri na gibkom diske, proishodit to zhe samoe, chto proishodilo by, esli by eta prog- ramma byla na zhestkom diske. Mera predotvrashcheniya - kontrolirovat' is- pol'zovanie komandy mount v vashej sisteme. Dostup k komande mount dolzhen byt' ogranichen opredelennym krugom pol'zovatelej, ona ne dolzh- na razreshat' montirovat' fajly s ustanovkoj pol'zovatel'skogo identi- fikatora. AVTONOMNYJ shell (SASH) V sistemah UNIX s gibkimi diskami zagruzochnyj disk obychno zagru- zhaetsya s gibkogo nakopitelya. Podrazumevaetsya, chto gibkij disk prime- nyaetsya dlya podgotovki zhestkogo diska i kopirovaniya vseh fajlov siste- my UNIX s gibkogo diska na zhestkij. No za etim kroetsya nechto bol'shee. Na samom dele zagruzhaemyj gibkij disk - eto kompaktnaya, pereno- simaya versiya sistemy UNIX. YAdro adaptirovano k tomu, chtoby razmeshchat'- sya na gibkom diske, a ne na zhestkom. Kogda vy ego zagruzhaete, vy po- luchaete interpretator shell i sredu tochno tak zhe, kak pri rabote s zhestkogo diska. Vot pochemu takoj shell nazyvaetsya avtonomnym (SASH, standalone shell). Kornevaya fajlovaya sistema na gibkom diske dazhe vyglyadit tochno tak zhe, kak fajlovaya sistema zhestkogo diska. Fakticheski vy mozhete smontirovat' zagruzhaemyj disk i skopirovat' utility s zhestkogo diska na gibkij. Nuzhny dve vazhnye komandy: mount i umount. Ogranicheniem yav- lyaetsya razmer gibkogo diska. Na nego ne tak mnogo pomeshchaetsya. Scenarij, s pomoshch'yu kotorogo nesankcionirovannyj pol'zovatel' mozhet primenit' SASH dlya vhoda v sistemu s superpol'zovatel'skimi privilegiyami, vyglyadit primerno tak. Snachala on dolzhen otklyuchit' pi- tanie ili perezagruzit' zashchishchennuyu sistemu. Zatem on dolzhen zagruzit' SASH i smontirovat' kornevuyu fajlovuyu sistemu zhestkogo diska v tochku montirovaniya svoej fajlovoj sistemy gibkogo diska. Komandy mogut byt' takimi: # /etc/mount /dev/fp001 /mnt <-- dlya System V # /etc/mount /dev/hd0a /mnt <-- dlya XENIX |to daet narushitelyam dostup na zhestkij disk pri pomoshchi obrashcheniya /mnt/*. Vse, chto im nuzhno dlya redaktirovaniya fajla /etc/passwd - eto projti vniz po derevu katalogov. Dlya etogo mozhno primenit' takie ko- mandy: # /mnt/bin/vi /mnt/etc/passwd # sync Teper' zhestkij disk izmenen, i ego mozhno vernut' na mesto. Naru- shitel' mozhet ostanovit' avtonomnyj variant UNIX i perezagruzit'sya s zhestkogo diska. On mozhet ispol'zovat' novoe registracionnoe imya, soz- dannoe pri pomoshchi SASH. My ne znaem, naskol'ko chasto lyudi mogut predprinimat' takie popytki. Nebol'shie sistemy bolee uyazvimy, no v nih i men'she pol'zovatelej (i potencial'nyh zlodeev). Vo mnogih slu- chayah nizhnej granicej "logicheskoj zashchity" stanovitsya "fizicheskaya zashchi- ta". Bol'shinstvo lyudej, imeyushchih bol'shie mashiny ili dazhe mini-|VM, postoyanno osoznayut, chto im est' chto zashchishchat'. A mikro-|VM vyglyadyat nastol'ko "druzhestvennymi" i prostymi, chto lyudi obychno zabyvayut, chto informaciya, kotoraya soderzhitsya na mikrokomp'yuterah, pri opredelennyh obstoyatel'stvah mozhet okazat'sya nastol'ko zhe zhelaemoj i znachitel'noj, kak i na bol'shih mashinah.

    PRAVKI ISHODNYH TEKSTOV

CHashche vsego pravki ishodnyh tekstov yavlyayutsya samym moshchnym, hotya i ne samym legkim sposobom proniknoveniya narushitelej v sistemu. Vnedryaya svoj sobstvennyj kod v podhodyashchih mestah, nesankcionirovannye pol'zo- vateli mogut izvlech' vsyu sekretnuyu informaciyu, kotoraya im nuzhna. Od- nako, pravki koda mogut byt' polezny takzhe i dlya administratora. Ad- ministratoru mozhet ponadobit'sya vnesti pravki v registracionnuyu programmu, chtoby posmotret', kto i kak chasto pytaetsya zaregistriro- vat'sya na mashine. Drugoj variant - vnesenie pravok v programmy s us- tanovkoj pol'zovatel'skogo identifikatora i v drugie dostupnye ogra- nichennomu krugu lic programmy, chtoby oni registrirovali svoj seans raboty v sekretnom protokol'nom fajle.

    YADRO

Eshche odno mesto, v kotorom nuzhno sledit' za nesankcionirovannymi pravkami - biblioteki yadra. Podpravlennye ob容ktnye moduli mozhno leg- ko pomestit' v biblioteki nezamechennymi. Drugim bibliotekam grozit ta zhe opasnost'. Dopolnitel'nye razumnye usovershenstvovaniya yadra mozhno obnaruzhit' v sistemnyh vyzovah chmod i chown. Kogda vypolnyayutsya eti sistemnye vyzovy, oni proveryayut, imeete li vy pol'zovatel'skij iden- tifikator 0. Esli net, to vash zapros ne udovletvoryaetsya. Otmeniv etu proverku, lyuboj obychnyj pol'zovatel' mog by izmenit' vladel'ca fajla na superpol'zovatelya, a takzhe izmenit' rezhim zashchity fajla, chtoby vzvesti bit ustanovki pol'zovatel'skogo identifikatora. |to pozvolilo by uspeshno obojti zashchitnyj bar'er. PROGRAMMA passwd Programma passwd - ohrannik vorot sistemy UNIX. Tochno tak zhe, kak mnogie drevnie goroda pali iz-za togo, chto vragi podkupili ohran- nika vorot, tak i horosho zashchishchennaya sistema UNIX mozhet byt' prevrashche- na v shiroko otkrytuyu, esli kto-libo podpravit etu programmu. Poskol'- ku pol'zovateli primenyayut programmu passwd dlya izmeneniya svoih parolej, podpravlennaya versiya mozhet zapisyvat' novyj parol', vvodimyj pol'zovatelem dlya izmeneniya, v sekretnyj fajl, prinadlezhashchij narushi- telyu. |to mozhet obescenit' kazhdyj vnov' sozdavaemyj v sisteme parol'. Vnutri programmy passwd parol' yavlyaetsya prosto simvol'nym massivom, poetomu s etimi dannymi legko upravit'sya. PROGRAMMA crypt Potencial'noj pravkoj programmy shifrovaniya fajlov crypt mozhet byt' nakoplenie imen fajlov i klyuchej shifra pri kazhdom ispol'zovanii programmy. Takim metodom vy mozhete prosledit', kto zapuskaet etu ko- mandu, kakoj fajl on ispol'zuet i kakoj klyuch primenyaetsya dlya togo, chtoby poluchit' dostup k etomu fajlu. Nepriyatnosti, svyazannye s poslednimi dvumya sluchayami, zaklyuchayutsya v tom, chto kto-nibud' mozhet razrushit' mery sistemnoj bezopasnosti. Esli vy schitaete, chto v vashej sisteme est' zamanchivye, vazhnye dannye, to vam kak administratoru sleduet pochashche proveryat' eti programmy (po kontrol'noj summe ili sravneniem) na predmet povrezhdeniya. KOMANDA su Poskol'ku komanda su predostavlyaet superpol'zovatel'skij dostup dlya obychnyh pol'zovatelej, imeyushchih kornevoj parol', eto eshche odna po- tencial'naya lazejka v zashchite sistemy. Obshchaya shema raboty komandy su vyglyadit tak: -------------------------------------------- | | Poluchit' informaciyu o pol'zovatele: pol'zovatel'skij identifikator, | gruppovoj identifikator, parol', nomer terminala, ... | Esli parol' pustoj ili pol'zovatel'skij identifikator raven nulyu, | To projti mimo voprosov o parole. | | Zapros parolya | Esli zashifrovannyj variant togo, chto bylo tol'ko chto nabrano, | ne sovpadaet s parol'noj strokoj iz fajla /etc/passwd, | To zaprotokolirovat' neudachnuyu popytku primeneniya su, | napechatat' soobshchenie "sorry" (sozhalenie po povodu neudachi), | vyjti. | Parol' proshel: | zaprotokolirovat' uspeshnuyu popytku primeneniya su, | vypolnit' sistemnye vyzovy dlya togo, chtoby vvesti v dejstvie | pol'zovatel'skij i gruppovoj identifikator, | ustanovit' sredu, esli eto trebuetsya, | vydat' na konsol' soobshchenie, esli eto kornevoj shell, | a vy ne za sistemnoj konsol'yu, | organizovat' argumenty dlya pokaza su v komande ps, | vypolnit' interpretator shell. | Dlya podpravlennoj versii potrebovalis' by lish' nebol'shie izmene- niya v privedennoj vyshe posledovatel'nosti. Vmesto togo, chtoby srazu zhe zashifrovyvat' parol', su mogla by proverit' "sekretnyj" parol' na- rushitelya. Esli vveden takoj parol', to proverku parolya i dejstviya po pro- tokolirovaniyu mozhno obojti, poetomu zapreshchennyj dostup ne otrazilsya by v protokole. Nesankcionirovannyj pol'zovatel' dobilsya by togo, chto DRUGIE paroli dlya komandy su zapisyvalis' by v "sekretnyj" fajl. V rezul'tate on by potihon'ku poluchil vse interesuyushchie ego paroli dlya potencial'nogo ispol'zovaniya. Dlya pol'zovatelya komanda su srabatyvala by uspeshno, esli parol' pravil'nyj, a narushitel' poluchal by v svoe rasporyazhenie parol'. KOMANDA login Nesankcionirovannyj pol'zovatel' mozhet povredit' komandu login pri pomoshchi teh zhe metodov, chto i dlya passwd. Tem ne menee, administ- rator mozhet sdelat' nechto bol'shee, chem prosto zashchitit' dannuyu prog- rammu ot povrezhdeniya. Po teorii, nailuchshej zashchitoj yavlyaetsya napade- nie. Poetomu administrator mozhet vnesti v komandu login svoi sobstvennye pravki i primenyat' ee kak sistemu opoveshcheniya o vmeshatel'- stve. Kazhdyj raz, kogda kto-to vhodit v sistemu ili pytaetsya vojti, mozhno izmenit' zapis' ob ispol'zuemyh imeni i parole. |to mozhet sig- nalizirovat' vam o lyubyh popytkah narushitelej ugadat' paroli metodom gruboj sily. V silu sposoba, kotorym realizovana komanda login, trebuetsya tol'ko odno izmenenie. Algoritm proverki kak pol'zovatel'skogo paro- lya, tak i parolya pri nabore nomera dlya modemnoj svyazi vyzyvaet odnu i tu zhe podprogrammu. K sozhaleniyu, my ne mozhem privesti ee zdes', tak kak nesankcionirovannye pol'zovateli smogli by primenit' ee dlya sbora parolej v svoih korystnyh celyah. Dalee, esli vy zaveli vash sobstven- nyj sekretnyj fajl dlya protokolirovaniya popytok vhoda v sistemu, to vy dolzhny popytat'sya ubedit' narushitelej, chto oni ne smogut prochitat' ego i ostanutsya so svoimi zabotami. Vy mozhete sdelat' sleduyushchee, hotya eto uvelichilo by nakladnye rashody: zashifrovat' utilitoj crypt paroli v protokol'nom fajle s primeneniem vashego sobstvennogo sekretnogo klyucha. Togda dazhe esli kto-to prochitaet etot fajl, on ne smozhet vos- pol'zovat'sya etoj informaciej.

    PROSTITELXNYE GREHI

Rassmatrivaemye nizhe sluchai predstavlyayut soboj menee, no vse zhe potencial'no boleznennye problemy bezopasnosti. Oni ne privlekayut sposobov ovladeniya superpol'zovatel'skimi privilegiyami, no yavlyayutsya sposobami naduvatel'stva sistemy i begstva iz nee.

    SISTEMNYJ REZHIM

Dannyj priem, pozhaluj, redko primenyaetsya, esli tol'ko u vas net cheloveka, kotoryj ochen' blizko znakom s nizkourovnevym funkcionirova- niem togo ili inogo processora, ispol'zuemogo v vashej mashine. On mo- zhet proniknut' v serdce apparatnogo oborudovaniya i pristroit'sya po- verh operacionnoj sistemy. Tem ne menee, administratory dolzhny osoznavat', chto takie veshchi vozmozhny. Vo mnogih processorah, naprimer v processore Motorola 68000, imeetsya registr sostoyaniya processora (Processor Status Register), na- zyvaemyj obychno PSW, hotya u raznyh processorov on mozhet nazyvat'sya po -raznomu. PSW soderzhit bit, opredelyayushchij, rabotaet li mashina v "su- pervizornom" ili v pol'zovatel'skom rezhime. |tot rezhim vazhen dlya mno- gopol'zovatel'skoj apparatury, poskol'ku vse pol'zovatel'skie prog- rammy rabotayut v pol'zovatel'skom rezhime, chto segmentiruet i zashchishchaet pamyat' ot "kollizij" mezhdu processami. S drugoj storony, yadro rabotaet v supervizornom rezhime. |to oz- nachaet, chto zashchita pamyati ne dejstvuet i central'nyj processor mozhet izmenyat' soderzhimoe lyuboj yachejki pamyati vo vsej mashine. YAdru neobho- dima takaya vozmozhnost', poskol'ku yadro podderzhivaet mehanizm svoppin- ga dlya peremeshcheniya processa v zashchishchennuyu pamyat' i iz nee, kogda pro- cess vypolnyaetsya. Esli narushiteli bezopasnosti mogut poluchit' v prgrammu, rabotayushchuyu v sistemnom rezhime, to oni poluchayut vozmozhnost' izmenyat' vsyu pamyat' v sisteme. Posledstviya mogut var'irovat'sya ot absolyutnogo razrusheniya, nap- rimer zapisyvaniya nulej v kazhduyu yachejku pamyati, do sposobnosti chitat' i sortirovat' dannye v pamyati, vklyuchaya paroli i druguyu informaciyu s ochen' ogranichennym k nej dostupom. Dlya togo chtoby dobit'sya sistemnogo rezhima, narushitelyu neobhodima vozmozhnost' sgenerirovat' i ustanovit' novoe yadro. Ispol'zuemyj metod zavisit ot togo, est' li u narushitelya ishodnyj tekst programm yadra. Privodimye nami podrobnosti otnosyatsya k processoru 68000, no mogut byt' analogichnymi dlya drugih processorov.

    SISTEMNYJ VYZOV

Pervyj metod - sozdat' "pol'zovatel'skij" sistemnyj vyzov. Sis- temnye vyzovy nahodyatsya v ishodnyh fajlah s imenami vida os/sys?.c. |to primerno 60 sistemnyh vyzovov, i kazhdyj iz nih imeet specifiches- kij nomer. |tot nomer opredelyaetsya tablicej sistemnyh vhodov - tabli- cej adresov tochek vhoda v sistemnye vyzovy. Dlya dobavleniya novogo sistemnogo vyzova neobhodimo podgotovit' ego ishodnyj kod. Kogda yadro perekompilirovano i ustanovleno, mozhno proizvodit' sistemnyj vyzov iz lyuboj programmy v sisteme. Kak tol'ko takoj vyzov aktivizirovan, on mozhet perevesti mashinu v sistemnyj rezhim. K schast'yu, ne tak uzh legko dlya "obychnogo" pol'zovatelya perekom- pilirovat' i pereustanovit' yadro sistemy. |tot metod, veroyatno, tre- buet "vnutrennej raboty". Pomoglo by hranenie vashih ishodnyh tekstov podal'she ot sistemy, no esli vam nuzhno imet' sistemnyh programistov, regulyarno modificiruyushchih eti ishodnye teksty, to vse, chto v vashih si- lah - ogranichit' dostup (i podobrat' nadezhnyh lyudej)!

    PSEVDOUSTROJSTVO

Vtoroj metod mozhet byt' ispol'zovan temi narushitelyami, kotorye ne imeyut ishodnyh tekstov, no imeyut vse biblioteki, obrazuyushchie yadro. Zdes' podhod neskol'ko drugoj, no rezul'tat tot zhe. V sootvetstvii s toj zhe ideej sistemnogo rezhima, cel' zaklyuchaet- sya v tom, chtoby v registre PSW central'nogo processora byl ustanovlen privilegirovannyj dostup ("supervizornyj" ili "sistemnyj rezhim"). Vmesto togo, chtoby ispol'zovat' nadlezhashchim obrazom yadro, etot metod pol'zuetsya vneshnim drajverom, kotoryj svyazyvaetsya s yadrom. |to vypol- nyaetsya putem sozdaniya psevdoustrojstva. Psevdoustrojstvo podobno nas- toyashchemu ustrojstvu, no ego imya ne vedet ni k kakoj fizicheskoj perife- rii. Dostup k psevdoustrojstvu osushchestvlyaetsya s pomoshch'yu vseh teh zhe samyh primitivov (otkryt', zakryt', chitat', pisat'), no eto dostup k logicheskoj oblasti, a ne k fizicheskoj. Dlya togo chtoby opredelit' psevdoustrojstvo, nuzhno modificirovat' glavnyj fajl ustrojstva. V glavnom fajle (kotoryj nazyvaetsya /etc/master ili /usr/sys/conf/master) imeetsya tablica vseh imen draj- verov ustrojstv, svyazannyh s kazhdym primitivom. Kogda sozdaetsya psev- doustrojstvo, v tablicu drajverov ustrojstv pomeshchaetsya novaya zapis'. V etoj tablice soderzhatsya imena vseh podprogramm, podderzhivayushchih pri- mitivy. Privilegirovannogo rezhima mozhno dobit'sya pri pomoshchi otkrytiya psevdoustrojstva. Sistemnyj vyzov open peredaet upravlenie drajveru ustrojstva, t.e. dobavlennomu kodu. V moment zapuska etogo koda mashi- na uzhe nahoditsya v sistemnom rezhime, poskol'ku kogda vypolnyalsya vyzov open, on byl "pojman" sistemoj i peredan programme obrabotki, funkci- oniruyushchej v sistemnom rezhime. Posle etogo drajver ustrojstva mozhet delat' to, chto on hochet. NARUSHITELX VYDAET SEBYA ZA UDALENNYJ UZEL uucp Esli komanda login podobna storozhu kreposti, to programma uucp podobna zabroshennomu spasatel'nomu tunnelyu, cherez kotoryj vragi mogut proniknut' vo dvorec. S prihodom mezhmashinnyh kommunikacij voznikaet celyj ryad proboin v zashchite sistemy. Pri pomoshchi uucp nesankcionirovannye pol'zovateli mogut popast' v sistemu, vydav sebya za udalennyj uzel uucp. |to ochen' legko sdelat'. Narushiteli mogut zaglyanut' v fajl /usr/lib/uucp/L.sys v vashej sisteme i obnaruzhit', gde nahodyatsya udalennye sistemy, putem poiska vhodov v sistemu na drugih mashinah. Zatem oni mogut posmotret' v fajle /etc/passwd takie vhody v sistemu, kotorye zapuskayut programmy uucico vmesto obychnogo shell-interpretatora. Esli oni obnaruzhat sootvetstvu- yushchie paroli, oni mogut popytat'sya primenit' nekotorye veroyatnye paro- li ili ispol'zovat' odin iz metodov vneseniya pravok, rassmotrennyh ranee, s cel'yu perehvata parolej. Zatem narushitel' mozhet izmenit' imya uzla svoej sistemy na imya uzla udalennoj sistemy, chtoby vydat' sebya ne za togo, kem on na samom dele yavlyaetsya. On mozhet vojti v sistemu pod imenem uucp ili pod spe- cial'nym registracionnym imenem, prednaznachennym dlya udalennoj mashi- ny. Programmy uucp peredayut eto uzlovoe imya (kotoroe yavlyaetsya pod- del'nym) v vashu sistemu. Narushiteli mogut perekachat' pochtu, fajly i t.d. iz vashej sistemy na svoyu mashinu. Esli u vas est' chto-nibud' v ocheredi, ozhidayushchej otp- ravki na zakonnuyu udalennuyu mashinu, narushiteli mogut srazu tam ochu- tit'sya. Vy mozhete stolknut'sya s nepriyatnostyami, kogda odin iz vashih operatorov zakonnoj udalennoj sistemy zvonit i sprashivaet vas, pochemu on nedelyami ne poluchaet ot vas ni pochty, ni programmnyh zaprosov! Od- nako, kovarnyj narushitel' mog by pereslat' kopiyu ukradennyh fajlov obratno k vam i ispol'zovat' progressivnye sredstva dlya otpravki ih na zakonnuyu udalennuyu mashinu.

    PODDELKA POCHTY

|tot priem dovol'no horosho izvesten, no my vklyuchaem ego dlya pol- noty izlozheniya. Pohozhe, odnako, chto on rabotaet ne vo vseh versiyah sistemy UNIX. On rabotaet v System V, no ne rabotaet v XENIX, System III i Berkeley 4.2. Dannyj metod zaklyuchaetsya v izmenenii pol'zova- tel'skoj peremennoj sredy LOGNAME. Poskol'ku komanda mail ispol'zuet ee, chtoby identificirovat' vas pri otpravke vam pochty, menyaetsya zago- lovok pochty. Obychno eto vsego lish' melkaya nepriyatnost', no vy dolzhny uvedomit' ob etom pol'zovatelej, chtoby oni ochen' vnimatel'no otnosi- lis' k takim soobshcheniyam, kotorye kazhutsya nesvojstvennymi dlya ih mni- mogo otpravitelya. SKRYTYE IMENA FAJLOV PRI RABOTE S REDAKTOROM vi Poleznoj praktikoj dlya obespecheniya bezopasnosti yavlyaetsya vypol- nenie sluchajnyh komand ps. Takaya mera bolee-menee ravnosil'na perio- dicheskomu patrulirovaniyu s cel'yu uvidet', ne proishodit li chto-nibud' opasnoe. Neobhodimo, odnako, otmetit', chto lica, ispol'zuyushchie redak- tor vi dlya nesankcionirovannoj raboty, mogut zamesti svoi sledy, vy- biraya takoe imya redaktiruemogo fajla, chtoby ono ne poyavlyalos' v ras- pechatke komandy ps. Samyj prostoj sposob, kotorym oni mogut eto sdelat' - vyzvat' vi bez ukazaniya imeni fajla. Tem samym vi zapuska- etsya s pustym fajlom. Zatem oni mogut primenit' komandu ex dlya redak- tirovaniya nuzhnogo im fajla. |to uberezhet imya fajla ot raspechatki ko- mandoj ps, tak kak ono ne yavlyaetsya chast'yu nabora argumentov komandy vi. Massiv argumentov formiruetsya pri vyzove komandy vi, a ne posle ee zapuska. Drugoj sposob - ispol'zovat' maskirovku. Narushiteli mogut perei- menovat' fajl, kotoryj oni hotyat redaktirovat', v nichego ne oznachayu- shchee imya, naprimer tmp, a potom ispol'zovat' imya tmp pri vyzove redak- tora vi. V rezul'tate v massiv argumentov zanesetsya imya tmp. Ono i poyavitsya v raspechatke komandy ps. -------------------------------------------------------- IMYA: access -------------------------------------------------------- access

    NAZNACHENIE

Ishchet v parol'nom fajle vse registracionnye zapisi, ne imeyushchie parolej.

    FORMAT VYZOVA

access

    PRIMER VYZOVA

access Vydaet spisok vseh besparol'nyh vhodov v sistemu

    TEKST PROGRAMMY

1 : 2 # @(#) access v1.0 Show all free access logins Author: Russ Sage 4 if [ "$#" -gt "0" ] 5 then echo "access: too many arguments" >&2 6 echo "usage: access" >&2 7 exit 1 8 fi 10 grep '^[^:]*::' /etc/passwd || echo "All logins protected" OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL access? My uzhe otmechali, chto zapisi o vhode v sistemu v parol'nom fajle sozdayut vozmozhnost' narusheniya zashchity, esli s nimi ne svyazany paroli, t.e. esli pole parolya pustoe. Problema zaklyuchaetsya v tom, chto v bol'- shih sistemah parol'nyj fajl mozhet sil'no razrastis'. Iskat' v takom fajle vruchnuyu registracionnye zapisi, v kotoryh otsutstvuyut paroli, bylo by utomitel'nym i privodilo by k oshibkam. Pochemu by ne poruchit' sisteme sdelat' za vas etu rabotu? CHTO DELAET access? Komandnyj fajl access ispol'zuet komandu grep s shablonom poiska, opisyvayushchim registracionnuyu zapis', ne imeyushchuyu parolya. Kogda takaya zapis' popadaetsya, ona pechataetsya v standartnyj vyvod. Esli ukazannyh zapisej ne najdeno, vyvoditsya soobshchenie "All logins protected" ("Vse vhody v sistemu zashchishcheny").

    POYASNENIYA

Pervoe, chto delaet access (v strokah 4-8) - proveryaet, pravil'no li ona byla vyzvana. Poskol'ku opcij ne predusmotreno, v komandnoj stroke nichego ne dolzhno byt'. Esli kolichestvo argumentov v komandnoj stroke bol'she nulya, to na standartnoe ustrojstvo registracii oshibok vydaetsya soobshchenie ob oshibke i komandnyj fajl zavershaetsya. Operator v stroke 10 vypolnyaet poisk v parol'nom fajle. Primenya- etsya utilita grep, t.k. my ispol'zuem v etoj komande vyrazhenie. Esli by my ispol'zovali fiksirovannuyu stroku, bolee predpochtitel'noj byla by utilita fgrep, potomu chto ona bystree. Vyrazhenie, zadayushchee poisk, oznachaet sleduyushchee: nachinaya s nachala stroki, najti vse simvoly, ot- lichnye ot dvoetochiya, vplot' do obnaruzheniya dvuh dvoetochij podryad. Es- li vy zaglyanete v fajl /etc/passwd, to uvidite, chto pervoe pole predstavlyaet soboj imya (ot nachala stroki do pervogo dvoetochiya). Zatem mezhdu pervym i vtorym dvoetochiem razmeshchaetsya parol'. Esli parol' ot- sutstvuet, to posle pervogo dvoetochiya srazu zhe sleduet vtoroe - imen- no eto sootvetstvuet nashemu shablonu poiska. Poisk vypolnyatsya v fajle /etc/passwd. Esli grep uspeshno obnaruzhil hotya by odnu zapis', to kod vozvrata nulevoj. Esli grep nichego ne obnaruzhil, to kod vozvrata edi- nica. Togda aktiviziruetsya poslednyaya chast' stroki 10 i vyvoditsya so- obshchenie o tom, chto vse zapisi o vhode v sistemu zashchishcheny. ---------------------------------------------------- IMYA: chkset ---------------------------------------------------- chkset

    NAZNACHENIE

Vydaet spisok vseh fajlov, imeyushchih vklyuchennyj bit razresheniya us- tanovki pol'zovatel'skogo/gruppovogo identifikatora.

    FORMAT VYZOVA

chkset [-l] [dir ...]

    PRIMER VYZOVA

chkset -l Vesti poisk, nachinaya s kornevogo kataloga, poskol'ku katalog ne ukazan. S pomoshch'yu komandy "ls -d" vydat' spisok fajlov, dlya kotoryh ustanovlen v edinicu bit razresheniya ustanovki identifikatora pol'zo- vatelya libo identifikatora gruppy. Rezul'tat otsortirovat' po imeni fajla. (Bit ustanovki pol'zovatel'skogo identifikatora S_ISUID i bit ustanovki gruppovogo identifikatora S_ISGID yavlyayutsya atributami zashchi- ty fajla naryadu s bitami prav dostupa na chtenie/zapis'/vypolnenie i opredeleny v podklyuchaemom fajle /sys/stat.h. - Primech. perev.)

    TEKST PROGRAMMY

1 : 2 # @(#) chkset v1.0 Check for set bits on Author: Russ Sage 4 FORM="-print" 5 SORT="sort" 7 if [ "`echo $1 | cut -c1`" = "-" ] 8 then case $1 in 9 -l) shift 10 FORM="-exec ls -ld {} ;" 11 SORT="sort +7";; 12 *) echo "usage: chkset [-l][file/dir ...]" >&2 13 exit 1;; 14 esac 15 fi 17 if [ "$#" -gt 0 ] 18 then SRC="$*" 19 else SRC="/" 20 fi 22 find $SRC \( -perm -4000 -o -perm -2000 \) $FORM | $SORT

    PEREMENNYE SREDY VYPOLNENIYA

FORM Komanda i opcii dlya listinga SORT Komanda i opcii dlya sortirovki rezul'tata SRC Ishodnyj katalog, ot kotorogo nuzhno nachinat' poisk OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL chkset? My uzhe rassmotreli problemy bezopasnosti, kotorye mogut voznik- nut', kogda dlya ispolnyaemyh fajlov ustanovlen v edinicu bit razreshe- niya ustanovki identifikatora pol'zovatelya. |to oznachaet, chto oni mo- gut zapuskat' interpretator shell s kornevoj ili s drugoj privilegiej vysokogo urovnya. S toj zhe cel'yu mozhet byt' ustanovlen v edinicu bit razresheniya ustanovki identifikatora gruppy. Poetomu sistemnyj admi- nistrator dolzhen nepreryvno razyskivat' i proveryat' vse fajly v sis- teme, dlya kotoryh ustanovleny eti bity, chtoby posmotret', ne ispol'- zuyutsya li oni dlya nesankcionirovannyh celej. Ne dlya vseh interpretatorov shell, narushayushchih zashchitu, vladel'cem yavlyaetsya superpol'zovatel' (root). Odin pol'zovatel' mozhet zapustit' shell, vladel'cem kotorogo yavlyaetsya drugoj pol'zovatel', imeyushchij bo- lee vysokie privilegii. |to fakticheski predostavlyaet pol'zovatelyu, zapustivshemu shell, vse vozmozhnosti vladel'ca fajla. Najti shell-interpretatory, ustanavlivayushchie identifikator pol'- zovatelya ili gruppy, byvaet legko, a byvaet i trudno, v zavisimosti ot ih avtorstva. Legko najti takie, kotorye: a) imeyut neobychnye imena (nekotorye narushiteli lyubyat vystav- lyat' svoi dostizheniya napokaz); b) soderzhat v ispolnyaemom fajle simvol'nye stroki, kotorye mozhno prochitat'; v) razmeshcheny v neobychnom ili ochevidnom kataloge; g) ne imeyut ogranichenij otnositel'no togo, kto mozhet ih zapus- tit'. Dlya izoshchrennyh shell-interpretatorov harakterno sleduyushchee: a) oni imeyut imena, pohozhie na obychnye komandy sistemy UNIX; b) imeyut razmery fajlov, kotorye sootvetstvuyut drugim fajlam, razmeshchennym nepodaleku ot nih; v) soderzhat upryatannye simvol'nye stroki, kotorye ne tak-to legko prochitat'; g) imeyut, vozmozhno, special'nuyu opciyu, zapuskayushchuyu shell, ili dazhe special'nyj parol', neobhodimyj dlya ego zapuska. Samye huliganskie iz nih yavlyayutsya nastoyashchimi komandami sistemy UNIX, peredelannymi v kornevye shell-interpretatory, kotorye zatem pereustanavlivayutsya vmesto pervonachal'nyh shell-interpretatorov. Edinstvennyj nadezhnyj sposob identificirovat' etot poslednij tip - zapustit' pobajtovoe sravnenie mezhdu vashej distributivnoj kopiej ko- mandy sistemy UNIX i toj versiej, kotoraya prisutstvuet v nastoyashchij moment v vashej sisteme. Konechno, pered tem kak vy smozhete proverit' fajly so vklyuchennymi bitami razresheniya ustanovki pol'zovatel'skogo/gruppovogo identifika- tora, vam nuzhno najti vse takie fajly. V sisteme UNIX eto delayut dve komandy: find(1) i ncheck(1M). Utilita find ishchet fajly po nashej toch- noj specifikacii i mozhet byt' ispol'zovana dlya poiska fajlov s zadan- nym naborom prav dostupa, vklyuchaya bity ustanovki identifikatorov. Ncheck pechataet vperemeshku special'nye fajly i fajly s razreshennoj ustanovkoj identifikatora pol'zovatelya. |to ochen' bol'shoj spisok, chtenie i poisk v nem interesuyushchih nas fajlov zanimaet mnogo vremeni. Takim obrazom, polezno sozdat' komandnyj fajl, predostavlyayushchij nam vsyu neobhodimuyu informaciyu i tol'ko takuyu informaciyu. Chkset ispol'- zuet komandu find i ishchet tol'ko fajly so vklyuchennymi bitami razreshe- niya ustanovki pol'zovatel'skogo/gruppovogo identifikatora, tak chto rezul'tat soderzhit lish' neobhodimuyu nam informaciyu, i etim rezul'ta- tom mozhno srazu zhe vospol'zovat'sya. CHTO DELAET chkset? Chkset imeet dva rezhima funkcionirovaniya: odin dlya skanirovaniya vsej sistemy v celom, a drugoj dlya skanirovaniya ukazannyh derev'ev katalogov. |to horoshee svojstvo, tak kak skanirovanie kazhdogo fajla sistemy zanimaet ochen' mnogo vremeni. Esli imeetsya mnogo bol'shih dis- kovyh ustrojstv, proverka vsego soderzhimogo sistemy mozhet zanyat' ce- lyj chas. Utilita chkset takzhe ochen' sil'no zagruzhaet central'nyj pro- cessor iz-za vseh processov, kotorye ona generiruet. Ukazyvaya imena katalogov, vy mozhete vypolnit' proverku lish' na opredelennoj oblasti sistemnogo dereva. Otmetim, odnako, chto poskol'ku chkset pol'zuetsya komandoj find, ona skaniruet ne tol'ko ukazannyj vami katalog, no i VSE podchinennye katalogi. Zametim takzhe, chto chkset obnaruzhivaet VSE fajly s ustanovlennymi v edinicu bitami ustanovki pol'zovatel'sko- go/gruppovogo identifikatora, a ne tol'ko te, vladel'cem kotoryh yav- lyaetsya superpol'zovatel' (root). Rezul'tat raboty chkset mozhno vydat' takzhe dvumya sposobami. Esli ne primenyat' nikakuyu opciyu, to forma vydachi rezul'tata opredelyaetsya komandoj "find ... -print", chto oznachaet polnye marshrutnye imena naj- dennyh fajlov. Zatem eti polnye imena sortiruyutsya. Esli primenyaetsya opciya -l, to dlya formatirovaniya rezul'tata is- pol'zuetsya komanda "ls -ld", porozhdayushchaya dlinnyj format listinga. Pri etom raspechatyvayutsya polnoe ukazanie prav dostupa, chislo svyazej, vla- delec, razmer i imya fajla. |tot rezul'tat takzhe sortiruetsya po ime- nam. Vybirajte tot ili inoj format v zavisimosti ot obstoyatel'stv. Esli vam nuzhno proverit' bol'shoj uchastok sistemy i poluchit' spisok podozritel'nyh fajlov, primenite listing po umolchaniyu (bez opcij), tak kak on kompaktnee i, kak my uvidim pozdnee, zanimaet znachitel'no men'she processornogo vremeni. Esli vy hotite zanyat'sya opredelennym katalogom i posmotret' na ego fajly podrobno, vospol'zujtes' opciej - l. Ona predostavlyaet bol'she informacii i izbavlyaet ot neobhodimosti vruchnuyu nabirat' komandy ls dlya interesuyushchih vas fajlov. Otmetim, chto etu komandu mozhet zapustit' kto ugodno, a ne tol'ko administrator, imeyushchij privilegii superpol'zovatelya. Odnako, esli ona zapuskaetsya obychnym pol'zovatelem, to komanda find vnutri komandnogo fajla chkset ogranichena temi fajlami, k kotorym pol'zovatel' imeet dostup na chtenie. Tak chto vy mogli by predlozhit' bolee privilegiro- vannym pol'zovatelyam zapuskat' chkset v kachestve odnoj iz ih lichnyh mer bezopasnosti. Razumeetsya, esli chkset zapuskaetsya superpol'zova- telem, to ogranicheniya prav dostupa k fajlam nesushchestvenny i mozhno podvergnut' proverke vse fajly.

    PRIMER

# chkset /bin /usr/bin /lib /usr/lib |ta komanda vyzyvaet prosmotr ukazannyh katalogov. V katalogah tipa /usr/lib prosmatrivayutsya vse podchinennye katalogi, chto obespechi- vaet bolee tshchatel'nuyu proverku.

    POYASNENIYA

Pervym delom chkset inicializiruet dve peremennye - FORM i SORT. Peremennaya FORM soderzhit komandu dlya vydachi rezul'tata raboty komandy find, a peremennaya SORT - komandu, opredelyayushchuyu, chto nuzhno sortiro- vat'. V stroke 7 proveryaetsya, yavlyaetsya li pervyj pozicionnyj parametr opciej. Esli da, to operator case (stroki 8-14) smotrit, kakaya eto opciya. Esli eto opciya "-l", to podgotavlivaetsya komanda dlya raspechat- ki rezul'tata (eto my obsudim pozzhe). Komanda dlya utility sort formi- ruetsya tak, chtoby sortirovka shla po polyu vladel'ca. Opciya ubiraetsya iz komandnoj stroki, potomu chto vse posleduyushchie argumenty dolzhny byt' katalogami i my zahotim poluchit' k nim dostup s pomoshch'yu "$#". Esli popalas' opciya, otlichnaya ot "-l", to eto oshibka, vydaetsya soobshchenie ob oshibke (stroka 12), i komandnyj fajl zavershaetsya. Esli ostalos' bolee nulya argumentov, kogda my popadaem v stroku 17, to oni proveryayutsya v cikle, chtoby ubedit'sya, chto vse oni yavlyayutsya katalogami. Esli eto ne katalogi, na standartnoe ustrojstvo registra- cii oshibok vydaetsya soobshchenie ob oshibke i komandnyj fajl zavershaetsya. Esli imeyutsya parametry (t.e. katalogi), to v stroke 18 v pere- mennuyu SRC zanosyatsya vse katalogi. Esli zhe parametrov net, to v pere- mennuyu SRC zanositsya znachenie "/", t.e. kornevoj katalog, chtoby obes- pechit' podrazumevaemuyu startovuyu tochku dlya poiska. Vsya rabota etogo komandnogo fajla vypolnyaetsya fakticheski v ope- ratore find. Komanda find dopuskaet mnozhestvennoe ukazanie katalogov, kotorye postupayut v rezul'tate chteniya ih iz komandnoj stroki i zane- seniya v peremennuyu SRC. Posle togo kak my ukazali komande find, otkuda nachinat' poisk, my ukazyvaem ej, chto nuzhno iskat'. V dannom sluchae nas interesuyut vse fajly, kotorye imeyut vklyuchennyj bit ustanovki pol'zovatel'skogo libo gruppovogo identifikatora. My ob座asnyaem eto komande find putem ukaza- niya prav dostupa, kotorye trebuetsya iskat'. Stroka "-perm -4000" oz- nachaet poisk vseh fajlov, imeyushchih prava dostupa so vklyuchennym bitom ustanovki pol'zovatel'skogo identifikatora i s lyubymi drugimi vklyu- chennymi bitami. Vy mozhete ponimat' etu zapis' kak primenenie simvolov -zamenitelej - 4???. My ishchem kak ustanovku pol'zovatel'skogo identi- fikatora (-4000), tak i ustanovku gruppovogo identifikatora (-2000), poetomu dve stroki prav dostupa soedineny opciej -o, oznachayushchej "or" ("ili"). (Bolee polnoe opisanie prav dostupa v simvolicheskoj i vos'- merichnoj forme privedeno v chmod(1).) Sleduyushchaya zadacha - dobavit' stroku, hranimuyu v peremennoj FORM, v komandnuyu stroku. Esli opciya -l ne byla ispol'zovana, to v peremen- noj FORM hranitsya stroka "-print", a eto znachit, chto find budet pecha- tat' marshrutnye imena najdennyh fajlov. Esli zhe -l ispol'zovalas', to peremennaya FORM soderzhit stroku "-exec ls -ld {} ;". Opciya -exec - eto ochen' gibkaya opciya komandy find, pozvolyayushchaya primenit' lyubye ko- mandy, kotorye za nej sleduyut, k kazhdomu najdennomu fajlu. V dannom sluchae eti komandy vypolnyayut raspechatku v dlinnom formate (-l), pri- chem dlya kazhdogo kataloga (-d) vyvoditsya tol'ko ego imya (a ne soderzhi- moe). Imenno zdes' proishodyat naibol'shie zatraty resursov central'no- go processora, tak kak dlya opcii -l trebuetsya sistemnyj vyzov stat. Iz-za togo, chto dlya kazhdogo fajla trebuetsya komanda ls, ona kazhdyj raz zagruzhaetsya v pamyat' i vypolnyaetsya. Proizvoditsya takzhe dostup k indeksnomu deskriptoru fajla na diske. |to privodit k bol'shim naklad- nym rashodam. Zatem ves' potok dannyh propuskaetsya cherez utilitu sort. Na sa- mom dele my hotim sdelat' sortirovku po vos'momu polyu (vy mozhete pro- verit' eto, vypolniv komandu "ls -l" i izuchiv ee rezul'tat). Utilita sort PROPUSKAET ukazannoe chislo polej, nachinaya s polya 1, yavlyayushchegosya po umolchaniyu startovoj tochkoj, poetomu ispol'zovanie zapisi +7 ozna- chaet perehod k vos'momu polyu, kotorym yavlyaetsya imya fajla.

    ALXTERNATIVNYJ PODHOD

Dlya poiska fajlov s interesuyushchimi nas pravami dostupa mozhno pri- menit' drugoj metod, hotya i bolee medlennyj. On osnovyvaetsya na tom, chto vmesto poiska prav dostupa po chislu, mozhno iskat' ih po simvol'- noj stroke. Dlya etogo nuzhno primenyat' grep. Al'ternativnaya komanda vyglyadit tak: # find $* -exec ls -ld {} \; | grep "^[^ ]*s[^ ]*" |tot variant komandy rabotaet neskol'ko inache. On nahodit kazhdyj fajl iz ukazannyh katalogov i primenyaet k kazhdomu iz nih komandu "ls -ld". Zatem ves' spisok dannyh peredaetsya po konvejeru komande grep. Grep ispol'zuet dlya raspoznavaniya interesuyushchih nas fajlov takoj shab- lon poiska: nachinaya s nachala stroki, najti povtoryayushchijsya simvol, ot- lichnyj ot probela, zatem simvol "s", za kotorym sleduet povtoryayushchijsya simvol, otlichnyj ot probela. Takomu shablonu sootvetstvuyut vse rezhimy prav dostupa, soderzhashchie s, bud' to bit ustanovki pol'zovatel'skogo identifikatora ili bit ustanovki gruppovogo identifikatora. Ne su- shchestvenno, vhodyat li v dannyj rezhim "r", "w", "x" ili "-". Ubediv- shis', chto probelov net, my obespechivaem sootvetstvie shablona tol'ko polyu prav dostupa. Vazhno, chtoby posle s sledovali simvoly, otlichnye ot probelov, tak kak s mozhet vstretit'sya libo v porcii prav dostupa, otnosyashchejsya k vladel'cu, libo v gruppovoj porcii i nigde bol'she. My ne ochen' rekomenduem etot metod, poskol'ku on privlekaet ochen' intensivnuyu obrabotku. Odnako, esli by my ne isprobovali etot metod pervym, my by ne ocenili, chto ispol'zovanie komandy find so strokami "-perm" yavlyaetsya bolee predpochtitel'nym. V silu neveroyatnoj gibkosti sistemy UNIX, imeetsya ochen' mnogo razlichnyh sposobov vypol- neniya odnoj i toj zhe raboty, i mnogie iz etih sposobov mogut davat' odinakovo horoshie rezul'taty, no za raznuyu cenu v smysle bystrodejs- tviya i processornyh zatrat. Pered tem kak primenyat' universal'nuyu utilitu vrode grep dlya resheniya zadachi, rassmotrite, net li drugoj ko- mandy so vstroennoj opciej raspoznavaniya po shablonu. Skoree vsego, primenenie takoj komandy okazhetsya optimal'nee i gorazdo bystree, chem ispol'zovanie grep. S drugoj storony, inogda vam nuzhno bystro reshit' nechasto vstrechayushchuyusya zadachu, ne slishkom zabotyas' ob effektivnosti resheniya. -------------------------------------------------------- IMYA: suw -------------------------------------------------------- suw

    NAZNACHENIE

Prosmatrivaet protokol'nyj fajl komandy su i pechataet imena vseh pol'zovatelej, kotorye nelegal'no prevratilis' v superpol'zovatelya pri pomoshchi komandy su (substituted user, zamenennyj pol'zovatel').

    FORMAT VYZOVA

suw [-m] [sulog]

    PRIMER VYZOVA

suw Zapusk v rezhime po umolchaniyu, proverka fajla /usr/adm/sulog i vydacha zapisej o narushitelyah v standartnyj vyvod.

    TEKST PROGRAMMY

1 static char id[]="@(#)suw v1.0 Author: Russ Sage"; 3 # include 5 # define FALSE 0 6 # define TRUE 1 7 # define MATCH 0 8 # define BSIZ 80 10 main(argc,argv) 11 int argc; 12 char *argv[]; 13 { 14 register int alert, c, mail, n; 15 FILE *fp1, *fp2; 16 char *p, *uname, line[BSIZ], tmp[BSIZ], 17 *log = "/usr/adm/sulog"; 19 static char *legal[] = {sage-root\n","root-root\n",NULL}; 20 static char *adm[] = {"sage",NULL}; 23 mail = FALSE; 25 if (argc > 1 && argv[1][0] == '-') 26 switch (argv[1][1]) 27 { 28 case 'm': 29 mail = TRUE; 30 --argc; 31 ++argv; 32 break; 33 default: 34 fprintf(stderr,"suw: invalid argument %s\n", argv[1]); 35 fprintf(stderr,"usage: suw [-m] [sulog]\n"); 36 exit(1); 37 } 39 if (argc == 2) 40 log = *++argv; 42 if ((fp1 = fopen(log,"r")) == NULL) 43 { 44 fprintf(stderr,"suw: error opening %s\n",log); 45 fprintf(stderr,"usage: suw [-m] [sulog]\n"); 46 exit(1); 47 } 49 sprintf(tmp,"/tmp/suw%d",getpid()); 50 if ((fp2 = fopen(tmp,"w+")) == NULL) 51 { 52 fprintf(stderr,"suw: error opening %s\n",tmp); 53 fprintf(stderr,"usage: suw [-m] [sulog]\n"); 54 exit(1); 55 } 57 while (fgets(line,sizeof(line),fp1) != NULL) 58 { 59 p = line + 15; 60 if (*p == '+') 61 { 62 p = p + 2; 63 while (*p != ' ') p++; 64 p++; 65 uname = p; 66 while (*p && *p++ != '-') 67 continue; 69 if (strcmp (p,"root\n") == MATCH) 70 { 71 alert = TRUE; 72 for (n=0; legal[n] != NULL; n++) 73 if (strcmp (uname,legal[n]) == MATCH) 74 { 75 alert = FALSE; 76 break; 77 } 78 if (alert) 79 fprintf(fp2,"Illegal --> %s", line); 80 } 81 } 82 } 84 if (mail) 85 { 86 fclose(fp2); 87 for (n=0; adm[n] != NULL; n++) 88 { 89 sprintf(line,"cat %s | mail %s",tmp,adm[n]); 90 system(line); 91 } 92 } 93 else 94 { 95 rewind(fp2); 96 while ((c = getc(fp2)) != EOF) 97 putc(c, stdout); 98 fclose(fp2); 99 } 101 fclose(fp1); 102 unlink(tmp); 103 } OPISANIE ZACHEM NAM NUZHNA PROGRAMMA suw? Vy pomnite, chto komanda su, pozvolyayushchaya pol'zovatelyam izmenyat' svoyu individual'nost' (i prava dostupa) mozhet byt' istochnikom problem bezopasnosti. Sistema hranit protokol vseh tranzakcij su v fajle sulog. Hotya bolee opytnye narushiteli mogut umet' zatirat' svoi sledy, fajl sulog polezen dlya otslezhivaniya potencial'nyh lazeek v sisteme zashchity. |tim sposobom mozhno pojmat' mnogih narushitelej-lyubitelej. Es- testvenno, my hotim avtomatizirovat' etot process, chtoby sistema vy- polnyala proverku i signalizirovala nam pri obnaruzhenii chego-libo opasnogo. Krome togo, dannaya programma demonstriruet metodiku, koto- ruyu mozhno ispol'zovat' dlya otslezhivaniya drugih protokol'nyh fajlov. CHTO DELAET suw? Programma suw chitaet i analiziruet protokol'nye fajly komandy su. Kazhdoe uspeshnoe prevrashchenie v superpol'zovatelya pri pomoshchi koman- dy su, obnaruzhennoe v protokol'nom fajle, sveryaetsya so spiskom razre- shennyh superpol'zovatelej. Esli pol'zovatelyu ne razresheno byt' super- pol'zovatelem, to konkretnaya zapis' o nem pechataetsya, chtoby opovestit' administratora. Po umolchaniyu zapisi o narushitelyah pechatayutsya v standartnyj vy- vod. Protokol'nym fajlom po umolchaniyu yavlyaetsya /usr/adm/sulog. Esli primenyaetsya opciya -m, to zapisi o narushitelyah rassylayutsya po pochte administratoram, zanesennym v predopredelennyj spisok. Esli nuzhno proverit' drugoj protokol'nyj fajl, naprimer /usr/adm/Osulog, to ego imya mozhno ukazat' v komandnoj stroke.

    PRIMERY

1. # suw -m Proverit' fajl /usr/adm/sulog i razoslat' zapisi o narushitelyah administratoram, opredelennym v tekste programmy. 2. # suw /usr/adm/Osulog Proverit' fajl /usr/adm/Osulog i napechatat' zapisi o narushitelyah v standartnyj vyvod.

    POYASNENIYA

V samom nachale programmy opredelyayutsya i inicializiruyutsya vse pe- remennye i spiski. V stroke 14 opredeleny dva flaga: alert (signal trevogi) i mail (pochta). Oni imeyut znachenie TRUE ili FALSE. V etoj programme ispol'zuyutsya dva fajla: protokol'nyj fajl komandy su, koto- ryj vy vybiraete, i vremennyj fajl. Poskol'ku my sobiraemsya primenyat' nekotorye podprogrammy standartnogo vvoda-vyvoda (stdio), my pol'zu- emsya ukazatelyami na fajly fp1 i fp2, a ne deskriptorami fajlov. Pri- menyaetsya dva bufera: odin dlya zachityvaniya v nego dannyh iz protokol'- nogo fajla komandy su, a drugoj - dlya hraneniya imeni vremennogo fajla. Pervonachal'no imenem protokol'nogo fajla yavlyaetsya sulog. Esli vmesto nego ispol'zuetsya drugoe imya fajla, to peremennaya log pereus- tanavlivaetsya na eto imya. Zatem inicializiruyutsya predopredelennye spiski razreshennyh su- perpol'zovatelej i administratorov. V nashem primere dvumya razreshenny- mi superpol'zovatelyami yavlyayutsya sage (sage-root) i root (root-root). Dlya togo chtoby prisposobit' eto dlya vashej sistemy, pomestite zdes' imena lyudej, kotorym vy hotite razreshit' pol'zovat'sya komandoj su dlya prevrashcheniya v superpol'zovatelej. Spisok administratorov takzhe dolzhen soderzhat' sootvetstvuyushchie imena. V dannom primere v spisok administ- ratorov vhodit odno imya - sage. |to znachit, chto sage budet edinstven- nym, kto poluchit pochtu, esli ukazana pochtovaya opciya. Podrazumevaemoe sostoyanie rassylki pochty ustanavlivaetsya v stro- ke 23 na znachenie FALSE, t. e. pochty net. |to delaetsya dlya togo, chto- by posle razbora komandnoj stroki peremennaya mail imela pravil'noe znachenie. Dalee vypolnyaetsya proverka na oshibki. Pervaya proverka vyglyadit neskol'ko strannoj, no na samom dele vpolne ponyatna. Peremennaya argc vozvrashchaet chislo argumentov komandnoj stroki, a argv ukazyvaet na massiv, soderzhashchij sami argumenty, kazhdyj iz kotoryh sam yavlyaetsya massivom simvolov. Esli komandnaya stroka voobshche imeet kakie-libo ar- gumenty (argc > 1) i pervym simvolom pervogo argumenta (argv[1][0]) yavlyaetsya defis, to proveryaetsya, korrektnaya li eto opciya. S cel'yu pro- verki vtorogo simvola pervogo argumenta ispol'zuetsya operator case. Esli argumentom yavlyaetsya simvol m, to flag mail ustanavlivaetsya v sostoyanie TRUE, chislo argumentov (argc) umen'shaetsya na edinicu, a ukazatel' na massiv argumentov (argv) na edinicu uvelichivaetsya. |to sluzhit toj zhe celi, chto i udalenie argumentov iz komandnoj stroki v komandnyh fajlah interpretatora shell. Napomnim, chto argv yavlyaetsya v dejstvitel'nosti massivom ukazatelej, a massivy traktuyutsya tochno tak zhe, kak stroki, s bazovym adresom i smeshcheniem. Poetomu argv[0] == argv, i argv[1] == ++argv. Esli opciya otlichaetsya ot -m, to v stan- dartnyj vyvod pechataetsya soobshchenie ob oshibke i programma zavershaetsya. V stroke 39 proveryaetsya schetchik argumentov, chtoby ponyat', est' li eshche odin argument. Napomnim, chto argv vsegda na edinicu otstaet ot argc, potomu chto samo imya komandy yavlyaetsya pervym argumentom massiva. Sledovatel'no, dlya togo chtoby poluchit' vtoroj argument, my dolzhny pe- rejti k sleduyushchej pozicii (*++argv). Esli argument imeetsya, on dolzhen byt' imenem protokol'nogo fajla, i eto imya zanositsya v peremennuyu log. Dalee my pytaemsya otkryt' fajly, ispol'zuemye v programme. Sna- chala otkryvaetsya dlya chteniya protokol'nyj fajl. Esli eto ne srabatyva- et (vozvrashchen nulevoj ukazatel'), to pechataetsya soobshchenie ob oshibke i programma zavershaetsya. Zatem v stroke 49 sozdaetsya imya vremennogo fajla s dobavleniem k nemu identifikatora processa, chtoby garantiro- vat' unikal'nost' imeni fajla. |tot fajl otkryvaetsya na chtenie i za- pis'. Esli eta operaciya ne udaetsya, pechataetsya soobshchenie ob oshibke i vypolnenie zavershaetsya. V strokah 57-103 zaklyuchen glavnyj cikl. Upravlyayushchaya chast' glav- nogo cikla opredelyaetsya tem, vse li dannye prochitany iz protokol'nogo fajla. Esli bol'she nikakie bajty prochitat' nel'zya, to fgets (stroka 57) vozvrashchaet nulevoj ukazatel', chto zavershaet cikl while. Kogda stroka dannyh chitaetsya iz protokol'nogo fajla, eti dannye pomeshchayutsya v massiv line. My primenyaem ukazatel' na simvol dlya prohoda vdol' stroki i poiska zapisi o narushitele. Izuchaya zapis' v vashem fajle sulog, vy mozhete uvidet', gde naho- dyatsya interesuyushchie nas polya. Snachala ukazatel' smeshchaetsya na 15 simvo- lov ot nachala stroki. |to poziciya flaga, opredelyayushchego, byla li us- peshnoj komanda su. Esli ona byla uspeshnoj, ukazatel' uvelichivaetsya na dva, chtoby propustit' probel i ustanovit' ukazatel' na imeni termina- la. |to imya imeet peremennuyu dlinu, poetomu my orientiruemsya po pro- belu v konce imeni. V strokah 63-64 primenyaetsya cikl while, kotoryj zastavlyaet ukazatel' propustit' vse simvoly, otlichnye ot probela. Za- tem on uvelichivaetsya na edinicu eshche raz, chtoby propustit' probel mezh- du imenem terminala i strokoj imeni pol'zovatelya. V etot moment ukazatel' nahoditsya v poslednem pole stroki. Uka- zatel' na eto pole pomeshchaetsya v peremennuyu uname, chtoby zatem ee mozh- no bylo ispol'zovat' dlya sravneniya strok. Sleduyushchij cikl while (stro- ki 66-67) prohodit po stroke, poka ne popadet na simvol defisa. Cikl while vypolnyaetsya do teh por, poka ukazatel' ne ukazyvaet na konec stroki (t.e. na nelevoj ukazatel', *p == '\0') i eshche ne ukazyvaet na defis. Poskol'ku v cikle ispol'zuetsya p++, to kogda my popadaem na nulevoj ukazatel', cikl zavershaetsya, prichem p ukazyvaet na sleduyushchij simvol. Vypolnyaetsya proverka, byl li superpol'zovatelem tot, kto prime- nil komandu su. Esli byl, to vzvoditsya flag alert, i my dolzhny prove- rit', razreshennyj li eto superpol'zovatel'. Cikl for (stroki 72-77) probegaet po vsem imenam v massive, soderzhashchem imena razreshennyh pol'zovatelej, do teh por, poka my ne obnaruzhim poslednyuyu zapis', ko- toraya yavlyaetsya pustoj. Stroka s imenem pol'zovatelya, ustanovlennaya predvaritel'no, sveryaetsya s kazhdoj zapis'yu v massive razreshennyh imen. Esli oni sovpadayut, to my mozhem predpolozhit', chto s dannym pri- meneniem komandy su vse v poryadke. Togda my vyklyuchaem flag alert i zavershaem sravnenie imen. Esli zhe po okonchanii cikla flag alert vse eshche vzveden, znachit imya ne soderzhitsya v spiske razreshennyh - eto, vozmozhno, narushitel'. Vsya zapis' celikom zapisyvaetsya vo vremennyj fajl i upravlenie peredaetsya nazad v nachalo cikla dlya sleduyushchej ope- racii chteniya. Kogda vse dannye prochitany, cikl while zavershaetsya. V stroke 84 proveryaetsya, vzveden li flag mail. Esli da, to vremennyj fajl zakry- vaetsya (chtoby srabotala komanda cat) i vypolnyaetsya eshche odin cikl for (stroki 87-91). On perebiraet vseh administratorov i zavershaetsya, kogda popadaet na nulevoj ukazatel' v konce massiva. Dlya kazhdogo iz oboznachennyh administratorov konstruiruetsya komanda mail i posylaetsya v sistemu UNIX pri pomoshchi sistemnogo vyzova (stroka 90). Metod otp- ravki po pochte vremennogo fajla zaklyuchaetsya v primenenii k etomu faj- lu komandy cat i peredache dannyh po konvejeru komande mail. Esli flag mail vyklyuchen, to vremennyj fajl nuzhno napechatat' v standartnyj vyvod, a ne otpravit' po pochte. Dlya togo chtoby sdelat' eto kak mozhno bystree, vremennyj fajl (kotoryj poka eshche otkryt) "pe- rematyvaetsya" (my pozicioniruemsya v ego nachalo) i posimvol'no propus- kaetsya po ciklu. Obratite vnimanie, chto dannyj cikl yavlyaetsya serdce- vinoj komandy cat, kak opisano na stranice 153 knigi Kernigana i Ritchi "YAzyk programmirovaniya Si" (B.W.Kernighan, D.M.Ritchie. The C Programming Language). Posle togo kak vremennyj fajl napechatan, on zakryvaetsya. Nakonec, zakryvaetsya protokol'nyj fajl i udalyaetsya vre- mennyj fajl.

    * GLAVA 10. Smeshannye priemy *

Vvedenie Sposoby preobrazovaniya v yazyke shell conv Moduli preobrazovaniya dtoh dtoo htod htoo Tonkosti bc otod otoh Priemy yazyka shell dlya obespecheniya gibkosti programm Hitrosti yazyka shell CHitajte vvod s klaviatury, poka nahodites' v cikle, prisoedinennom k programnomu kanalu Zapusk dochernego yazyka shell Urovni yazyka shell i vvod-vyvod Vstroennyj vvod S redaktorom ed S fajlom a.out C arhivami yazyka shell Upravlenie statusom cikla Fil'try i sintaksis Nedostatki/osobennosti programmirovaniya na yazyke shell Programma dlya perenapravleniya oshibki Nekorrektnyj kod vozvrata Hitrosti redaktora Vi Vozvrashchenie v yazyk shell Podderzhka Escape Makrosy Komanda "One-Liners" - kroshechnaya, no moshchnaya . - 2 - Vvedenie |ta kniga yavlyaetsya itogom mnogoletnej raboty po podboru i razvitiyu instrumental'nyh sredstv OS UNIX. Mnogie veshchi, kotorye ne hotelos' by ostavlyat' bez vnimaniya, ne vpisalis' v kontekst predydushchih glav. |to i zakonchennye procedury, podobnye predstavlennym ranee, i nebol'shie, no ochen' moshchnye fragmenty programm. Krome togo, vyskazany nekotorye poleznye idei i predstavleny metody obrabotki obshchih situacij na yazyke shell. Sposoby preobrazovaniya Poskol'ku komp'yutery i ih rezidentnye utility ispol'zuyut pri rabote raznye sistemy schisleniya, chasto voznikaet neobhodimost' preobrazovaniya osnovanij sistem schisleniya. |ti preobrazovaniya obespechivayutsya horosho znakomymi specialistam komandami UNIX bc (kal'kulyator proizvol'noj tochnosti) i dc (kotoraya predpolozhitel'no rasshifrovyvaetsya kak nastol'nyj kal'kulyator ("desk calculator")). Bol'shinstvo iz sushchestvuyushchih vozmozhnostej libo nosyat ochen' ogranichennyj harakter, libo ih tyazhelo ispol'zovat' v ryade situacij, poetomu budet rassmotren vopros kak ispol'zovat' sushchestvuyushchie vozmozhnosti UNIX, chtoby lyuboe preobrazovanie bylo kak mozhno bolee legko osushchestvimym. --------------------------------------------------------------------- Nazvanie: conv --------------------------------------------------------------------- conv Perevodit chisla iz odnoj sistemy schisleniya v druguyu Naznachenie: Obespechivaet vozmozhnost' preobrazovaniya osnovaniya sistemy schisleniya Vyzov conv Primer vyzova: $conv Vyzvat' glavnoe menyu razlichnyh preobrazovanij 2 Vybrat' opciyu 2 ( iz shestnadcatirichnoj v desyatichnuyu) FFF Vvesti shestnadcatirichnoe chislo FFF. Na vyhode programmy poluchim desyatichnyj ekvivalent Ishodnyj tekst dlya funkcii conv 1 : 2 # @(#) conv v1.0 Preobrazovanie osnovaniya sistemy schisleniya, ispol'zuya shell Avtor: Russ Sage 3 4 while : 5 do 6 echo " 7 8 Preobrazovanie osnovanij 9 ------------------------ 10 1 - Desyatichnoe v shestnadcatirichnoe 11 2 - SHestnadcatirichnoe v desyatichnoe 12 3 - Desyatichnoe v vos'merichnoe 13 4 - Vos'merichnoe v desyatichnoe 14 5 - Vos'merichnoe v shestnadcatirichnoe 15 6 - SHestnadcatirichnoe v vos'merichnoe 16 17 enter choice (1-6, <>): \c" 18 read CHOICE 19 20 case $CHOICE in 21 "") exit;; 22 1) echo "\pVvedite desyatichnoe chislo (<> to exit): \c" 23 read DEC 24 if [ "$DEC" = ""] 25 then exit 26 fi 27 HEX='. dtoh' 28 echo "\n${DEC}d = ${HEX}x";; 29 2) echo"\nVvedite shestnadcatirichnoe chislo v verhnem registre (<> to exit): \c" 30 read HEX 31 if [ "$HEX" = ""] 32 then exit 33 fi 34 DEC='. htod' 35 echo "\n${HEX}x= ${DEC}d;; 36 3) echo "\nVvedite desyatichnoe chislo v verhnem registre (<> to exit): \c" 37 read DEC 38 if [ "$DEC" = ""] 39 then exit 40 fi 41 OCT='. dtoo' 42 echo "\n${DEC}d = ${OCT}o";; 43 4) echo "\nVvedite vos'merichnoe chislo (<> to exit): \c" 44 read OCT 45 if [ "$OCT" = ""] 46 then exit 47 fi 48 OCT='. otod' 49 echo "\n${OCT}o = ${DEC}d";; 50 5) echo "\nVvedite vos'merichnoe chislo (<> to exit): \c" 51 read OCT 52 if [ "$OCT" = ""] 53 then exit 54 fi 55 HEX='. otoh' 56 echo "\n${OCT}o = ${HEX}x";; 57 6) echo "\nVvedite shestnadcatirichnoe chislo v verhnem registre (<> to exit): \c" 58 read NEH 59 if [ "$NEH" = ""] 60 then exit 61 fi 62 OCT='. htoo' 63 echo "\n${HEX}x = ${OCT}o";; 64 *) echo "\n$CHOICE-neizvestnaya komanda";; 65 esac 66 done Peremennye okruzheniya CHOICE - Vybor komand iz glavnogo menyu DEC - Vydaet desyatichnoe znachenie kak rezul'tat preobrazovaniya HEX - Vydaet shestnadcatirichnoe znachenie kak - 4 - rezul'tat preobrazovaniya OCT - Vydaet vos'merichnoe znachenie kak rezul'tat preobrazovaniya Opisanie Zachem nam nuzhna funkciya conv ? Vypolnenie chislovyh operacij bol'shogo ob容ma v komandnyh fajlah yazyka shell - eto daleko ne samaya horoshaya ideya. Komandnye fajly yavlya- yutsya ves'ma medlennymi sami po sebe, a vypolnenie matematicheskih ope- racij eshche bol'she zamedlyaet ih rabotu. Odnako, procedury yazyka shell imeyut matematicheskie vozmozhnosti, i Vy, vozmozhno, zahotite imi vospol'zovat'sya. Esli Vam nuzhno preobrazovat' neskol'ko chisel v pro- cesse napisaniya programmy, to dlya etoj celi dostatochno udobno vyzvat' proceduru yazyka shell. Poskol'ku conv - eto programma, upravlyaemaya menyu, Vam ne pridetsya bespokoit'sya o zapominanii slozhnogo sintaksisa, kotryj ispol'zuyut nekotorye sistemnye utility preobrazovaniya. CHto delaet conv? |to instrumental'noe sredstvo obespechivaet vozmozhnost' perevoda chisel iz odnoj sistemy schisleniya v druguyu. Mozhno perevodit' desyatichnye, shestnadcatirichnye i vos'merichnye dannye. CHislo, zapisannoe v odnoj iz etih form, mozhet byt' perevedeno v lyubuyu iz dvuh ostavshihsya form. Rezhim raboty programmy vybiraetsya iz glavnogo menyu. V menyu est' shest' punktov. Posle togo kak Vy vybiraete chislo mezhdu 1 i 6, programma prosit Vas vvesti chislo kotoroe Vy hotite preobrazovat'. Proishodit preobrazovanie i na vyhode programmy Vy poluchaete dva znacheniya - chislo, kotoroe Vy preobrazovyvaete i chislo, k kotoromu ono bylo preobrazovano. Preobrazovaniya osushchestvlyayutsya putem vyzova vneshnih procedur, o kotoryh budet idti rech' dal'she v etoj glave, tak chto pered zapuskom conv neobhodimo ubedit'sya, chto Vy vklyuchili ih v vashu sistemu i razmestili v tom zhe kataloge, chto i conv. Esli Vy vvedete komandu, ne voshedshuyu v vysheupomyanutyj perechen', to budet vydano soobshchenie ob oshibke i opyat' budet vyvedeno glavnoe menyu. Poyasnenie Stroki 4-66 - eto odin bol'shoj beskonechnyj cikl while. My ispol'zuem beskonechnyj cikl, chtoby v sluchae oshibochnogo vvoda programma vernulas' v glavnoe menyu dlya povtornogo vvoda. Dlya togo, chtoby vyjti iz programmy, nuzhno prervat' cikl, t.e. vyjti iz cikla. Stroki 6-17 pechatayut menyu i vydayut podskazku dlya vybora. Esli Vy prosto nazhmete "Vvod", programma zavershit svoyu rabotu. Stroka 18 chitaet vvod s klaviatury, i stroki 20-65 vypolnyayut vybor po usloviyu dlya etoj velichiny. Esli poluchen nulevoj (pustoj) vvod, to programma zavershaet svoyu rabotu. Stroki 22-28 osushchestvlyayut perevod chisel iz desyatichnoj v shestnadcatirichnuyu sistemy schisleniya. Poskol'ku vse moduli perevoda otvechayut odnomu i tomu zhe obrazcu, to detal'no my rassmotrim tol'ko dannyj modul'. Podskazka zaprashivaet chislo v stroke 23. V strokah 24-26 proveryaetsya, ne bylo li vvedennoe znachenie pustym. Stroka 27 vyglyadit neskol'ko zagadochno, vyzyvaya odin iz vneshnih komandnyh fajlov dtoh dlya preobrazovaniya desyatichnyh chisel v shestnadcatiirichnye. Obratite vnimanie na to kak odna programma vypolnyaet druguyu. Komandnyj fajl dtoh zapuskaetsya, ispol'zuya komandu ".". |to oznachaet : "Vypolnite programmu, ispol'zuya tot zhe shell". Procedura dtoh ispol'zuet peremennuyu DEC dlya vvoda chisla i vydaet - 5 - preobrazovannoe chislo na standartnyj vyvod. CHtoby zapisat' eto chislo v peremennuyu, my delaem prisvoenie, potom zapuskaem programmu, ispol'zuya komandnuyu podstanovku. Stroka 28 vydaet na ekran pervonachal'noe desyatichnoe chislo i shestnadcatirichnoe, k kotoromu ono bylo preobrazovano. Varianty 2, 3, 4, 5 i 6 rabotayut analogichno. Edinstvennoe, chto menyaetsya - eto imya peremennoj, kotoroe sootvetstvuet tipu preobrazovaniya i nazvanie komandnogo fajla (skripta), kotoryj vyzyvaetsya dlya etogo preobrazovaniya. Moduli preobrazovaniya Teper' davajte rassmotrim otdel'no kazhdyj iz modulej perevoda. |ti moduli ili komandnye fajly yazyka shell ispol'zuyut komandu UNIX bc, chtoby osushchestvlyat' preobrazovaniya osnovanij sistem schisleniya. Nel'zya skazat', chto komanda bc - eto naibolee prostoj i udobnyj sposob perevoda, no tem ne menee ona rabotaet, i edinstvennoe, chto nam nuzhno, - eto izuchit' ee i pomestit' v komandnyj fajl. --------------------------------------------------------------------- Nazvanie : dtoh --------------------------------------------------------------------- dtoh Desyatichnye v shestnadcatirichnye. Naznachenie: Preobrazovyvaet vhodnye desyatichnye chisla v vyhodnye shestnadcatirichnye chisla. Sintaksis: $DEC="decimal_number"; HEX='.dtoh' Primer vyzova $DEC="25";HEX='.dtoh' $echo $HEX Prisvoit' DEC nachal'noe znachenie 25, vyzvat' dtoh dlya ego preobrazovaniya i zapisat' rezul'tat v HEX. Vyvesti rezul'taty na ekran. Ishodnyj tekst dlya dtoh 1 : 2 # @(#) dtoh v1.0 Preobrazovanie yazyka shell--desyatichnye v shestnadcatirichnye Avtor: Russ Sage 3 4 bc < HEX $ echo "shestnadcatirichnoe chislo: 'cat HEX'" Oboznachenie () zapuskaet vyzyvaemuyu proceduru v dochernem yazyke shell. Ispol'zuya "." dlya ee vypolneniya, my po prezhnemu imeem dostup k peremennoj DEC. Standartnyj vyvod perenapravlyaetsya v HEX. |ho soprovozhdenie poluchaet znachenie, ispol'zuya komandnuyu podstanovku. Rezul'tat cat pomeshchaetsya v eho predlozhenie. --------------------------------------------------------------------- Nazvanie: dtoo --------------------------------------------------------------------- dtoo Desyatichnye v vos'merichnye Naznachenie Perevodit vhodnye desyatichnye chisla v vyhodnye vos'merichnye. Sintaksis: DEC="decimal_number"; OCT='.dtoo' Primer vyzova $DEC="16";OCT='.dtoo' - 7 - $echo $OCT Prisvoit' DEC nachal'noe znachenie 16, vyzvat' dtoo dlya ee preobrazovaniya i zapisat' rezul'tat v OCT. Vyvesti rezul'taty na ekran. Ishodnyj tekst dlya dtoo 1 : 2 # @(#) dtoo v1.0 Preobrazovanie yazyka shell--desyatichnye v vos'merichnye Avtor: Russ Sage bc < idfile Komanda ls zapuskaetsya kak dochernij shell, ispol'zuya oboznachenie (). Dochernij shell pomeshchaetsya v fonovyj rezhim, ispol'zuya simvol & . Kogda rezul'tat processa id otobrazhen, on napravlyaetsya v fajl oshibok dochernego yazyka shell, kotoryj ego vypolnyaet. My prosto perenapravlya- em standartnuyu oshibku v fajl i poluchaem chislo! Teper' my mozhem sde- lat' chto-nibud' tipa: $ kill -9 'cat idfile' gde process id, peredannyj kill, generiruetsya iz komandy cat, kotoraya pechataet process id, zahvachennyj ranee. |to mozhet dat' programmam opciyu "kill self", gde oni mogut otslezhivat' ih id, chtoby vam ne prishlos' eto delat'. Programma watch, kotoruyu my videli v glave 6 delaet nechto podobnoe. Vstroennyj vvod Redaktor vi udoben do teh por, poka Vam ne nuzhno delat' postrochnoe redaktirovanie teksta ili redaktirovanie v komandnom rezhime. Sed tozhe neplohoj redaktor, no v nem ne predusmotrena vozmozhnost' peremeshcheniya po fajlu. Sed mozhet peremeshchat'sya tol'ko vpered po fajlu do konca fajla. Vse nashi problemy mozhet reshit' skromnyj redaktor ed. S redaktorom ed Ed yavlyaetsya interaktivnym redaktorom i v nem est' vse neobhodimoe dlya obrabotki vyrazhenij. Poskol'ku on chitaet standartnyj vvod dlya svoih komand, my mozhem pomeshchat' v stdin vstroennyj tekst dlya - 12 - upravleniya sobstvenno redaktorom. Ed chitaet komandy, kak esli by oni byli dany s klaviatury. On ne znaet, chto zapushchen v komandnom rezhime. |to otkryvaet sovershenno novyj sposob ispol'zovaniya moshchi interaktivnogo redaktirovaniya v komandnom rezhime. V kachestve primera rassmotrim sleduyushchuyu programmu. Pomnite, chto vse special'nye simvoly v yazyke shell dolzhny byt' zaklyucheny v kavych- ki, naprimer $. Esli oni ne zaklyucheny v kavychki, to vvod budet nekor- rektnym. ed file << -! 1, \$s/^ *// w q ! V etom primere redaktiruetsya fajl pod nazvaniem "file" i nad nim vypolnyaetsya neskol'ko komand. Pervaya komanda govorit "Ot pervoj stroki do poslednej, dlya kazhdoj stroki, imeyushchej pustye simvoly v nachale stroki, za kotorymi sleduet lyuboe kolichestvo takih zhe simvolov, zamenit' eti simvoly "nichem". Zapishite fajl i vyjdite." |ta procedura udalyaet probely iz nachala stroki. S fajlom a.out Vozmozhnost' vstroennogo teksta takzhe mozhno ispol'zovat', chtoby avtomatizirovat' zapusk programm. Vam nuzhno zapisat' vhodnye dannye, neobhodimye, chtoby programma vypolnyala zhelaemuyu zadachu, i pomestit' ih v tekst programmy. (|to nechto vrode postroeniya makrosov klaviatury dlya prikladnyh programm dlya PC). V sleduyushchem primere ispolnyaemyj fajl a.out zapuskaetsya kak dochernij shell. Ego vvod beretsya iz samogo fajla, a vyvod peredaetsya komande more, tak chto my mozhem sdelat' postranichnyj vyvod. $ (a.out < text > input > lines > ! ) | more |to mozhno napechatat' neposredstvenno s klaviatury. My ispol'zuem simvoly skobok, poskol'ku, esli neposredstvenno pechatat' etot kod, shell budet vydavat' podskazku PS2 vplot' do znaka !, zatem vypolnit komandu. Edinstvennoe, chto my mozhem sdelat', chtoby on ne vyshel avtomaticheski - eto prodolzhat' zaprashivat' vvod, opuskaya ego na uroven' nizhe. C arhivami yazyka shell Arhivy yazyka shell - eto odin iz samyh prostyh sposobov upako- vat' tekst v samoustanavlivayushchuyusya programmu. Ideya sostoit v tom, chto my ispol'zuem komandnyj fajl yazyka shell, chtoby upakovat' nekotoryj tekst. |tot tekst mozhet byt' dokumentom, komandnym fajlom ili dazhe ishodnym tekstom programmy. My ispol'zuem konstrukciyu vstroennogo teksta, chtoby peredat' tekst v shell, kotoryj potom peresylaet ego v predopredelennye fajly. Nizhe priveden primer arhiva, kotoryj mozhet byt' v fajle. $ cat archive - 13 - # # |to arhivnyj fajl tekstovyh fajlov 1, 2 i 3 # echo "izvlekaem tekstovyj fajl 1" cat > text1.sh << ! # # |to primer tekstovogo fajla 1 # who | sort ! echo "izvlekaem tekstovyj fajl 2" cat > text2 << ! |to soderzhimoe vtorogo fajla. |to ne programma, a prosto tekst. Zamet'te, chto emu ne nuzhno strok kommentariya, potomu chto zapushchennyj shell znaet, chto eto vvod. No ne pytajtes' zapuskat' text2, t.k. u Vas vse ravno nichego ne poluchitsya. ! echo "izvlekaem tekstovyj fajl 1" cat > text3.c << ! /* |to soderzhimoe fajla 3, Si programma */ main() { printf("hello world"); } ! # # konec arhivnogo fajla # Pri vypolnenii arhiv prohodit cherez tri komandy cat. Pervaya ko- manda cat sozdaet fajl text1.sh (komandnyj fajl yazyka shell), text2 (obychnyj tekst) i text3.c (Si-programma). Vse eto vypolnyaetsya posle togo, kak Vy naberete na klaviature "archive". |to udobno, esli nuzhno perenesti tekst v drugoe mesto. Vmesto togo chtoby peresylat' tri faj- la, nam nuzhno pereslat' odin. Vmesto treh fajlov, soedinennyh vmeste, u nas tri otdel'no upakovannnyh fajla, kazhdyj iz kotoryh vosstanavli- vaet sebya pri zapuske arhiva. Takim obrazom, nam ne pridetsya gadat', pytayas' predstavit' kakoj tekst v kakoj fajl popadet.