ol ' i posle etogo avarijno zavershalas', poskol'ku vtoroj simvol ' predstavlyal soboj ne- dopustimoe opisanie spiska dlya opcii -f. Stroka s opciej -f shla pozzhe, no komanda cut etogo nikogda ne uznavala, poskol'ku avarijno zaversha- las' do etogo. Kogda ya zamenil peremennuyu CUT1 prosto komandoj cut, eta problema ischezla. Davajte rassmotrim, kak ya otlazhival etu chast'. YA ispol'zoval shell s opciej -x, poetomu ya mog sledit' za tem, chto proishodit. Kak vy mozhete videt', kogda peremennaya CUT1 byla inicializirovana, odinar- nye kavychki nahodilis' vse eshche v operatore, no kogda vypolnyalas' nastoyashchaya komanda cut, odinarnye kavychki uhodili pri sintaksicheskom rasshirenii. Dlya generacii takogo spiska dannyh ya vypolnil sleduyushchij vyzov: sh -x whox -x. Vot chto ya uvidel: XTRA=no SORT=sort -b +2 DISPLAY=norm CUT1=cut -d' ' -f1 <- Odinarnye kavychki vse eshche zdes'. Osnovnaya problema. CUT5=cut -d: -f5 CUT6=cut -d: -f6 XTRA=yes + who + read LINE + sort -b +2 + echo russ console Jun 20 14:11 + cut -d -f1 <- Teper' vypolnyaetsya pravil'no. Kavychek net. |to sokrashchennaya raspechatka. Ona pokazyvaet, chto kogda vypolnyalas' komanda cut, ona ne imela odinarnyh kavychek. Kogda zhe zapuskalas' pe- remennaya CUT1, ona imela odinarnye kavychki. YA ne mog predstavit', kak izbavit'sya ot kavychek, poetomu ya prosto vstavil vyzov samoj komandy cut obratno na eto mesto. Mozhet byt' kakoj-nibud' molodoj rastushchij master smozhet sebe eto predstavit'. Vo vsyakom sluchae, vy mozhete videt' poleznost' otladki. Cikl, vypolnyayushchij takoe zhe prisvaivanie, imeet takoj vid pri obychnom stile zapisi na yazyke shell: | while read LINE do NAME=`echo $LINE | cut -d' ' -f1` ENTRY=`grep "^$NAME:" /etc/passwd` echo "$LINE\t\`echo $ENTRY|$CUT6\`\t\`echo $ENTRY|$CUT5\`\" done Dlya togo chtoby pomestit' takoj zhe cikl v peremennuyu, my dolzhny ekranirovat' v etom tekste vse special'nye simvoly. Stroki 45-60 - eto operator case, kotoryj realizuet razlichnye re- zhimy otobrazheniya. Stroka 46 vypolnyaet obychnyj rezhim otobrazheniya koman- dy who. Poskol'ku v obychnom rezhime imeetsya vozmozhnost' ispol'zovat' peremennuyu EXTRA, nam neobhodimo proizvesti povtornyj razbor komandnoj stroki komandoj eval, chtoby eta peremennaya prinyala svoe istinnoe zna- chenie vo vremya ispolneniya. Obratite vnimanie, chto v komande eval ime- yutsya kavychki, zaklyuchayushchie vsyu komandnuyu stroku. |to neobhodimo potomu, chto vsya stroka yavlyaetsya odnim naborom vhodnyh dannyh dlya komandy eval. Bez kavychek komanda eval ne rabotala by. Peremennaya EXTRA ne podverga- etsya povtornomu razboru. Stroki 47-50 upravlyayut rezhimami ukazaniya pol'zovatelya i vydachi informacii iz fajla parolej. Oba eti rezhima ispol'zuyut odin i tot zhe cikl. Cikl for ispol'zovan dlya ustanovki peremennoj NAME v znachenie pervogo polya kazhdoj stroki, poluchennoj ot komandy who. Dlya kazhdogo imeni, vyrezannogo iz rezul'tata raboty komandy who, vypolnyaetsya pov- tornyj sintaksicheskij razbor komandoj eval peremennoj COMMAND (kotoraya byla ustanovlena v operatore case, vypolnyavshem razbor argumentov). Tem samym povtorno analiziruyutsya i vypolnyayutsya komandy, nahodyashchiesya v pe- remennoj COMMAND. Dlya rezhima ukazaniya pol'zovatelya peremennaya COMMAND soderzhit komandu finger, a dlya rezhima parolej v COMMAND hranitsya ko- manda grep. Stroki 51-58 pohozhi na rezhim ukazaniya pol'zovatelya. |tot cikl to- zhe trebuet imena ot komandy who, no vmesto ispol'zovaniya operatora for my ispol'zuem metod pryamoj peresylki po konvejeru. Rezul'tat raboty komandy who po konvejeru peredaetsya komande cut (peremennaya CUT1 i zdes' by ne rabotala), kotoraya po konvejeru peredaet dannye v cikl chteniya while. Obratite vnimanie, chto v etom meste net nikakoj sorti- rovki. Po umolchaniyu rezul'tat komandy who vyvoditsya v poryadke nomerov terminal'nyh ustrojstv. YA ne dumayu, odnako, chto poryadok vyvoda etih dannyh imeet bol'shoe znachenie. Dlya kazhdogo imeni pol'zovatelya vyvoditsya zapros o tom, hotite li vy peredat' emu pochtovoe soobshchenie. Pri chtenii otveta v stroke 54 dolzhna byt' ispol'zovana komanda UNIX'a line. Pochemu? Potomu chto ves' cikl ispol'zuet operator read dlya chteniya imen. Operator read chitaet tol'ko so standartnogo vvoda, kotoryj v dannom sluchae privyazan k kon- vejeru. Dlya polucheniya vhodnyh dannyh s klaviatury my dolzhny ispol'zo- vat' komandu line, kotoraya poluchaet ih iz fajla /dev/tty. |to rasp- rostranennyj sposob chteniya dannyh s klaviatury iz pereadresovannogo cikla. Stroka 55 proveryaet, yavlyaetsya li otvetom simvol y. Esli da, vyzy- vaetsya komanda UNIX'a mail, i snova vvod pereadresovyvaetsya iz fajla /dev/tty (poskol'ku stroki pochtovogo soobshcheniya my dolzhny vvodit' s klaviatury.) V dannom sluchae my fakticheski pereadresovyvaem standart- nyj vvod dlya vyzova podchinennogo shell-processa, vypolnyayushchego komandu mail. Bez vypolneniya pereadresacii komanda mail chitaet iz fajla /dev/null, chto narushaet vypolnenie vsego cikla whox. Stroka 59 upravlyaet rezhimom pokaza vozmozhnosti zapisi na termi- nal. Cel' zdes' takova - ispol'zovat' odnu komandu ls i, primenyaya pod- chinennyj process, izvlech' fajly terminal'nyh ustrojstv iz vyhodnyh dannyh komandy who. |ti fajly yavlyayutsya vtorym polem rezul'tata komandy who. Snachala zapuskaetsya komanda who, kotoraya po konvejeru peredaet svoi dannye komande sed. Zatem sed ispol'zuet komandu podstanovki dlya otbrasyvaniya vsego, krome togo, chto ogranicheno simvolami \( i \). Posleduyushchaya chast' koman- dy podstanovki ssylaetsya na etot ogranichennyj uchastok s pomoshch'yu oboz- nacheniya \1. Ispol'zuya simvol . kak sootvetstvuyushchij lyubomu simvolu raspechatki, my dolzhny vsego lish' poschitat' stolbcy, kotorye nam nuzhno vyrezat'. Krome togo, imena ustrojstv v komande who ne imeyut prefiksa /dev/, kotoryj nam neobhodim. Komanda sed vstavlyaet ego pered tekstom, vyrezannym iz komandy who. V rezul'tate komande ls daetsya spisok pol- nyh marshrutnyh imen ko vsem fajlam ustrojstv zaregistrirovannyh pol'- zovatelej. Zatem eto vyvoditsya na ekran. ZASHCHITA LICHNOJ INFORMACII Drugoj storonoj osvedomlennosti pol'zovatelya yavlyaetsya obespechenie razumnoj stepeni bezopasnosti. Vasha potrebnost' v zashchite informacii zavisit ot roda vypolnyaemoj vami raboty i ot chuvstvitel'nosti informa- cii, kotoroj vy upravlyaete. Odnako vse hotyat sekretnosti i chuvstva be- zopasnosti, kotoroe poyavlyaetsya vmeste s obosnovannoj uverennost'yu v tom, chto oni ne mogut stat' zhertvoj narusheniya zashchity informacii. Tak zhe, kak vy mozhete izgotavlivat' prisposobleniya, pomogayushchie sdelat' vash dom menee privlekatel'nym dlya grabitelej, tak i kazhdyj pol'zovatel' mozhet sdelat' prisposobleniya, kotorye pomogayut podderzhivat' sekretnost' i bezopasnost' ego raboty. Podobno policii, sistemnye administratory obychno imeyut delo tol'ko s narusheniem zashchity uzhe posle svershivshegosya fakta. Vy mozhete ispol'zovat' sredstva, predstavlennye nami v dannom razdele, chtoby pomoch' uberech' vashi fajly ot nesankcionirovannogo prosmotra ili razrusheniya. Lyubaya komp'yuternaya sistema trebuet nekotorogo roda zashchity. Urovni zashchity vklyuchayut v sebya fizicheskuyu zashchitu (central'nogo processora, diskov i terminalov), zashchitu fajlov, zashchitu processov i vsej rabotayu- shchej sistemy. V mnogopol'zovatel'skoj srede eshche bolee vazhno usilivat' zashchitu. Kazhdyj pol'zovatel' imeet pravo zasekrechivat' i zashchishchat' svoyu sredu i svoi fajly. Ni odin komp'yuter ne imeet stoprocentnoj zashchity. Vasha sreda lish' nastol'ko zashchishchena, naskol'ko vy sdelali ee takovoj. Zashchitnye meropriyatiya mogut dostigat' takoj stepeni, chto nachinayut me- shat' svobodnomu obmenu ideyami i zatrudnyat' ispol'zovanie gibkosti sistemy ili issledovanie ee novyh aspektov. Lichno ya schitayu, chto pol'- zovateli dolzhny imet' svobodu delat' vse, chto oni hotyat, poka eto ne vredit sisteme ili drugim pol'zovatelyam. Bol'shinstvo informacii, pri- vedennoj v dannoj knige, podtverzhdaet eto ubezhdenie. Tip zashchity, kotoryj obsuzhdaetsya v dannoj glave, kasaetsya lichnogo aspekta zashchity pol'zovatelya sistemy UNIX. YA hochu, chtoby mesto, gde fi- zicheski nahodyatsya moi razrabotki, moj registracionnyj katalog i lyubye processy, kotorye ya zapuskayu v sisteme, byli zashchishcheny. Dlya polnogo komforta mne nuzhno znat', chto nikto ne vlezet v moi veshchi (posredstvom obychnyh metodov dostupa ili vzloma) i ne budet zaglyadyvat' mne cherez plecho, chtoby nablyudat', chem ya zanimayus'. V dannom razdele my rassmotrim instrumental'nye sredstva acme, inuse i lock. Acme - eto preprocessor k komande UNIX'a acctcom. Acctcom vypolnyaet dovol'no neplohuyu rabotu po otobrazheniyu uchetnoj in- formacii, no nekotorye opcii trebuetsya ukazyvat' vse vremya. Acme usta- navlivaet ih dlya nas. Napomnim, chto uchetnye zapisi hranyatsya v vide struktury, a ne v tekstovom vide, i poetomu my zastavlyaem acctcom po- kazyvat' ih dlya nas. Sleduyushchee sredstvo, inuse, pozvolyaet vam ustanovit' vash terminal kak "zanyatyj", kogda vy kuda-nibud' uhodite. |to effektivno blokiruet ego i ne pozvolyaet nikomu ispol'zovat' ego. Dlya realizacii takogo blo- kirovaniya predstavleny programmy kak na yazyke Si, tak i na yazyke in- terpretatora shell. Poslednee sredstvo, lock, ispol'zuetsya dlya blokirovaniya i razblo- kirovaniya prav dostupa k fajlu i yavlyaetsya na samom dele prostym inter- fejsom s komandoj chmod. ------------------------------------------------------------ IMYA: acme ------------------------------------------------------------ acme Otobrazhenie uchetnoj informacii obo mne NAZNACHENIE Generiruet opcii, neobhodimye dlya vyvoda na ekran informacii obo mne, kotoraya hranitsya v uchetnom fajle. FORMAT VYZOVA acme [-l] [-u] PRIMER VYZOVA acme -u Vyvodit vsyu uchetnuyu informaciyu o pol'zovatele s imenem $LOGNAME TEKST PROGRAMMY 1 : 2 # @(#) acme v1.0 Give accounting info on me Author: Russ Sage 2a Dat' uchetnuyu informaciyu obo mne 4 if [ "$1" != "-l" -a "$1" != "-u" ] 5 then echo "usage: acme [-l] [-u]" >&2 6 echo " -l for ttyline" >&2 7 echo " -u for user name" >&2 8 exit 0 9 fi 11 OPT="" 12 for ARG in $* 13 do 14 case $ARG in 15 -l) OPT="$OPT -l `basename \`tty\``";; 16 -u) OPT="$OPT -u $LOGNAME";; 17 *) OPT="$OPT $ARG";; 18 esac 19 done 21 echo "acctcom $OPT" 22 acctcom $OPT PEREMENNYE SREDY VYPOLNENIYA ARG Kazhdoe znachenie, ukazannoe v komandnoj stroke LOGNAME Peremennaya sredy, soderzhashchaya moe registracionnoe imya OPT Ob®edinennyj 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®em vy- chislenij, trebuemyh dlya polucheniya informacii. Dlya etogo i prednaznachen acme. CHTO DELAET acme? Acme - eto interfejsnyj processor dlya komandy acctcom(1). On slu- zhit dlya vydachi informacii, kotoraya trebuetsya soglasno ukazannym opci- yam. Vy dolzhny tol'ko dat' komandnomu fajlu acme opcii v sokrashchennom vide, a vse ostal'noe on sdelaet sam. Esli acme vyzyvaetsya bez argu- mentov, programma acctcom vyvedet po umolchaniyu vse zapisi. Komanda acctcom imeet mnogo opcij. V dejstvitel'nosti my ispol'- zuem odnu ili dve, no zato ispol'zuem ih chasto. Dvumya opciyami, kotorye ponimaet acme, yavlyayutsya -l i -u. Kogda ukazana opciya -l, acme poluchaet imya vashego terminala i pomeshchaet ego v komandnuyu stroku. Esli ukazana opciya -u, acme poluchaet vashe pol'zovatel'skoe imya i tozhe vstavlyaet ego v komandnuyu stroku. Vremya ot vremeni ispol'zuyutsya drugie opcii dlya bavleniya specificheskoj informacii ili nebol'shogo izmeneniya vyhodnogo formata. Dlya togo chtoby byla vozmozhnost' ispol'zovat' drugie opcii ko- mandy acctcom, acme vklyuchaet v komandnuyu stroku, formiruemuyu dlya fcctcom, lyubye dopolnitel'nye korrektnye opcii acctcom, peredannye v komandnoj stroke dlya acme. Takim obrazom, acme podderzhivaet bazovye vozmozhnosti, a krome togo pozvolyaet vam podgonyat' komandu pod vash vkus. Pered tem, kak nachnetsya vypolnenie komandy acctcom, na ekran vy- voditsya rasshirennyj vid komandnoj stroki, tak chto vy mozhete videt' ko- mandnuyu stroku, sgenerirovannuyu acme. Bez etogo mozhet poluchit'sya puta- nica, poskol'ku vy ne budete znat', chto sobiraetsya delat' programma. PRIMERY 1. $ acme Vydacha VSEH moih uchetnyh dannyh. |to posledovatel'nyj spisok vseh komand, kotorye byli zapushcheny nachinaya s momenta zagruzki po nastoyashchee vremya. Schastlivogo chteniya! 2. $ acme -u -b Pechat' v obratnom poryadke vseh uchetnyh zapisej s moim pol'zova- tel'skim imenem. Obratnyj poryadok oznachaet - ot samoj poslednej iz predydushchih komand do moej pervoj komandy. 3. $ acme -l Vyvod vseh uchetnyh zapisej dlya terminal'noj linii, kotoruyu ya sej- chas zanimayu. Syuda mogut byt' vklyucheny fonovye processy, ostavshiesya v sisteme ot predydushchih pol'zovatelej moej terminal'noj linii ili dazhe processy, imeyushchie drugie identifikacionnye nomera pol'zovatelej (iz-za programm tipa setuid, kotorye ya mog zapustit'), kotorye zapushcheny s etoj zhe terminal'noj linii. POYASNENIYA V strokah 4-9 vypolnyaetsya proverka na nalichie oshibok. Esli per- vyj pozicionnyj parametr ne -l i ne -u, to eto oshibka. Vyvoditsya soob- shchenie ob etom i programma zavershaetsya. V stroke 11 peremennaya OPT inicializiruetsya pustoj strokoj. |ta peremennaya soderzhit vse dopolnitel'nye opcii acctcom i ih argumenty. Stroki 12-19 predstavlyayut soboj cikl for, kotoryj povtoryaetsya po vsem pozicionnym parametram. Kazhdyj argument sveryaetsya v operatore case s dopustimymi opciyami. Esli opciej yavlyaetsya -l (stroka 15), v pe- remennuyu OPT zanositsya to znachenie, kotoroe ona uzhe imeet, opciya -l i dobavlyaetsya imya terminal'nogo ustrojstva, poluchennoe ot komandy UNIX'a tty. Komanda tty vyvodit i prefiks /dev, kotoryj ne nuzhen. Dlya togo chtoby izbavit'sya ot etogo prefiksa, my berem iz etoj simvol'noj stroki tol'ko osnovnoe imya. Esli ukazana opciya -u, v peremennuyu OPT dobavlyaetsya -u i nashe re- gistracionnoe imya. Esli argumentom yavlyayutsya lyubye drugie dannye, to oni prosto dobavlyayutsya v peremennuyu OPT. Postupaya takim obrazom, my mozhem peredat' v komandnoj stroke acme drugie opcii komande acctcom. Obratite vnimanie, chto zdes' ne vypolnyaetsya proverka na oshibki v argu- mentah komandnoj stroki. Vy mozhete vvesti nevernoe znachenie, kotoroe narushit rabotu komandy acctcom. Odnako eto ta cena, kotoruyu my vynuzh- deny platit' za gibkost' pri peredache argumentov v komandnoj stroke, inache nam pridetsya znachitel'no uvelichivat' tekst komandnogo fajla. Posle togo obrabotki vseh opcij stroka 21 vyvodit na ekran ko- mandnuyu stroku, kotoraya dolzhna byt' vypolnena, tak chto my znaem, chto my zadavali. V stroke 22 vypolnyaetsya sama komanda acctcom. Vyhodnoj rezul'tat sootvetstvuet opisaniyu acctcom(1). ------------------------------------------------------------- IMYA: inuse ------------------------------------------------------------- inuse Zapretit' ispol'zovanie terminala NAZNACHENIE Blokiruet vash terminal putem perevoda v sostoyanie zanyatosti. Esli kto-libo popytaetsya vtorgnut'sya, vy eto zametite. FORMAT VYZOVA inuse PRIMERY VYZOVA inuse Perevod terminala v sostoyanie zanyatosti mypasswd Vvoditsya moj parol', no ne otobrazhaetsya na ekran TEKST PROGRAMMY 1 : 2 # @(#) inuse v1.0 Disable terminal and alert if used Author: Russ Sage 2a Zapretit' ispol'zovanie terminala i soobshchit' o popytke ispol'zovaniya 4 trap "echo you\'re BUSTED!!; stty echo; kill $$" 2 15 6 PATH=/bin:/usr/bin 7 SECRET="secret" 9 stty -echo 10 echo "Lock string: \c" 11 read BUF1 12 echo 14 while : 15 do 16 BUF2=`line < /dev/tty` 17 if [ "$BUF2" = "$BUF1" ] 18 then break 19 elif [ "$BUF2" = "$SECRET" ] 20 then break 21 fi 22 echo "^G\c" 23 done 24 stty echo OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL inuse? Rabochij den' vsegda zagruzhen: mnogo lyudej, eshche bol'she bumag, vsya- kie porucheniya i tak dalee i tak dalee. Kogda vy pokidaete svoe rabochee mesto, chto vy sobiraetes' delat' so svoim zaregistrirovannym termina- lom? Kazhdyj raz vhodit' v sistemu i vyhodit' iz nee slishkom dolgo, no vy ne hotite ostavlyat' vashu rabotu otkrytoj dlya vseh. Vam neobhodima programma, kotoruyu vy mozhete zapustit' na vremya vashego otsutstviya i kotoraya ne pozvolit drugim lyudyam ispol'zovat' to, chto vy delaete. Konechno, ne dostatochno imet' nekij process, kotoryj vypolnyaetsya v fonovom rezhime, sozdavaya vpechatlenie, chto terminal ispol'zuetsya. My dolzhny perehvatyvat' preryvaniya v sluchae, esli kto-nibud' vvedet sim- voly "preryvaniya" ili "vyhoda" s vashej klaviatury. Edinstvennym sposo- bom razblokirovaniya terminala dolzhen byt' vvod parolya ili zaranee op- redelennogo slova, kotoroe v lyubom sluchae razblokiruet ego. CHTO DELAET inuse? Inuse perevodit vash terminal v rezhim vechnoj raboty. |to oznachaet, chto terminal ne otvechaet na vashi zaprosy ili zaprosy kogo-to drugogo. Kogda vy gotovy razblokirovat' vash terminal, vvedite sekretnyj parol' ili parol', kotoryj vy pridumali. Kogda vy pervyj raz vyzyvaete inuse, u vas zaprashivaetsya parol'. |ho-otobrazhenie na terminal otklyucheno, poetomu parol' ne vyvoditsya na ekran. Dlya garantii togo, chto nikto ne pytaetsya pereadresovat' komand- nomu fajlu inuse kakoj-libo fajl dannyh, vse operacii chteniya proizvo- dyatsya neposredstvenno iz fajla terminal'nogo ustrojstva /dev/tty, a ne cherez fajlovyj deskriptor standartnogo vvoda. |to pozvolyaet zashchitit'sya ot popytok drugih pol'zovatelej vtorgnut'sya v rabotu terminala putem posylki na standartnyj vvod fajla bol'shogo razmera, soderzhashchego raznye slova. Posle chteniya vashego parolya inuse popadaet v beskonechnyj cikl, ko- toryj chitaet simvoly s klaviatury i sravnivaet poluchennye vhodnye dan- nye s dvumya parolyami. Kazhdyj raz, kogda kto-to vvodit chto-to nekor- rektnoe, vydaetsya zvukovoj signal. Kogda zhe vveden odin iz dopustimyh parolej, programma ostanavlivaetsya i terminal razblokiruetsya. My predlagaem dve realizacii inuse: komandnyj fajl interpretatora shell, privedennyj vyshe, i programmu na yazyke Si. Oni vypolnyayut odnu i tu zhe rabotu dovol'no pohozhimi sposobami. Oni demonstriruyut, naskol'ko pohozhi eti dva podhoda, a ih nebol'shie otlichiya rassmatrivayutsya nizhe. Snachala obsuzhdaetsya komandnyj fajl, a zatem Si-programma. POYASNENIYA Stroka 4 inicializiruet operator trap. Pri aktivizacii obrabotchi- ka trap vypolnyayutsya tri komandy. Cel'yu primeneniya lovushki trap yavlyaetsya reagirovanie na lyubuyu po- pytku prervat' rabotu komandnogo fajla i prorvat'sya na vash terminal. Pervaya komanda vydaet preduprezhdenie o tom, chto vy vtorgaetes'. Vtoraya komanda pereklyuchaet terminal obratno v rezhim eho-otobrazheniya, tak chto vse, chto budet vposledstvii vvedeno s klaviatury, otobrazitsya na ekra- ne. i poslednyaya komanda zastavlyaet programmu sovershit' samoubijstvo. Kak my uvidim pozzhe, eto samoubijstvo yavlyaetsya osobym rodom prekrashche- niya raboty programmy. Obrashchenie k "samomu sebe" v operatore kill vy- polnyaetsya s ispol'zovaniem metasimvolov $$, kotorye predstavlyayut soboj identifikacionnyj nomer vypolnyayushchegosya shell-processa. Obrabotchik lo- vushek vklyuchaetsya signalami 2 i 15, kotorymi yavlyayutsya preryvanie i programmnoe zavershenie sootvetstvenno. Otmetim, chto signal vyhoda iz programmy (signal 3) zdes' ne ispol'zuetsya. Prichinu etogo my ob®yasnim pozzhe. Stroka 6 ustanavlivaet marshrut, po kotoromu mozhet obrashchat'sya inuse. Tem samym inuse nikogda ne smozhet byt' "zastignut vrasploh" kem-nibud', kto pronik nezametno (v "troyanskom kone"). Stroka 7 inici- aliziruet sekretnyj parol' znacheniem "secret", kotoroe sovsem ne sek- retno. Vy mozhete izmenit' parol' na lyuboe slovo pered ustanovkoj ko- mandnogo fajla v vashej sisteme. V pravah dostupa k fajlu, v kotorom hranitsya tekst dannoj shell-programmy, vy dolzhny zapretit' vozmozhnost' chteniya. V protivnom sluchae drugie pol'zovateli smogut uvidet' sekret- noe slovo. Stroka 9 otklyuchaet eho-otobrazhenie, stroka 10 pechataet zapros pa- rolya, a stroka 11 chitaet parol', kotoryj vy vvodite, i zanosit ego v peremennuyu BUF1. Stroki 14-23 predstavlyayut soboj vechnyj cikl while, kotoryj mozhno prervat' tol'ko vvodom pravil'nogo parolya. Stroka 16 chitaet vvod s klaviatury. Pri nazhatii vozvrata karetki stroka 17 proveryaet, soot- vetstvuet li to, chto vvedeno s klaviatury, parolyu pol'zovatelya. Esli net, peremennaya BUF2 sravnivaetsya s sekretnym parolem. Esli kakoj-to iz parolej sovpadaet, operator break proizvodit vyhod iz cikla while, tem samym prekrashchaya vypolnenie programmy. Esli vvedennye dannye ne sootvetstvuyut ni odnomu iz parolej, to v stroke 22 vydaetsya zvukovoj signal i snova nachinaet vypolnyat'sya operator chteniya klaviatury. Esli parol' vveden pravil'no, v stroke 24 vklyuchaetsya eho-otobra- zhenie na terminal i programma zavershaetsya. Esli proishodit preryvanie, aktiviziruetsya operator trap. Dannaya operaciya podrobno rassmatrivaetsya nizhe. PODROBNEE O LOVUSHKAH Nam nuzhno rassmotret' smysl klavishi vyhoda iz programmy. Ona pro- izvodit preryvanie, pohozhee na vse drugie preryvaniya, no krome togo vyvodit damp pamyati dlya zapushchennogo processa. My ostavlyaem klavishu vy- hoda netronutoj operatorom trap, poskol'ku ona stanovitsya nashej poslednej nadezhdoj na priostanovlenie komandnogo fajla inuse. Kogda vash terminal zablokirovan, on eho-otobrazhaet vvodimye s klaviatury simvoly, no ne reagiruet na nih. Tot, kto nazhimaet na klavishi, vidit eto i pytaetsya vyjti iz situacii, nazhimaya na klavishu preryvaniya (obych- no eto klavisha DEL). Kogda on eto delaet, na ekran vyvoditsya soobshchenie "you're busted", eho-otobrazhenie snova vklyuchaetsya i programma sama se- bya unichtozhaet (signal 15). Kogda signal unichtozheniya prinimaetsya prog- rammoj, etot signal lovitsya, pechataetsya soobshchenie i programma snova sama sebya unichtozhaet. |ta posledovatel'nost' vypolnyaetsya snova i sno- va, kak v vechnom cikle. Kazhdyj raz, kogda lovushka unichtozhaetsya i snova zapuskaetsya, ispol'zuetsya stek. Esli vse eto budet vypolnyat'sya dosta- tochno dolgo, to ves' stek zapolnitsya zapisyami ob aktivizacii i pere- polnitsya, avarijno zavershaya ves' seans raboty. Esli klavisha vyhoda budet nazhata do aktivizacii operatora trap, to programma zavershitsya chisto. Esli zhe klavisha vyhoda budet nazhata posle nachala raboty operatora trap, to proizojdet vydacha dampa pamyati processa i programma zavershitsya. |to ne sovsem chestnyj priem, no prog- rammirovanie na yazyke shell vynuzhdeno byt' imenno takim, i eto predup- rezhdaet vas o tom, chto chto= to ne v poryadke. Tekushchie znacheniya klavish dlya signalov preryvaniya i vyhoda otobra- zhayutsya komandoj stty(1). |ti znacheniya mozhno pereustanovit' v lyubye po vashemu zhelaniyu. U menya tekushchie ustanovki takie: speed 9600 baud; intr = DEL; quit = ^|; erase = ^h; kill = ^u; eof = ^d; Nabrav na klaviature "stty intr z", vy mozhete ustanovit' simvol z v kachestve signala preryvaniya vashih processov, poetomu takoe izmenenie klavishi preryvaniya i zapusk beskonechnogo cikla predstavlyaet soboj eshche odin sposob zashchity vashego seansa raboty. Poskol'ku vam potom nuzhno bu- det vernut' staroe znachenie, vy dolzhny zapomnit' to, chto vy delali. Takoj nastrojkoj signalov vy mozhete delat' s vashim terminalom pochti vse, chto hotite. |tot podhod daet men'shuyu stepen' zashchity, chem perehvat preryvanij, no mozhet obespechit' vas minimal'noj zashchitoj, ne privodya k vydache dampa pamyati. Teper' my predstavlyaem versiyu na yazyke Si. TEKST PROGRAMMY inuse NA YAZYKE SI 1 char id[] = "@(#) inuse v1.0 Disable terminal Author: Russ Sage"; 3 #include 4 #include 5 #include 7 #define SSIZ 7 8 #define BSIZ 512 9 #define BELL "\07" 10 #define LF "\n" 12 main() 13 { 14 register int fd, sig, n; 15 char secret[SSIZ]; 16 char buf1[BSIZ], buf2[BSIZ]; 17 struct sgttyb sav_tty, chg_tty; 19 secret[0] = 's'; 20 secret[1] = 'e'; 21 secret[2] = 'c'; 22 secret[3] = 'r'; 23 secret[4] = 'e'; 24 secret[5] = 't'; 25 secret[6] = '\n'; 27 buf1[0] = buf2[0] = '\0'; 28 if ((fd = open("/dev/tty",O_RDONLY)) == -1) 29 exit(1); 31 for (sig = 2; sig <= 15; sig++) 32 signal(sig, SIG_IGN); 34 if (gtty(0, &sav_tty)) 35 exit(2); 36 chg_tty = sav_tty; 37 chg_tty.sg_flags &= ~ECHO; 38 if (stty(0, &chg_tty)) 39 exit(3); 41 write(1,"Lock string: ",13); 42 read(fd, buf1, BSIZ); 43 write(1, LF, 1); 45 for (;;) { 46 n = read(fd, buf2, BSIZ); 47 buf2[n] = '\0'; 49 if (strcmp(buf2, buf1) == 0) 50 break; 51 if (strcmp(buf2, secret) == 0) 52 break; 53 write(1, BELL, 1); 54 } 55 stty(0, &sav_tty); 56 close(fd); 57 } OPISANIE ZACHEM NAM NUZHNA PROGRAMMA inuse (Si)? Versiya inuse na yazyke Si rabotaet pochti tak zhe, kak i versiya na yazyke shell. Osnovnoe otlichie zaklyuchaetsya v tom, chto komandnye fajly na yazyke shell pol'zuyutsya komandami razdela (1), v to vremya kak programmy na Si ispol'zuyut komandy razdelov (2) i (3). CHTO DELAET PROGRAMMA inuse (Si)? Teoreticheskie osnovy funkcionirovaniya takie zhe, kak i v shell-versii. Inicializiruetsya sekretnyj parol' (v dannom sluchae pri- menyaetsya takoj sintaksis, chtoby komanda strings(1) ne smogla posmot- ret' ego v ispolnyaemom module), perehvatyvayutsya signaly, chitaetsya pa- rol' pol'zovatelya i nachinaetsya beskonechnyj cikl, kotoryj chitaet simvo- ly s klaviatury. Kak tol'ko na klaviature chto-to nabrano i nazhata kla- visha vozvrata karetki, vhodnye dannye sravnivayutsya s dvumya izvestnymi parolyami. Esli oni sootvetstvuyut odnomu iz parolej, programma pere- ustanavlivaet terminal i zavershaetsya. Esli sovpadeniya ne proizoshlo, terminal vydaet zvukovoj signal i snova chitaet klaviaturu. Poskol'ku zdes' lovushki ne rabotayut, popytka prervat' zapushchennuyu programmu ne srabatyvaet. Edinstvennyj sposob prekratit' ee vypolnenie - ispol'zovat' komandu "kill -9". Signal 9 yavlyaetsya edinstvennym, ko- toryj nel'zya perehvatit'. Esli by eto mozhno bylo sdelat', to ne bylo by nikakogo sposoba prekratit' vypolnenie processa, krome kak vytashchit' vilku iz rozetki. POYASNENIYA Stroka 1 pomeshchaet dokumentiruyushchuyu informaciyu v simvol'nyj massiv. Pri nalichii etogo teksta v ob®ektnom 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®yavlyaet 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®yavlyaet nekotorye rabochie peremennye. Obratite vnima- nie, chto my ispol'zuem registrovye celye. Ispol'zovanie registrovyh peremennyh dlya uskoreniya raboty - poleznyj priem. Esli vy ob®yavili 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®ektnom module poluchaetsya razorvannoj. |to mera bezo- pasnosti dlya predotvrashcheniya vozmozhnosti zritel'nogo prosmotra s cel'yu izvlecheniya cennoj informacii. V stroke 27 eti dva bufera inicializiruyutsya v nulevoj razmer. Stroki 28 i 29 otkryvayut ustrojstvo /dev/tty. Esli vozvrashchaemyj deskriptor fajla raven -1, eto govorit ob oshibke i programma zaversha- etsya. Stroki 31 i 32 perehvatyvayut vse signaly. Cikl for rabotaet s signalami, imeyushchimi nomera ot 2 do 15. Dlya kazhdogo iz etih znachenij vypolnyaetsya sistemnyj vyzov signal s cel'yu ignorirovaniya signalov s takimi znacheniyami. V strokah 34-39 vypolnyaetsya modifikaciya terminal'nyh harakte- ristik dlya otklyucheniya eho-otobrazheniya simvolov. Stroka 34 poluchaet in- formaciyu ob ustanovkah terminala v strukturu sav_tty. Sistemnyj vyzov gtty - eto prosto programmnyj interfejs s sistemnym vyzovom ioctl(get_values). Esli etot vyzov neudachen, programma zavershaetsya. Stroka 36 zanosit dannye iz struktury sav_tty v strukturu chg_tty. Zatem stroka 37 prisvaivaet elementu sg_flags rezul'tat ope- racii otricaniya nad ego zhe znacheniem i simvolom ECHO, chto oznachaet "otklyuchit' eho-otobrazhenie". Posle etogo stroki 38 i 39 zapisyvayut iz- menennye znacheniya obratno na terminal'noe ustrojstvo. Sistemnyj vyzov stty - eto prosto programmnyj interfejs s sistemnym vyzovom ioctl(set_values). Stroka 41 vyvodit na ekran zapros na vvod parolya. Deskriptor faj- la 1 yavlyaetsya standartnym ustrojstvom vyvoda, a 13 - dlina stroki sim- volov. Stroka 42 chitaet BSIZ simvolov iz fajla /dev/tty. Posle chteniya na ekran vydaetsya simvol perevoda stroki. |to neobhodimo sdelat', poskol'ku pri otsutstvii eho-otobrazheniya na ekran ne vyvoditsya simvol perevoda stroki, kogda vy vvodite svoj parol'. Poetomu my vynuzhdeny vstavit' etot simvol zdes' sami. Stroki 45-54 predstavlyayut soboj beskonechnyj cikl, kotoryj chitaet simvoly s klaviatury. Stroka 46 vypolnyaet chtenie terminala dlya raspoz- navaniya parolya. V etoj stroke vvedennyj parol' pomeshchaetsya v buf2, a ne v buf1. My vyyasnyaem kolichestvo simvolov, prochitannyh v buf2 (n). Poskol'ku indeksirovanie massivov nachinaetsya s nulya, a ne s 1, pri vvode n simvolov my popadaem v konec teksta i zdes' my vstavlyaem nol' dlya togo, chtoby vse, chto bylo vvedeno, predstavlyalo soboj stroku sim- volov. My delaem eto potomu, chto komanda read ne proizvodit obrabotku simvol'noj stroki. |to delayut sistemnye vyzovy stdio. Ih opisanie na- hoditsya v razdele (3) rukovodstva po sisteme, a ne v razdele (2). Nam nuzhno oformit' prochitannye simvoly v vide stroki, chtoby ee mozhno bylo sravnit' s parolyami. Stroka 49 sravnivaet to, chto vveli s klaviatury, s tem parolem, kotoryj vy vveli v nachale raboty programmy. Esli eti simvol'nye stroki odinakovy, strcmp vozvrashchaet znachenie nol', kotoroe soobshchaet o sovpa- denii. Komanda break vyvodit vypolnenie iz cikla for, i programma pro- dolzhaetsya. Stroka 51 vypolnyaet takoe zhe sravnenie s sekretnym parolem. Esli proishodit sovpadenie, vy takzhe vyhodite iz cikla. Esli sovpadeniya ne proizoshlo, stroka 53 vydaet na terminal zvuko- voj signal i upravlenie peredaetsya operatoru read v nachalo cikla for. Esli proizoshel vyhod iz cikla for, upravlenie peredaetsya stroke 55. Proishodit zapis' pervonachal'noj informacii ob ustanovkah termina- la, tem samym vklyuchaetsya eho-otobrazhenie. Stroka 56 zakryvaet fajl /dev/tty, i proishodit normal'noe zavershenie raboty programmy. Vy mogli vidite, programma na yazyke Si, hotya i neskol'ko slozhnee, chem na yazyke shell, no imeet nekotorye preimushchestva. Ona ne mozhet byt' ostanovlena ili narushena nichem, krome komandy kill -9. Parol' v ispol- nyaemom module spryatan ot lyubopytnyh glaz. Vy poluchaete bol'shij uroven' zashchity i bolee yasnyj podhod za schet ispol'zovaniya yazyka nizkogo urovnya i napisaniya bolee dlinnoj programmy. ----------------------------------------------------------------- IMYA: lock ----------------------------------------------------------------- lock Blokirovanie i razblokirovanie fajlov NAZNACHENIE Izmenyaet prava dostupa k fajlam na zapis' i chtenie, chto vyglyadit kak blokirovanie i razblokirovanie. FORMAT VYZOVA lock [-u] file [...] PRIMER VYZOVA lock $HOME Otklyuchit' vozmozhnost' zapisi dlya menya i vozmozhnost' chteniya/zapisi dlya gruppy i drugih pol'zovatelej po otnosheniyu k moemu registracionno- mu katalogu. TEKST PROGRAMMY 1 : 2 # @(#) lock v1.0 Lock and unlock files Author: Russ Sage 2a Blokirovanie i razblokirovanie fajlov 4 if [ $# -eq 0 ] 5 then echo "lock: incorrect argument count" >&2 6 echo "usage: lock [-u] file [...]" >&2 7 exit 1 8 fi 10 if [ "`echo $1 | cut -c1`" = "-" -a "$1" != "-u" ] 11 then echo "lock: invalid argument $1" >&2 12 echo "usage: lock [-u] file [...]" >&2 13 exit 1 14 fi 16 MODE1="go-rw" 17 MODE2="u-w" 19 if [ "$1" = "-u" ] 20 then shift 21 MODE1="go+r" 22 MODE2="u+w" 23 fi 25 chmod $MODE1 $@ 26 chmod $MODE2 $@ PEREMENNYE SREDY VYPOLNENIYA MODE1 Rezhimy dostupa k fajlu, otnosyashchiesya k gruppe pol'zovatelej i drugim pol'zovatelyam MODE2 Rezhimy dostupa k fajlu, otnosyashchiesya k vladel'cu OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL lock? Vse fajly v sisteme UNIX imeyut nekotorye prava dostupa. |ti rezhi- my izmenyayutsya v sootvetstvii s tem, kak ispol'zuetsya etot fajl. Dlya kazhdogo fajla dolzhny byt' ustanovleny tri nabora prav dostupa - dlya vladel'ca, gruppy i drugih pol'zovatelej. Obychno tekstovye fajly imeyut rezhim 644, a ispolnyaemye i katalogi - 755. Nekotorye sistemy prisvai- vayut po umolchaniyu drugie znacheniya. Esli vy hotite ogranichit' prava chteniya ili zapisi, sleduet ispol'zovat' komandu chmod(1). Novyj rezhim dolzhen ukazyvat'sya libo kak absolyutnoe vos'merichnoe chislo (naprimer, 777), libo kak bukvennoe vy- razhenie, ukazyvayushchee, kakaya kategoriya pol'zovatelej chto mozhet delat' (naprimer, ugo+rwx). Esli vy hotite dobavit' ili zapretit' opredelen- nye vozmozhnosti, legche ispol'zovat' dlya etogo bukvennoe vyrazhenie. No dazhe v takom sluchae nam budet polezno sredstvo, pozvolyayushchee umen'shit' chislo nazhatij na klavishi i izbavlyayushchee ot neobhodimosti tochno zapomi- nat' vse, chto kasaetsya prav dostupa k fajlu. CHTO DELAET lock? Lock - eto sredstvo, kotoroe upravlyaet pravami dostupa, obespechi- vayushchimi bezopasnost' vseh vashih fajlov. |tot komandnyj fajl obespechi- vaet neobhodimye rezhimy dostupa pol'zovatelej ili zapreta dostupa v ogranichennoj stepeni. Imeya zaranee opredelennye rezhimy dostupa, nashi fajly luchshe sohranyayutsya v bezopasnom sostoyanii. Vhodnymi dannymi dlya lock yavlyayutsya imena fajlov. Dopuskaetsya ispol'zovanie simvol'noj stroki s lyubym naborom imen fajlov. V nej dolzhno nahodit'sya po krajnej mere odno imya fajla. Imena fajlov s uka- zaniem katalogov takzhe dopuskayutsya. Dejstvie lock po umolchaniyu - blokirovanie ukazannogo fajla. Opciya -u razblokiruet ukazannyj fajl. Esli komande chmod peredano nevernoe imya fajla, eto sozdaet prob- lemy dlya nee i v etom sluchae vyvoditsya soobshchenie ob oshibke. PRIMERY 1. $ lock -u $HOME/src *.c Razblokirovanie moego kataloga s ishodnymi tekstami i vseh ishod- nyh fajlov na yazyke Si v tekushchem kataloge. Razblokirovanie daet voz- mozhnost' chteniya vsem i vozmozhnost' zapisi tol'ko mne. 2. $ lock $HOME/bin Blokiruet moj katalog bin tak, chtoby nikto ne mog chitat' ili pisat' v nego fajly. Dazhe hotya moj katalog nel'zya chitat', lyuboj posto- ronnij mozhet vse zhe vojti v nego komandoj cd, esli ustanovlen bit x. Esli on popytaetsya vypolnit' komandu ls, kazhdyj fajl budet vydavat' soobshchenie ob oshibke vida "filename not found" (fajl s imenem "filename" ne najden). Nikto ne mozhet poluchit' informaciyu iz indeksno- go deskriptora fajla, takuyu kak vremennye harakteristiki i prava dostupa, no lyuboj mozhet uvidet' imena vseh fajlov iz soobshcheniya ob oshibke. POYASNENIYA Stroki 4-8 proveryayut schetchik argumentov. Esli ne byl ukazan ni odin argument, vyvoditsya soobshchenie ob oshibke. Dolzhno byt' ukazano hotya by odno imya fajla. Stroki 10-14 proveryayut, yavlyaetsya li pervyj simvol pervogo pozici- onnogo parametra znakom "minus" i otlichaetsya li pervaya opciya ot do- pustimoj opcii -u. Esli eti usloviya vypolnyayutsya, vyvoditsya soobshchenie ob oshibke i programma zavershaetsya. Stroki 16 i 17 inicializiruyut ustanovki rezhimov prav dostupa po umolchaniyu. MODE1 ustanavlivaetsya dlya zapreta chteniya i zapisi kategori- yam pol'zovatelej "gruppa" i "drugie". MODE2 ustanavlivaetsya dlya zapre- ta pol'zovatelyu (t.e. mne) prava zapisi. |to strahovka dlya menya ot sluchajnoj zapisi v fajl. Nam nuzhny dve takie peremennye, poskol'ku eti dva rezhima dovol'no raznye. Edinstvennyj sposob sdelat' eto - dvazhdy vyzvat' komandu chmod s dvumya razlichnymi ustanovkami. Stroki 19-23 proveryayut, byla li ukazana v komandnoj stroke opciya -u. Esli byla, ona ubiraetsya iz komandnoj stroki komandoj shift i pe- remennye rezhima inicializiruyutsya dlya razblokirovaniya fajlov. Stroka 21 razreshaet vozmozhnost' chteniya gruppe pol'zovatelej i drugim. Stroka 22 razreshaet mne vozmozhnost' zapisi. Obratite vnimanie, chto v komandnom fajle lock ne proishodit modifikacii bitov x, s ili t. |to sdelano na- merenno, poskol'ku bit x dolzhen byt' ustanovlen tol'ko v sluchae, esli fajl mozhet byt' ispolnyaemym. Dlya katalogov bit x dolzhen byt' ustanov- len tol'ko v sluchae, esli vy hotite, chtoby drugie pol'zovateli mogli zahodit' v etot katalog. My takzhe nikogda ne ustanavlivaem vozmozhnost' zapisi dlya gruppy pol'zovatelej i dlya drugih pol'zovatelej, no my otk- lyuchaem ee pri blokirovanii fajlov. |to dopolnitel'naya mera predosto- rozhnosti na sluchaj, esli fajl imeet ustanovlennymi takie prava dostupa k nemu, kotorye my po kakim-to prichinam ne zhelaem ostavlyat'. V strokah 25 i 26