Rassel Sejdzh. Priemy professional'noj raboty v UNIX
Perevod "Tricks of the UNIX Masters" by Russel G. Sage
---------------------------------------------------------------
From: Vladimir Kazennov
---------------------------------------------------------------
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.
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
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.
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.
|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.
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.
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.
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.
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.
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).
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
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.
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.
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 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
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'.
|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.1. tree - vizualizaciya fajlovogo dereva
----------------------------------------------------
IMYA: TREE
----------------------------------------------------
tree - vyvod na ekran struktury fajlovogo dereva
Nahodit vse fajly v fajlovom dereve i vyvodit na ekran imena faj-
lov, pokazyvaya ierarhicheskuyu strukturu fajlovogo dereva.
tree [dir]
$ tree $HOME
Vyvodit strukturu fajlovogo dereva registracionnogo kataloga.
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.
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/*).
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.
Projti fajlovoe derevo i napechatat' pervye neskol'ko strok kazhdo-
go fajla. Esli ne ukazan katalog, to thead dejstvuet kak fil'tr.
thead [dir...]
$ find $HOME/src -name "*.c" -print | sort | thead
Pechataet zagolovki (pervye neskol'ko strok) vseh moih ishodnyh
fajlov na yazyke Si.
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.
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.
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.
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.
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
Obhodit fajlovoe derevo i ishchet v kazhdom fajle ukazannuyu stroku.
Esli ne ukazan nikakoj katalog, tgrep dejstvuet kak fil'tr.
tgrep [-c|-h] string [file ...]
# tgrep "profanity" /
Poisk slova "profanity" po vsej sisteme (superpol'zovatel' snova
na trope vojny!)
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.
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.
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!
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
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.
paths [-l] [-s] file [file ...]
$ paths -l ed ex vi
Vydaet v dlinnom formate imena fajlov, kotorye yavlyayutsya ispolnyae-
mymi modulyami redaktorov ed, ex i vi
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.
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.)
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.
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.1. lc - vyvod fajlovoj informacii na ekran po stolbcam
-------------------------------------------------------------
IMYA: lc
------------------------------------------------------------
lc Vydaet spisok fajlov v kolonochnom formate
Vydaet informaciyu o fajlah v formate kolonok, pokazyvaya katalogi
i ispolnyaemye moduli. |tot listing mozhno propustit' cherez komandu
more.
lc [-m] [ls options] file [file ...]
lc -R $HOME
Vydaet spisok vseh fajlov vo vseh podkatalogah moego registra-
cionnogo kataloga.
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.
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.
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
Vydaet spisok fajlov v dlinnom formate (-l). Raspechatku mozhno
propustit' cherez komandu more.
ll [-m] [ls options] file [file...]
ll *.c Vydacha spiska fajlov s ishodnymi tekstami na
yazyke Si v dlinnom formate.
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.
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.
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
Vybiraet i vyvodit imena vseh fajlov v ukazannom kataloge (kata-
logah), imeyushchih ukazannyj tip. Esli ne ukazan nikakoj tip, vybirayutsya
tekstovye fajly.
kind [-a] [-d] [-t] [-x] [file...]
more `kind /etc/*`
Vyvod komandoj more vseh tekstovyh fajlov, imeyushchihsya v katalo-
ge /etc.
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.
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.
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.
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
Obespechivaet bystryj i prostoj sposob postranichnogo vyvoda
m [more options] [file ...]
m * Vyvod komandoj more vseh fajlov tekushchego kataloga
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
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.
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
Vyzyvaet tekstovyj processor nroff so special'nymi opciyami, koto-
rye inicializiruyut makrosy obrabotki rukopisej.
mmm file [...]
mmm memo Obrabotat' s pomoshch'yu nroff fajl moih zametok
memo i otobrazit' ego na ekran
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.
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.
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.
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
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.
pall [-t|-d] directory
pall /usr/lib
Vyvodit na pechat' postranichno vse tekstovye fajly v kataloge
/usr/lib
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
.
.
.
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.
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.
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
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.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
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
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
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.
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
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.
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
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.
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
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.
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
Obespechivaet interfejs v vide menyu k fajlam protokola, poluchennym
ot utility autobkp.
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
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.
Pechataet pervyj blok strok kommentariya v fajle s ishodnym kodom na
Si tak, chtoby vy mogli bystro identificirovat' naznachenie programmy na
Si.
stripc fajl [...]
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.)
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.
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
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.
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.
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.
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.
strips fajl [...]
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
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.
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.
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.
ctags [fajl ...]
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.
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)$/
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: *
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:
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.
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
Perevodit lyubuyu komandnuyu stroku v fonovyj rezhim i vypolnyaet ee v
zadannoe vremya.
at hr:min cmd [;cmd ...]
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.
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.
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.
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.
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
b any_command_with_options_and_arguments
(lyubaya komanda s opciyami i argumentami)
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!
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.
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
Opredelenie vremeni sutok i pechat' privetstviya i kakogo-libo
soobshcheniya na terminal v zavisimosti ot vremeni dnya.
greet
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.
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.
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
Zapisyvaet i vyvodit na ekran den' i vremya vashej poslednej re-
gistracii v sisteme.
lastlog [-l]
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.
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
Interfejsnoe menyu dlya slezheniya i soprovozhdeniya fajlov registracii
vremeni.
timelog
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.
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.
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.
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
Modificiruet vyvod utility cal dlya pechati segodnyashnej daty in-
versnym cvetom.
today
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.
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
-------------------------------------------------------
Komp'yuterizovannaya versiya starogo nastol'nogo generatora tehni-
cheskih terminov.
jargon
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.
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).
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).
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
Upravlyaemoe menyu sredstvo, podderzhivayushchee bazu dannyh s telefon-
nymi nomerami
phone
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.
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.
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'
Obespechivaet prostoj dostup ko mnogim utilitam upravleniya delop-
roizvodstvom, kotorye my uzhe rassmotreli.
office
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.
$ 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.
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
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
Pokazyvaet imena vseh zaregistrirovannyh pol'zovatelej, nomera ih
terminalov i vremya, kogda oni poslednij raz rabotali s klaviaturoj.
activ
activ Vyvodit na ekran informaciyu ob aktivnosti
pol'zovatelej na svoih terminalah
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.
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
Pechataet informaciyu polya kommentariya iz fajla /etc/ passwd dlya
ukazannogo pol'zovatelya.
info login_name [ login_name ... ]
info russ Pechataet informaciyu, kotoraya hranitsya
o pol'zovatele russ
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.
$ 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".
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
Otobrazit' vse processy kazhdogo pol'zovatelya, ukazannogo v ko-
mandnoj stroke
uchk [-a] login_name [...]
uchk -a Vyvod vseh processov, zapushchennyh administratorami
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.
$ 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.
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
Sledit za tem, kto rabotaet v sisteme, i soobshchaet
o registracii ukazannyh pol'zovatelej.
watch [-k] [login_name ...]
watch Nablyudenie za registraciej vseh pol'zovatelej,
ukazannyh vo vnutrennej peremennoj LIST
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.
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.
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`".
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
Predostavlyaet mnogo dopolnenij k vyhodu komandy who i pozvolyaet
primenyat' dannye who dlya drugih prilozhenij.
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
whox -w
Pokazyvaet prava dostupa k fajlu (vozmozhnost' chteniya i zapisi)
dlya kazhdogo zaregistrirovannogo terminal'nogo ustrojstva
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.
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.
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
Generiruet opcii, neobhodimye dlya vyvoda na ekran informacii obo
mne, kotoraya hranitsya v uchetnom fajle.
acme [-l] [-u]
acme -u Vyvodit vsyu uchetnuyu informaciyu o pol'zovatele s
imenem $LOGNAME
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.
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.
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
Blokiruet vash terminal putem perevoda v sostoyanie zanyatosti. Esli
kto-libo popytaetsya vtorgnut'sya, vy eto zametite.
inuse
inuse Perevod terminala v sostoyanie zanyatosti
mypasswd Vvoditsya moj parol', no ne otobrazhaetsya na ekran
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.
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.
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.
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
Izmenyaet prava dostupa k fajlam na zapis' i chtenie, chto vyglyadit
kak blokirovanie i razblokirovanie.
lock [-u] file [...]
lock $HOME
Otklyuchit' vozmozhnost' zapisi dlya menya i vozmozhnost' chteniya/zapisi
dlya gruppy i drugih pol'zovatelej po otnosheniyu k moemu registracionno-
mu katalogu.
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.
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.
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
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'.
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.
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
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.
c
c Ochistka ekrana
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.
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.
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.
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
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
Montiruet i razmontiruet ustrojstvo gibkogo diska v kataloge kak
fajlovuyu sistemu s vozmozhnost'yu zapisi/chteniya ili tol'ko chteniya.
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.
mntf -d -1
Razmontirovanie gibkogo diska na ustrojstve 1.
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.
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.
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
Prosmotr vseh fajlov diskovyh ustrojstv i obnaruzhenie vseh fajlo-
vyh sistem, vklyuchaya nemontirovannye.
mntlook
mntlook /dev/hd*
Poisk fajlovyh sistem na vseh zhestkih diskah
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.
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.
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.
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.
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
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
Razmontirovanie vseh fajlovyh sistem, smontirovannyh v dannyj mo-
ment.
umntsys
umntsys Razmontiruet vse smontirovannye fajlovye sistemy
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.
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
Vypolnyaet operacii zapisi v fajl do teh por, poka ne obnaruzhitsya
granica razmera fajla.
lrgf
lrgf Opredelenie granicy razmera fajla
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.
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.
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
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.
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.
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
Oprashivaet tablicu sostoyaniya processov i ishchet processy cu. Kogda
oni zavershayutsya, na vash ekran vydaetsya soobshchenie i programma
prekrashchaet rabotu.
cuchk - Soobshchit', kogda cu osvobodit liniyu
cuchk
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'!
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
Vypolnyaet komandnuyu stroku, podgotavlivayushchuyu posledovatel'nyj
port dlya obshcheniya s drugoj sistemoj.
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
talk -b300 -t01 -l
Obratit'sya k posledovatel'nomu portu tty01 na skorosti 300 bod i
protokolirovat' vyvodnye dannye v tekstovyj fajl.
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'.
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.
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.
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'.
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
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
Predostavlyaet upravlyaemyj s pomoshch'yu menyu dostup ko mnogim
sluzhebnym funkciyam, svyazannym s utilitoj uucp i peredachej fajlov.
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
uust Dinamicheski otobrazhat' registracionnyj fajl, chtoby
sledit' za tranzakciyami uucp
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.
$ 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.
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
Kopiruet polnuyu ierarhiyu fajlovoj sistemy s pomoshch'yu uucp v
druguyu sistemu UNIX i podderzhivaet strukturu fajlovogo dereva.
uutrans
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).
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).
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.
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
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.
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.
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.
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.
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'.
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.
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.
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 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 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.
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.
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.
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.
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.
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)!
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.
|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
Ishchet v parol'nom fajle vse registracionnye zapisi, ne imeyushchie
parolej.
access
access Vydaet spisok vseh besparol'nyh vhodov v sistemu
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").
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
Vydaet spisok vseh fajlov, imeyushchih vklyuchennyj bit razresheniya us-
tanovki pol'zovatel'skogo/gruppovogo identifikatora.
chkset [-l] [dir ...]
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.)
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.
# 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.
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.
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
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').
suw [-m] [sulog]
suw Zapusk v rezhime po umolchaniyu, proverka fajla
/usr/adm/sulog i vydacha zapisej o narushitelyah
v standartnyj vyvod.
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.
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.
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.