2
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
A jegyzet a
Szent László Katolikus Szakkollégium GNU/Linux alapjai I. kurzus segédleteként jött létre.
Szerző: Jónás Zsolt E-mail:
[email protected] URL: http://fikusz.hu/linux
Ez a kiadvány Jónás Zsolt szellemi tulajdona. Minden jog fenntartva.
Jelen kiadvány szabadon másolható és terjeszthető változatlan formában, a jogtulajdonos kifejezett engedélye nélkül is. Részletek vagy módosított változatok kizárólag a tulajdonos kifejezett és írásbeli engedélyével tehető közzé.
Jónás Zsolt
1.
GNU/Linux - kezelési ismeretek I.
3
fejezet
Bevezető
Olyan jegyzet írása volt a cél, ami a GNU/Linux operációs rendszer minél több részét igyekszik bemutatni, megalapozni egy olyan tudást, amelynek birtokában az egyéni továbbképzés, mélyebb ismeretek megismerése gördülékenyebben történhet. Ennek érdekében vannak megfogalmazások, leírások, ahol nem a pontos működés, felépítés leírása volt a cél, hanem az érthetőség, nagyvonalakban a lényeg, amelynek ismerete esetén a részleteket taglaló leírás is könnyen emészthető. Továbbá, az összeállításnál fontos szempont volt a gyakorlati oldalról való megközelítés. Főleg olyan példák szemléltetése volt a leglényegesebb, amellyel a rendszer igazi lényegét lehet megmutatni, hogyan lehet karakteres felületen (vagy grafikus felületen karakteres ablakban) hatékonyabban dolgozni, mint a grafikus felületen. A grafikus felületen futó programok és a lehetőségek bemutatása nem is célja e jegyzetnek, de a továbbiakban leírt ismeretanyag elsajátítása után nem is jelenthet különösebb nehézséget azon tudás megszerzése. Valamint, az ismertetett parancsok leírásai sem a teljesség igényével készültek, inkább az alapvető lehetőségek bemutatása volt a fő cél, megmutatni, hogy mely program mire használható. A részletek megismerését az olvasóra bízzuk, meghagyva a felfedezés örömét. A GNU/Linux rendszert alapul véve több terjesztés is napvilágot látott. Az egyik oldalon állnak azok a disztribúciók, amelyek grafikus telepítővel és hardver eszközfelismerővel vannak felszerelve, minden beállítási lehetőséget próbálnak a grafikus felületen elérhetővé tenni, hogy szinte csak az egér használatával beállítható, finomhangolható legyen a rendszer. Ilyen terjesztés például a Mandrake, Red Hat, S.u.S.E., stb. Léteznek olyan összeállítások is, amelyek inkább a biztonságot és a szabadságot nyújtják a felhasználó felé, többek között ilyen a Debian és a Slackware.
4
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
E jegyzet megpróbálja a GNU/Linux rendszert a lehető legszélesebben tárgyalni úgy, hogy mindegyik terjesztésre igazak legyenek a leírtak, de bizonyos mélységnél és témaköröknél már nem tartható e célkitűzés, így preferálnunk kell egy terjesztést, amelyet kiemelve a többi közül, részletesebben tárgyalunk. Ez a disztribúció nem más, mint a Debian. A többkötetes jegyzet ezen részében a GNU/Linux alap programjaival ismerkedünk meg, hogy alap szinten használni tudjuk a rendszert. Ezen ismeretek szükségesek a többi a GNU/Linux – kezelési ismeretek további köteteinek megértéséhez.
1.1.
GNU/Linux bemutatása röviden
Mindenek előtt ismerkedjünk meg kicsit a rendszer történetével nagyvonalakban, hogy megértsük célját, tudjuk, hogy honnan ered és merre tart egyre gyorsabban. Megszületésekor a UNIX operációs rendszer mindenki számára ingyen elérhető volt, forráskódját bárki módosíthatta a szája íze szerint saját maga számára. Azonban amikor az AT&T céget szétszabdalták egy trösztellenes per kapcsán, akkor a vállalat számára szóló számítógépes programok árulására vonatkozó tiltás érvényét vesztette és az utódvállalatok számára megnyílt az út a forráskód titkosítására, levédésére, továbbá árusítására. Egy idő elteltével sokaknak elegük lett a nagyvállalatok egyeduralmából, hogy a saját érdekeiknek megfelelően irányítsanak egy rendszer fejlesztését, ne pedig a vásárló/felhasználó szemszögéből közelítsék meg a fejlesztések céljait. Elindult egy mozgalom, aminek az alapkövét Richard M. Stallman1 (1.1. ábra) tette le és a GNU nevet adta neki. A GNU (1.2. ábra) a „GNU is Not Unix” („GNU Nem Unix”) jelmondatnak a rövidítése. Arra utalt ezzel, hogy létre szeretne hozni egy olyan UNIX változatot, ami ingyenes és mindenki számára szabadon hozzáférhető. Az igazi áttörés Linus (Benedict) Torvalds (1.3. ábra) hozta meg. 1991-ben nekilátott, hogy írjon maga számára egy kernelt (rendszermagot), aminek a neve Linux lett (1.4. ábra). A kíváncsiság vezérelte és nem is hitt benne, hogy az Interneten közzétett rendszermagot valaki egyáltalán megnézni. Nem lett igaza, fél év alatt a semmiből elért a rendszermag egy olyan állapotra, hogy már önálló rendszerként tudott futni, és tudta futtatni a hozzá kapcsolt GNU keretében megírt programokat. Az első terjesztések egyike a S.u.S.E. Linux (1992. szeptembere) Slackware (1993. július 17.) és a Debian (1993. augusztus 16.).
1.1. ábra: Richard M. Stallman
1
1.2. ábra: GNU logo
1.3. ábra: Linus Torvalds 1.4. ábra: Linux logo
Richard Matthew Stallman a teljes neve, de a Matthew-t mindig rövidíti „M.”-re
Jónás Zsolt
1.2.
GNU/Linux - kezelési ismeretek I.
5
Debian GNU/Linux
A Debian-t1 (1.5-6. ábra) 1993 augusztusában Ian Murdock indította el, hogy legyen egy új, nyitott disztribúció, amelyet a Linux és a GNU szellemében készítenek. Az volt a szándéka, hogy a rendszert gondosan és lelkiismeretesen állítsák össze, és hasonló gonddal tartsák fenn és támogassák. A fejlesztőgárda a Free Software hackereinek kicsiny csoportjaként indult, és fokozatosan nőtt a fejlesztők és a felhasználók nagy, jól szervezett közösségévé. Lásd a részletes történetet2. A név a Debian alkotójának, Ian Murdocknak és feleségének, Debrának a nevéből származik. A Debian-t szerte a világon3 közel ezer fejlesztő4 állítja elő a szabad idejében. A fejlesztők közül csak kevesen találkoztak eddig egymással személyesen. A kommunikáció főleg e-mailben (a lists.debian.org levelezőlistáin) és IRC-n (az irc.debian.org #debian csatornáján) zajlik. A Debian projektnek gondosan szervezett struktúrája5 van. Arról, hogy a Debian hogy néz ki belülről, a fejlesztők oldalán6 találsz bővebb információt. Debian bővebben A Debian projekt olyan emberek társasága, akik közös céljuknak tekintik a szabad vagy nyílt forráskódú7 számítógépes operációs rendszer létrehozását. Ezt az operációs rendszert, amit létrehoztak, Debian GNU/Linux-nak vagy röviden Debian-nak hívják. Az operációs rendszer olyan alapvető programok és alkalmazások halmaza, amik lehetővé teszik a számítógép működését. A kernel az operációs rendszer magja, amely az alapfeladatokat végzi, és más programokat indít. A Debian rendszerek jelenleg Linux kernelt használnak. A Linux teljesen szabad szoftver, amelyet Linus Torvalds indított útjára, és több ezer programozó fejleszt világszerte. Ugyanakkor folyamatban van a Debian fejlesztése más kernelekre is, elsősorban a Hurd-ra8. A Hurd szerverprogramok gyűjteménye, amelyek egy mikrokernel (mint például a Mach) felett futnak, és különböző funkciókat implementálnak. A Hurd szabad szoftver, és a GNU projekt eredménye. Az operációs rendszert kitöltő alapprogramok nagy része a GNU projektből származik; ez a magyarázata a GNU/Linux és GNU/Hurd neveknek. Ezek a programok szintén szabadok. Az embereknek természetesen alkalmazásokra van szükségük: olyan programokra, amelyekkel el tudják végezni munkájukat, dokumentumok szerkesztésétől kezdve az üzletvezetésen és a játékokon át a programírásig. A Debian több mint 8710 csomagot (könnyen telepíthető formátumba csomagolt lefordított szoftvert) tartalmaz -- mindegyikük szabad szoftver.
1
http://www.debian.org http://www.debian.org/doc/manuals/project-history/ 3 http://www.debian.org/devel/developers.loc 4 http://www.debian.org/devel/people 5 http://www.debian.org/intro/organization 6 http://www.debian.org/devel/ 7 http://www.debian.org/intro/free 8 http://www.gnu.org/software/hurd/hurd.html 2
6
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Elérhetőség Debian Linux Association Software in the Public Interest P.O. Box 70152 Pt. Richmond CA 94807-0512
[email protected] http://www.debian.org ftp://ftp.debian.org/debian
1.5. ábra: Debian mostani logoja
1.6. ábra: Debian előző logoja
Jónás Zsolt
2.
GNU/Linux - kezelési ismeretek I.
7
fejezet
Alapfogalmak
Mielőtt elkezdenénk ismerkedni a GNU/Linux operációs rendszerünkkel, érdemes megismerkednünk pár alapfogalommal. Mivel nem lehet elkerülni a mindennapi használat során e szavak használatát, így érdemes mielőbb aktív szókincsünk részévé tenni.
2.1.
Operációs rendszerrel kapcsolatos fogalmak
Operációs rendszer Azon programok összessége, amelyek által kezeli a hardver eszközöket (driver-ek), szoftvereket futtat (programok), valamint kapcsolatot tart fenn a felhasználóval (héj). Fogadja parancsait, feldolgozza, értelmezi azokat és cselekszik. Beletartozhat egyéb, a felhasználó munkáját segítő program(csomag). Kernel Az operációs rendszer lelke. Magába foglalja az eszközkezelőket, feladata megfelelő környezetet biztosítani a programok futásához és futtatni azokat.
8
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Multitask Több feladat egyidejű végrehajtását jelenti. Egy processzorral rendelkező számítógépeken az egyidejű végrehajtás csak látszólagos, hiszen a processzor csak egy feladattal tud foglalkozni egyszerre; tehát a feladatok "felváltva kapják meg a processzort". A legkisebb egység, amely párhuzamos feldolgozásra kerülhet - a processz. A feladatok váltogatását az ütemező végzi, amely különböző stratégiák szerint dolgozhat. Multiuser Több felhasználó egyidejű kiszolgálását jelenti. Ez nem kifejezetten fájlok megosztását jelenti, hanem inkább programok futtatását. Tehát egy gépre több ember jelentkezhet be egyszerre, és egyszerre tudnak dolgozni anélkül, hogy zavarnák egymás munkáját. Ez maga után vonja azt, hogy a rendszernek meg kell tudnia különböztetni egymástól a felhasználókat. Minden felhasználóhoz előre definiált jogok és engedélyek tartoznak, amelyeket a rendszer mindig ellenőriz, amikor a felhasználó szeretne hozzáférni valamihez. Ez szükséges az erőforrások megfelelő szétosztásának, és a biztonságnak az érdekében. A többfelhasználós rendszerekhez tartoznia kell egy olyan személynek, aki a rendszerrel kapcsolatos adminisztrációs teendőket ellátja, ezt a személyt Linux alatt root-nak hívják.
2.2.
Programokkal kapcsolatos fogalmak
Nyílt és a zárt forráskód Forráskódnak nevezzük azt a szöveges fájl(okat)t, ami(k)ben a választott programozási nyelv szintaktikájának megfelelően megfogalmazzuk, amit végeztetni akarunk a számítógéppel. Az egyik legjelentősebb tulajdonsága a nyílt forráskódú (open source1) programoknak, hogy bármikor belenézhetünk, módosíthatjuk a saját igényeinknek megfelelően, és ez hozzájárul egy másik jelentős tulajdonságához, ami nem mást, mint a stabilitás. Ugyanis, a több szem többet lát alapon, hamarabb ki lehet szűrni a hibákat és a hiba észlelése után szinte azonnal elérhető a javítás vagy a javított forráskód. A zárt forráskód anyagi igényeket előtérbe helyezve született meg. Használatuk esetén a felhasználó kiszolgáltatja magát a készítőknek, ugyanis nem bizonyosodhat meg róla, hogy tényleg csak annyit tud, amennyit dokumentáltak és nem rejtettek el benne kémprogramot, ami manapság szinte divattá nőtte ki magát. Valamint ilyen esetben a program javítása is körülményesebb, előfordulhat, hogy a készítő nem tudja reprodukálni a hibát hardver hiány miatt, stb.
1
http://www.opensource.org
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
9
Lefordítás A lefordítás az a folyamat, amikor a forráskódból egy futtatható, a számítógép nyelvére átfordított, úgynevezett bináris állomány jön létre. Azért nevezzük binárisnak, mert a számítógép – a felépítéséből adódóan – a kettes számrendszerrel dolgozik. Paraméterek, kapcsolók Amikor egy programot lefuttatunk (elindítunk), általában adhatunk át neki információkat, amelyekkel befolyásolhatjuk a működését. Kapcsolónak hívjuk az olyan átadott információt, amellyel egy műveletet elvégeztetünk vagy kihagyatunk az adott programmal, minden más paraméter. Azaz, az olyan információkat, amelyek nem lehetnek egy eldöntető kérdésre adott válaszok, paraméternek nevezünk. Az igazsághoz hozzátartozik, hogy a paramétereket és kapcsolókat együttesen is szokás paramétereknek hívni. (Minden kapcsoló paraméter, de nem minden paraméter kapcsoló…) Démon programok és az inetd Elindítása után a háttérben fut, vagy épp várakozik, de a lényeg, hogy a memóriában maradt, amíg le nem állítjuk manuálisan vagy a rendszer lekapcsolásával, esetleg futási szint váltással. A memóriában van a program és várakozik, hogy kiszolgálja a hozzá befutott kéréseket (például egy ftp szerverhez befutott csatlakozási szándék). A gyakran használt, vagy nagy forgalmat bonyolító szolgáltatásokat célszerű a memóriában tartani, azonban a ritkábban használt démon programokat nem célszerű állandóan a memóriában tartani. Az erőforrások jobb kihasználtsága érdekében alkották meg az inetd démon programot, amelynek a config állományában megadhatjuk, hogy milyen kérések esetén mely démon programokat indítsa el. Shell, burok, héj Más néven parancsértelmező. Ugyanazt a feladatot látja el, mint MS-DOS alatt a command.com, de sokkal több mindenre képes. Része az operációs rendszernek, ő tartja a kapcsolatot a felhasználó és az operációs rendszer között. Minden felhasználó bejelentkezésekor egy parancsértelmező indul el, amely fogadja a felhasználó parancsait. Változók Minden programozási nyelvben találunk változókat, amelyek (nevükhöz híven) változó adatok tárolását teszik lehetővé (most tekintsünk el a többféle típustól). A programok futásuk során megváltoztathatják az értéküket, de akár műveletet is végezhetnek velük. Környezeti változó Amikor a shell program elindul, egyéb információk elérését biztosítani hivatott a felhasználó és/vagy a programok számára, amelyek a futó környezetet jellemzik. Ezeket a tartalmakat, információkat az úgynevezett környezeti változók tartalmazzák. Elmondható, hogy általánosságban e változók csupa nagybetűkből állnak, hogy könnyen megkülönböztethetők legyenek a felhasználó által létrehozott változóktól. A „Függelék” fejezetben leírtunk pár BASH környezeti változót tartalmi lényegükkel együtt.
10
2.3.
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Terjesztésekkel kapcsolatos alapfogalmak
Disztribúciók A Linuxot kezdetben pusztán az Internetről lehetett beszerezni, és az installálás nem volt megkönnyítve. Ekkor a rendszert még csak a számítógéphez nagyon értők használták. A népszerűség növekedésével azonban igény mutatkozott olyan programcsomag-rendszerre, amely a kevésbé szakértő számára is lehetővé teszi a telepítést, használatot. A különböző célkitűzéseket és embercsoportokat megcélzó összeállítások különböző terjesztések megjelenését eredményezték. Egy disztribúció általában tartalmaz egy telepítő felületet (jelentősen eltérhet az egyes terjesztések telepítő felülete), valamint számos programot tartalmazó program-gyűjteményt, amelyből a kívánt programot a csomagtelepítővel könnyen a rendszerhez adhatjuk. Csomagtelepítés Majdnem mindegyik Linux disztribúció rendelkezik csomagtelepítési funkcióval, ami sokkal könnyebbé teszi egy adott program hozzáadását a rendszerhez. Ugyanis nem kell lefordítani, a fordításkor beállítani egyéb paramétereket, hanem egyszerűen a rendszer csomagkezelőjével hozzáadjuk a rendszerhez a már valaki által lefordított program(csomag)ot. Az egyes disztribúciók csomagjai nem kompatibilisek egymással, azaz a Debian GNU/Linux .deb fájljait nem tudjuk felhasználni Ret Hat Linux rendszerhez, mert az utóbbi .rpm csomagokat használ. A különböző rétegcsoportot megcélzó disztribúciók belső felépítése eltér egymástól és ennek köszönhető, hogy a csomagformátumuk is eltér egymástól.
2.4.
Grafikus felülettel kapcsolatos alapfogalmak
Frontend Nagyon sok programot készítettek már GNU/Linux rendszerek alá és remélhetőleg még többet fognak, viszont ezek közül sok a „kezelőfelület”. Amik feladat szempontjából nem magát a feladatot végzik el, hanem csak lefuttatják az arra megírt programokat. Nem kell ismerni az eredeti program paramétereit, kapcsolóit, hanem egy egyszerű karakteres vagy grafikus kezelőfelület segítségével elvégeztethető a kívánt feladat. X Window System Szokás egyszerűen X szervernek, vagy még rövidebben, X-nek hívni. Feladata a grafikus felület előállítása, az erőforrások kezelése, úgymint egér, billentyűzet, videokártya, monitor, stb., de erőforrásként jelentkeznek a szerver számára a különböző ablakok, kurzorok, betűtípusok is.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
11
Ablakkezelő Az X indulásakor csak egy grafikus felületet kapunk, semmi többet. Ahhoz, hogy programokkal tudjunk kényelmesen dolgozni, szükség van egy ablakkezelő programra, aminek az a feladata, hogy egy grafikus program elindulásakor, a program köré egy keretet rajzoljon, kezelje a kereten elhelyezett funkcióbillentyűket. Más szavakkal, nem a program „foglalkozik” a keret előállításával, az ablak mozgatásával, méretének változásával és bezárásával, stb., hanem az ablakkezelő végzi, rajta keresztül tudja a program, hogy mi a teendője.
12
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Jónás Zsolt
3.
GNU/Linux - kezelési ismeretek I.
13
fejezet
Könyvtárszerkezet
Az „egyéb” rendszereken az a hozzáállás alakult ki, hogy egy felpartíciózott merevlemez minden szeletéhez külön betűjel tartozzék, így a felhasználó szeparálva tarthatja adatait. A GNU/Linux rendszer felépítése, ha nem is gyökeresen, de jelentősen eltér. Csak egyetlen egy gyökér könyvtár létezik és ebből „ered” az összes könyvtár, alkönyvtár és fájl. A feldarabolt merevlemezünk egyes részei nem kapnak betűjelet, hanem hozzárendelhetjük (felcsatolhatjuk) a rendszer egy könyvtárához. E művelet után a partíció tartalma abban a könyvtárban érhető el. Persze le is csatolhatjuk bármikor a rendszerből, feltéve, hogy egyetlen egy program sem dolgozik azon partíció valamelyik könyvtárával, fájljával, valamint nem tartózkodunk egyik könyvtárában sem. Érdemes tudni Mielőtt még tanulmányoznánk a könyvtárstruktúrát, meg kell említenünk két speciális könyvtárnevet (hivatkozást, mutatót), ami az összes könyvtárban jelen van. Az egyik a „.” (pont) hivatkozás, ami mindig az aktuális könyvtárra mutat és hivatkozhatunk is vele rá, sőt, sokszor nélkülözhetetlen a használata. A másik pedig a „..” (pont-pont) mutató, ami a szülőkönyvtárra mutat, ahonnan származik az aktuális könyvtár.
14
GNU/Linux - kezelési ismeretek I.
3.1.
Jónás Zsolt
A gyökér („/”) alkönyvtárai
Elsőként ismerkedjünk meg a már említett gyökér könyvtárral, illetve a gyökér könyvtárban elhelyezkedő könyvtárakkal. Melyik könyvtárat mire használják, és egyáltalán kik férhetnek hosszá, kik használhatják a tartalmukat. Következőképpen néz ki egy átlagos gyökér könyvtár tartalma: Bash$ tree / -d –L 1 / |-- bin |-- boot |-- cdrom |-- dev |-- etc |-- floppy |-- home |-- initrd |-- lib |-- lost+found |-- mnt |-- opt |-- proc |-- root |-- sbin |-- tmp |-- usr `-- var 18 directories Bash$
/bin Itt helyezkednek el az alapvető programok, amelyeknek még akkor is elérhetőknek kell lenniük, ha valamiért a /usr könyvtár elérhetetlen. Ellentétben a /sbin könyvtárral, amelyben csak a rendszer betöltéséhez és az adminisztrációs feladatok elvégzéséhez szükséges programok foglalnak helyet, a /bin könyvtárban lévő programokat a rendszer minden felhasználója használhatja. /boot Ebben a könyvtárban helyezkedik el a kernel, a Linux Loader (LILO) map fájlja, ami tartalmazza a régi Master Boot Record (LILO előtti) állapotot. Ha nem a LILO program a rendszer betöltő program, hanem a GRUB, akkor létezik egy /boot/grub könyvtár és benne a GRUB egyéb beállító és használati fájljai. /dev Ahogy a neve is jelzi, itt helyezkednek el az eszközkezelők (device). Pontosabban minden eszközhöz hozzá van rendelve egy fájl, amin keresztül elérhető az eszköz, legyen az akár videókártya, hangkártya, tv-kártya, egér, háttértároló, stb.
Jónás Zsolt
15
GNU/Linux - kezelési ismeretek I.
Lássunk példát device fájlokra: Bash$ ls –lak /dev brw-rw---1 root brw-rw---1 root brw-rw---1 root brw-rw---1 root brw-rw---1 root ... crw-rw-rw1 root ... crw-rw---1 root crw-rw---1 root ... crw-rw-rw1 root Bash$
disk disk disk disk disk
3, 3, 3, 3, 3,
0 1 11 12 2
máj máj máj máj máj
4 4 4 4 4
14:25 14:25 14:25 14:25 14:25
hda hda1 hda11 hda12 hda2
root
1,
3 máj
4 14:25 null
video video
81, 81,
1 máj 2 máj
4 14:25 video1 4 14:25 video2
root
1,
5 máj
4 14:25 zero
Most az egyéb számoktól és betűktől vonatkoztassunk el, csak nézzünk az első oszlop első oszlopát: b és c. Kétféle eszközfájl létezik: a karakteres (c) és a blokk (b) típusú. A másik érdekesség egy normális könyvtárlistához képest, az 5. és a 6. oszlop megléte. Ugyanis az eszközöket 2 rétegű struktúrába csoportosítjuk. Az első (ami jelen esetünkben 3, 1, 81) a főcsoport azonosítója, ami eszközönként más és más, de eszközön belül nem változik (például: háttértároló azonosítója). A másik az alcsoport-azonosító, ami az eszközön belüli alegységek saját számai (például: háttértárolón belüli partíciók azonosítója). Belátható, hogy az így előre megszabott számozás mennyiségi korlátokat szab. Megszületett hát a devfs, amely az eszközt azonosító fő- és alcsoportot dinamikusan változtathatóvá tette. De leálltak a fejlesztésével, így a következő kernel széria (2.6.x) megjelenésével leváltja az udev, amely még többet tud, mint devfs társa. A probléma elő jön itt is, miszerint nem kompatibilis az előző megoldással, így idő kell, amíg a programfejlesztők átállnak a használatára. Azonban időközben kiderül, hogy fejlesztés alatt van egy uSDE megoldás is. E sorok írásakor még nem lehet megjósolni, melyik marad meg, mely kerül bele hivatalosan a kernelbe, de az is előfordulhat, hogy a két projekt összeolvad. Az idő majd megadja a választ. /etc A legtöbb program itt tárolja az alap konfigurációs fájlját. A fájlrendszerre vonatkozó szabványok megalkotása előtt több rendszerprogramnak és démonnak adott otthont, mint például az init és update. Mostanra azonban ezek a programok átkerültek a /sbin vagy a /usr/sbin könyvtárba. E könyvtárral illetve fájljaival részletesebben foglalkozunk majd egy későbbi fejezetben. /home A root kivételével az összes felhasználó saját (home) könyvtára itt helyezkedik el, amelyek többek között az egyénre jellemző beállító fájlokat is tartalmazzák, valamint a /tmp könyvtár kivételével minden felhasználó csak ide dolgozhat alapesetben. Érdemes ezt a könyvtárat külön partícióra helyezni.
16
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
/lib A megosztott könyvtárakat tartalmazza, amelyeket szinte mindegyik dinamikusan linkelt program használja, valamint a könyvtáron belül elhelyezkedő modules alkönyvtár tartalmazza az összes kernel modulját. /lost+found A jelenleg létező Ext2 és Ext3 fájlrendszer használata esetén jön létre. Az fsck és egyéb segédprogramok használják. /mnt A nem a rendszer részét képező eszközök (floppy, cdrom, háttértár egyéb partíciói, NFS) csatolásait ebbe a könyvtárban elhelyezett alkönyvtárakba ajánlott csatolni. A floppy és cdrom eszközöknek létre szoktak hozni a gyökérben egy /floppy és egy /cdrom könyvtárat csatolási pontnak a rendszeres használat megkönnyítésére. /opt A rendszerhez hozzáadott statikus program(csomag)ok elhelyezési helye. /proc A kernel a memóriában tárol a rendszerről és processzekről különböző információkat. E belső információs táblázatból egy könyvtárrendszert szimulál és a /proc könyvtárba csatolja, így a rendszerről és a futó processzekről könnyen kaphatunk információt. Rendszerinformációkat megjelenítő programok is innen dolgoznak. /root A rendszeradminisztrátor saját (home) könyvtára, de még sem a /home könyvtárban helyezkedik el. Célszerű ugyanis a rendszer gyökérkönyvtárát tartalmazó rendszerpartíción létrehozni. Ha valami oknál fogva az egyéb partíciók csatolása nem lehetséges, abban az esetben is be tudjon jelentkezni a root felhasználó. /sbin A rendszer betöltéséhez és az adminisztrációs feladatok elvégzéséhez szükséges programok foglalnak helyet itt, csak a root felhasználó számára érhetőek el az itt elhelyezkedő programok. /tmp A legtöbb program itt tárolja az ideiglenes fájljait, valamint a rendszer felhasználói is ide dolgozhatnak. A könyvtáron belül bárki írhat/olvashat fájlokat/könyvtárakat, de csak a saját fájlját és könyvtárát törölheti. Általában rendszerindulásakor a /tmp könyvtár tartalma
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
17
törlődik, de nem mindegyik disztribúció tarja fontosnak ezt. A Debian üríti a /var/lock és a /var/run könyvtár tartalmával egyetemben. /usr A rendszer működéséhez közvetlenül nem szükséges programok és állományok helyezkednek el itt. /var A rendszer során változó fájloknak otthont adó könyvtár.
3.2.
Az /usr alkönyvtár
Olyan parancsok, programok és nem változó állományok, amelyek nem feltétlenül szükségesek a rendszer betöltődéséhez, így azt is megtehetjük, hogy csak olvashatóként csatoljuk a rendszerhez. Ilyen esetekben akár CD-ről is használhatjuk vagy NFS-en keresztül. NFS használata esetén azt is megoldhatjuk, hogy csak a szerveren tároljuk a /usr tartalmát és exportáljuk a tartalmát a host gépek felé. Következőképpen néz ki egy átlagos /usr könyvtár tartalma: Bash$ tree /usr -d –L 1 / |-- X11R6 |-- bin |-- doc |-- etc |-- games |-- include |-- info |-- lib |-- local |-- man |-- sbin |-- share `-- src 13 directories Bash$
/usr/X11R6 Az „X Window System” minden fájlja itt található, kivéve a /etc/X11 könyvtár, ami a beállító (config) fájlokat tartalmazza.
18
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
/usr/bin A felhasználók számára elérhetővé tett és használható program gyűjteménye, valamint egy-két adminisztrációs program a superuser (root) számára. /usr/doc Olyan, a programokhoz adott dokumentációk tartózkodási helye, amelyek nem a man része. Általában a benne levő könyvtárak linkelve1 vannak a /usr/share/doc könyvtárból. /usr/games Kikapcsolódásra, szórakozásra használt játékprogramok, amelyek másodlagos szerepet töltenek be a többi program mögött. /usr/include A C programozási nyelv include (header) állományai. /usr/lib Az egyéb programok nem változó megosztott könyvtárai, vagy nem közvetlen, a felhasználó által futtatandó programok gyűjtőhelye. Egy program saját alkönyvtárt is létrehozhat, ha fájljait csak saját maga használja. /usr/lib/X11 Ez csak egy link az /usr/X11R6/lib/X11 könyvtárra, kompatibilitás miatt. /usr/local Azok a programok kerülnek ide, amelyek nem szerves részei a disztribúciónak, de mégis hozzá lettek adva a rendszerhez. Előfordulhatnak olyan rendszerek, ahol e könyvtárt külön csatolják, hogy akkor is írható lehessen, amikor a /usr könyvtárat „csak-olvasható”-ként fűzik fel a rendszer részévé. /usr/man A man oldalak helye témakörökre bontva. Manapság a /usr/share/man könyvtárat használják, de előfordulhatnak programok, amelyek még mindig a /usr/man könyvtárral dolgoznak. /usr/sbin Olyan rendszer-felügyeleti és rendszeradminisztrációs feladatok elvégzésére való programok gyűjteménye, amelyek a rendszer betöltődési folyamat során nem feltétlenül szükségesek. 1
A link mutatót, csatolót jelent. Bővebben foglalkozunk vele a „7. Fájlbejegyzések és jogok” fejezetben.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
19
/usr/share Gépfüggetlen könyvtárak és fájlok gyűjteménye, amelyek minden probléma nélkül felcsatolhatóak más gépekre NFS-sel. A /usr/doc könyvtár elemei linkek a / usr/share/doc könyvtára elemeire. /usr/src A forrásból telepített programok forráskódjait tartalmazó könyvtárak lelőhelye. A kernel forráskódja is itt található meg a /usr/src/linux könyvtárban.
3.3.
A /var alkönyvtár
Ez a könyvtár tartalmazza az összes olyan rendszerüzemeléssel kapcsolatos fájlt, amelyeket folyamatosan kell írni, és amelyek mérete gyakran változik (szinte mindig nő). Ezek közé tartoznak a napló és a spool fájlok. Sok olyan alkönyvtár, amely a /var alatt helyezkedik el, korábban a /usr alatt volt, de annak érdekében, hogy a /usr könyvtárat csak-olvasható hozzáféréssel lehessen NFS-enként logikailag bekötni, ezek a dinamikus alkönyvtárak a /var könyvtár alá kerültek át. Ilyen könyvtárak például a következők: /var/spool, /var/lock, /var/log. Következőképpen néz ki egy átlagos /var könyvtár tartalma: Bash$ tree /var -d –L 1 / |-- backups |-- cache |-- games |-- lib |-- local |-- lock |-- log |-- mail |-- opt |-- run |-- spool |-- state |-- tmp `-- www 14 directories Bash$
/var/backups Egyes config fájlok biztonsági másolati.
20
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
/var/cache Egyes programok működésük gyorsítására, hatékonyságuk növelése érdekében fájlokat helyeznek el itt. /var/games Legtöbb, a disztribúció részét képező játék a dicsőségtábláját (highscore) ebben a könyvtárban helyezi el. /var/lib Alkalmazásokhoz vagy a rendszerhez tartozó állapotinformációk tartózkodási helye. Egy könyvtár mindenképpen létezik, ez pedig a misc. A /var/lib/misc olyan alkalmazások állapotinformációt tartalmazza, amelyeknek nincs szükségük saját könyvtárra. /var/lock Egyes programok indulásukkor speciális fájlokat helyeznek el itt, amivel tudatják a többi programmal, hogy mely eszközöket, fájlokat használják elkerülve az együttes használatot, valamint megakadályozhatják, hogy több példány fusson saját magukból. Nem tanácsos a program futása alatt e fájlokat eltávolítani. A Debian indítás során üríti e könyvtár tartalmát. /var/log A rendszer működése során keletkező naplófájlok könyvtára. A felhasználók be- és kijelentkezéseit a wtmp fájl tartalmazza. Általában érvényes, hogy ha nem létezik a log fájl, amiben kellene tárolni az adatokat, nem fog létrejönni a fájl „magától”. Például, a faillog fájl tartalmazza a sikertelen bejelentkezéseket, azonban ha nem létezik, akkor nem jön létre a fájl és nem tárolódnak benne a bejegyzések, és így nem fogjuk megtudni, ha valaki próbálkozgat belépni a felhasználói nevünkkel. Célszerű nem ész nélkül törölgetni a könyvtáron belül, vagy ha mégis törlésre kerül valamelyik log fájl, akkor célszerű létrehozni üres tartalommal1. /var/mail A rendszer minden felhasználójának a postaládája ebben a könyvtárban található meg alapesetben. Egyes grafikus levelező programok a felhasználó home könyvtárában található Mail (általában: /home/
/Mail) könyvtárat használják a levelek tárolására. /var/opt A /opt könyvtárban telepített program(csomag)ok változó tartalmú adatait tartalmazó fájlok tartózkodási helye.
1
Lásd „9. Könyvtár- és fájlkezelő parancsok” fejezet touch parancsa.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
21
/var/run A könyvtárban lévő fájlok tárolják a futó programok azonosító számát, valamint a bejelentkezett felhasználókat. A futó rendszerbe bejelentkezett felhasználókról az utmp fájl tartalmaz információt, többek között a finger1 parancs is ezt a fájlt használja. /var/spool Sorban álló műveletek fájljai vannak itt elhelyezve, ilyen lehet például a nyomtatásra váró feladatok, levelezéssel kapcsolatos fájlok, időponthoz kötött, automatikusan végrehajtott feladatok (cron). /var/state A /var/lib könyvtárral megegyező a szerepe, pontosabban annak a helyettesítésére, leváltására szánták. /var/tmp Ideiglenesen használt fájlok és könyvtárak helye, amelyek fenntartottak a rendszer két bootolása között. /var/www A rendszeren futó webszerver alap honlapját tartalmazó könyvtár.
1
A finger parancsra még visszatérünk a „6. Felhasználók és csoportok kezelése” fejezetben.
22
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Jónás Zsolt
4.
GNU/Linux - kezelési ismeretek I.
23
fejezet
Rendszer elindulása és leállása
A könyvtárstruktúra, az alapvető könyvtárak megismerése után nézzük meg, mi történik a rendszer elindulásakor és leállásakor, valamint hogyan befolyásolhatók e folyamatok.
4.1.
Indulási folyamat
Az indulás A számítógép bekapcsolásakor a BIOS öntesztje és a meghajtók detektálása után a boot-olási folyamat veszi kezdetét. Jelen esetünkben feltételezzük, hogy az elsődleges boot-olási eszköznek a rendszerünket tartalmazó merevlemez van megadva, illetve a merevlemezünk előtt megadott boot-olási eszközökről nem indul el a gép. A BIOS megvizsgálja a háttértároló legelső blokkját (MBR). Az ott elhelyezkedő betöltő program vagy elindítja a megadott partíción elhelyezkedő rendszert, vagy átadja egy másik partíció legelső blokkjában (SBR) elhelyezett rendszerbetöltő programnak a vezérlést. A LILO mind az MBR mind az SBR helyen elhelyezhető, és mind a két blokkban el tudja indítani a többi rendszert. Ha csak egy GNU/Linux rendszer helyezkedik el a merevlemezen, akkor is szükséges a LILO használata. A LILO szükséges a kernel betöltéséhez. A rendszer elindulásának a folyamata a kernel betöltődésével veszi kezdetét. A kernel betöltődése után inicializálja a hardver elemeket, betölti a szükséges eszközvezérlőket, majd elindítja az init programot. Az init a legelső process ami elindul. Feladata a fájlrendszer ellenőrzése, a démonok elindítása és a bejelentkezések lehetővé tétele (getty futtatása).
24
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Futási szintek Az init több remek tulajdonsága mellett, biztosít a rendszergazdának különböző futási szinteket. A futási szintek segítségével befolyásolni lehet, hogy a boot-olási folyamat során mely démonok (milyen szolgáltatások), programok induljanak el. Hét futási szint van: 0: 1:
2, 3, 4, 5: 6:
Rendszer lekapcsolására szolgáló futási szint. Minden folyamatot leállít, majd kikapcsolja a számítógépet (ha lehetséges). Egyfelhasználós üzemmód, csak a rendszergazda léphet be, más néven szerviz üzemmód. Sajnos több terjesztés sem tartja fontosnak a rendszergazda jelszavának kérését e futási szint használatakor, a Debian bekéri. Alapesetben, a telepítés befejezése után, azonos programokat indítanak el. A rendszergazdára bízzák a különböző futási szintek létrehozását igény esetén. Rendszer újraindítására szolgáló futási szint. Minden folyamatot leállít, majd újraindítja a számítógépet.
A 2-es az alap futási szint, de a boot-olási folyamat megkezdése előtt, a LILO-ból, megadható a kívánt futási szint: lilo: lilo: Linux-2.4.21 4
Szerviz üzemmód betöltése a következőképpen is lehetséges: lilo: 1/single lilo: Linux-2.4.21 1
Az „1”-es helyett írhatunk „single” opciót is: lilo: Linux-2.4.21 single
Rendszer betöltődése után, a rendszer használata közben is lehet futási szintet váltani (de csak a rendszergazda teheti meg): Bash$ init 4
Most nézzük meg a /etc/inittab config fájl tartalmát, amellyel szintén befolyásolhatók az egyes szintek. Alap futási szint beállítása: id:2:initdefault:
A szerviz szint kivételével, az összes többi futási szint esetén lefuttatásra kerülnek az alábbi könyvtárban elhelyezkedő script fájlok: si::sysinit:/etc/init.d/rcS
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
25
Azért felel a következő sor, hogy szerviz üzemmód indítása esetén kérjen root jelszót a rendszer: ~~:S:wait:/sbin/sulogin
Megadható, hogy az egyes futási szintek indulásakor milyen program/script induljon el és milyen paraméterekkel: l0:0:wait:/etc/init.d/rc l1:1:wait:/etc/init.d/rc l2:2:wait:/etc/init.d/rc l3:3:wait:/etc/init.d/rc l4:4:wait:/etc/init.d/rc l5:5:wait:/etc/init.d/rc l6:6:wait:/etc/init.d/rc
0 1 2 3 4 5 6
A megadott script az „/etc/rcX.d”1 könyvtárban elhelyezett programokat indítja el vagy állítja meg. A könyvtárban minden fájl neve vagy „S” vagy „K” betűvel kezdődik, és két számmal folytatódik, majd a program neve követi. Az „S” (start) betű azt jelenti, hogy az adott programot el kell indítani, a „K” (kill) betű épp ellenkezőleg, le kell állítani az adott alkalmazást. A betűk után szereplő számoknak a sorrend meghatározásában van feladatuk2. Ha van több olyan fájl, amelynek betűjele és sorszáma is azonos, akkor futási sorrendjüket a névben szereplő többi betű, ábécé rendbeli elsőbbségük, dönti el. Beállítható, hogy a CTRL+ALT+DEL billentyűkombinációra mi történjen: ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
UPS jelzéseire történő reagálást a következő sorok adják meg: pf::powerwait:/etc/init.d/powerfail start pn::powerfailnow:/etc/init.d/powerfail now po::powerokwait:/etc/init.d/powerfail stop
A konzolok számát a következőképpen adhatjuk meg: azonosító:futásszint:tevékenység:processz 1:2345:respawn:/sbin/getty 38400 tty1 2:23:respawn:/sbin/getty 38400 tty2 3:23:respawn:/sbin/getty 38400 tty3 4:23:respawn:/sbin/getty 38400 tty4 5:23:respawn:/sbin/getty 38400 tty5 6:23:respawn:/sbin/getty 38400 tty6
Alapesetben 6 darab terminálon tudunk bejelentkezni a rendszerbe, de ezt akár növelhetjük vagy csökkenthetjük, igény szerint. Maximálisan 63 konzolt hozhatunk létre. A futásszint mezőben lehet megadni, hogy melyik futási szinten legyen elérhető az aktuálisan megadott konzol bejelentkezésre. A tevékenység mezőben adható meg, hogy milyen feltételekkel fusson le a processz mezőben megadott program. Felsorolunk néhányat közülük: 1 2
X lehet 0, 1, 2, 3, 4, 5, 6 – a futási szintnek megfelelően Minél kisebb a szám, annál előbb hajtódik végre a parancs
26
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
respawn wait
A program automatikusan újraindul megállása után. A processz akkor indul el, amikor a megadott futási szintre lép a rendszer, és az init addig vár, amíg a processz fut. once Csak egyszer, a futási szintre lépéskor indul el. boot A process a rendszer újraindulása közben indul el (a megadott futási szint lényegtelen ilyenkor). bootwait A processzt a rendszer indulása közben indítja el, az init megvárja amíg lefut. initdefault Az initdefault bejegyzést azt adja meg, hogy a rendszer induláskor melyik futási szintre lép automatikusan, ha nem adjuk meg, akkor az init bekéri a konzolról. sysinit A processz a rendszer újraindítása alatt hajtódik végre, mégpedig a boot és a bootwait bejegyzés előtt. Az init ilyenkor megvárja, hogy a processz befejeződjön, mielőbb továbbmenne. ctrlaltdel A processz akkor hajtódik végre, ha az init SIGINT szignált kap. Ez azt jelenti, hogy a rendszer valamelyik konzolján valaki lenyomta a CTRL+ALT+DEL billentyűkombinációt. Ez általában a rendszer valamiféle leállását okozza: egyfelhasználós módra történő váltás, újraindítás vagy leállítás. A processz mezőben adható meg, hogy melyik program induljon el. Ha a processz mező „+” jellel kezdődik, akkor az init nem készít bejegyzést az utmp és a wtmp fájlokban a processzről. Ha megváltoztattuk az inittab fájlt, akkor ajánlatos az init programmal újraolvastatni a tartalmát, hogy tovább az új beállításokkal fusson: Bash$ init q
vagy Bash$ kill -HUP 1
Előző és az aktuális futási szint megjelenítése – runlevel Lekérdezhetjük az aktuális és az előző futási szintet a runlevel parancs segítségével: Bash$ runlevel N 2 Bash$
Először jeleníti meg az előző, majd szóközzel elválasztva az aktuális futási szintet. Ha az előző állapotot jelző szám helyett egy „N” betű jelenik meg, akkor nem volt előző állapot a gép elindulása óta.
4.2.
Rendszer leállítás
Szigorú szabályok által meghatározott menete van a leállításnak is, ugyanis helytelen lekapcsolás súlyos károkat, akár helyrehozhatatlan adatvesztést is képes okozni. A rendszer
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
27
egyik nagy előnye a stabilitás és ennek függvényében jelentős adatmennyiség foglal helyet a memóriában, ami nem íródik ki a merevlemezre azonnal, így a le nem zárt állományok sérülhetnek, a memóriából még ki nem írt adatok elvesznek egy szabálytalan leállítási folyamat során. A naplózó fájlrendszerek megjelenésével csökkent a fájlsérülések mértéke, de a memóriából történő adatvesztés ellen nem nyújtanak védelmet. Leállítási lehetőségek A leállítási folyamatot a shutdown parancs végzi. Példa egy leállításra: shutdown –h +15 `FIGYELEM: a rendszer leáll 15 perc múlva!'
A „-h” paraméter jelzi azt a shutdown programnak, hogy kapcsolja ki a gépet, ha tudja, a leállítási folyamat végén. Helyette az „-r” kapcsolót megadva a gép újraindul. Várakozás nélküli lekapcsolásra a következőképpen utasíthatjuk a rendszert: shutdown -h now
A kikapcsolási folyamat elindítását a halt vagy a poweroff, az újraindítási folyamat elindítását a reboot paranccsal is kezdeményezhetjük. E négy parancsot csak rendszergazdaként adhatjuk ki. A /etc/inittab fájlban megadható, hogy CTRL+ALT+DEL billentyűkombináció karakteres felületen való lenyomására mi történjen. Alapesetben újraindul a számítógép, de a folyamat elindítása előtt a shutdown program megnézi, hogy létezik-e az /etc/shutdown.allow fájl, ha nem létezik, akkor bárki újraindíthatja a számítógépet karakteres felületen az említett billentyűkombinációval. Azonban ha a fájl létezik, akkor megnézi, hogy az a felhasználó szerepel-e a fájlban, ha nem, akkor egy szép kis üzenettel a felhasználó tudtára hozza, hogy nem jogosult a folyamat elindítására: shutdown: no authorized users logged in.
Azonban, ha a felhasználó szerepel a fájlban, akkor elindul az újraindítási folyamat azonnal. FIGYELEM! Fontosságát hangsúlyozva, felhívjuk a figyelmet újra arra, hogy a helytelen rendszerleállítás helyrehozhatatlan károkat képes okozni!
28
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Jónás Zsolt
5.
GNU/Linux - kezelési ismeretek I.
29
fejezet
Bejelentkezés és kijelentkezés
Egy többfelhasználós rendszernek szükséges megkülönböztetnie egymástól a felhasználóit, hogy tudjanak egyszerre is dolgozni, valamint hogy egymás fájljaihoz és könyvtáraihoz ne férhessenek hozzá engedély nélkül. A fejezetben átnézzük, hogy a felhasználók hogyan léphetnek be a rendszerbe, hogyan jelentkezhetnek ki, valamint hogy milyen segédprogramok állnak rendelkezésére a rendszergazdának a felhasználók kezelésére.
5.1.
Bejelentkezés
Mielőtt használatba vennénk a parancsértelmezőnket, előbb be kell jelentkezni a rendszerbe. Ezt kétféleképpen tehetjük meg, vagy a számítógép előtt ülve, vagy távolról. A következőkben átvesszük mindkettőt. Helyi bejelentkezés A bejelentkezési folyamat a getty program indulásával kezdődik. Az inittab fájlban állíthatjuk be, hogy melyik számú terminálokon induljon el a getty program, tehát hányas számú terminálokon léphetünk be a rendszerbe. A getty feladata, elindítani a login programot, amely kéri a felhasználói nevet. Ha begépelésre került és nyugtázva lett az ENTER billentyűvel, akkor kéri a jelszót. Ne ijedjünk meg, a jelszó gépelése közben semmilyen karakter sem fog megjelenni biztonsági okok miatt. Fikusz login: jonci Password:
30
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
A login program a /etc/passwd és ha létezik, akkor a /etc/shadow fájlt is felhasználja a felhasználó azonosítására. E fájlokra még visszatérünk hamarosan. A /etc/nologin fájl létrehozásával megakadályozható a felhasználók belépése, csak a rendszergazda jelentkezhet be. A rendszer lekapcsolásakor is automatikusan létrejön, hogy senki se léphessen be. Karakteres, helyi bejelentkezés esetén a „ login:” előtt a rendszer megjeleníti a /etc/issue fájl tartalmát. Ebben különböző információk megjelenítésére1 utasíthatjuk a getty parancsot. Sikeres bejelentkezés után pedig a képernyőre kerül a /etc/motd fájl tartalma, valamint a rendszer ellenőrzi, hogy van e levelünk a /var/mail/ postafiókunkban és közli velünk, mit talált2: „You have new mail.” esetleg „You have mail.” vagy „No Mail.”. Mind az motd fájl, mind a levelesláda állapotának megjelenítését letilthatjuk a login3 könyvtárunkban a „.hushlogin” fájl létrehozásával. Távoli bejelentkezés Vonatkoztassunk el a hardver feltételektől, foglalkozzunk inkább csak a szoftver oldalával. A két gépnek kommunikálnia kell egymással és ehhez programok szükségesek. Amelyik géphez akarunk csatlakozni, azt nevezzük szerver gépnek, a másikat pedig kliensnek. Többféle kommunikációs csatorna létezik, a használni kívánt programtól függ, hogy melyikkel jön létre az adatforgalom. Amikor csatlakozni akarunk egy szerverhez, akkor először kéréssel fordulunk hozzá4. A kérésre háromféleképpen reagálhat a szerver. Az egyik lehetőség, hogy a szolgáltatást biztosító program fut a háttérben (démon), fogadja a kéréseket és biztosítja a kommunikációt. A másik lehetőség, hogy – a háttérben mindig futó – inetd démon fogadja a kérelmeket és elindítja a szolgáltatást biztosító programot. A /etc/inetd fájlban állíthatjuk be a biztosítani kívánt szolgáltatásokat. Figyeljünk rá, hogy alapesetben sok szolgáltatás engedélyezve lehet, feleslegesen, valamint biztonsági rést is jelenthet, így a nem használt szolgáltatást jobb, ha bezárjuk5. Végül pedig, a harmadik esetben a szerver elutasítja a kapcsolatot. Többek között lehet oka, hogy nem fut a szolgáltatás, ami feldolgozná a kéréseket, vagy tűzfal nem engedi, hogy igénybe vegyék a szolgáltatást, stb. Szolgáltatások tiltása és engedélyezése számítógépenként Lehetőségünk van az inetd szolgáltatását egyenként tiltani vagy engedélyezni adott címekre. A tiltásokat a /etc/hosts.deny fájlban, az engedélyezéseket a /etc/host.allow fájlban kell megadni. Ha nem léteznek, akkor semmiféle korlátozás nincs beállítva. Célszerű a /etc/hosts.deny fájl tartalmát a következőre beállítani:6 ALL: ALL 1
Aki ráér, akár ASCII grafikát is belerakhat, lehet színeket is használni. Bővebben a „man getty” oldalon. „Új levél van.” „Levél van.” „Nincs levél.” 3 Megadható a rendszernek, hogy sikeres bejelentkezés után, melyik könyvtárba kerüljön az adott felhasználó. Nem szükséges a „/home/” könyvtárat használni minden felhasználónál, csak ajánlott. 4 A használt program saját maga intézni. 5 Az inetd beállítását a „Beállító fájlok könyvtára” fejezetben részletezzük. 6 Fájlszerkesztésről bővebben szólunk a „Szövegszerkesztők” fejezetben. 2
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
31
Ezzel minden szolgáltatást tiltunk mindenkinek befelé. A /etc/host.allow fájlban pedig engedélyezhetjük a kívánt szolgáltatásokat megadott gépekre, vagy tartományokra. A szolgáltatások listáját a /etc/services fájlban találjuk. Most lássuk – például – az ftp szolgáltatás engedélyezését belső hálóra: in.ftpd: 192.168.0.0/255.255.255.0
A két fájl használatával jól konfigurálható egy szerver, de nagyobb biztonságot érhetünk el egy igazi firewall1 beállításával. Standard bemenethez tartozó konzol száma – tty Az aktuálisan használt konzol száma a következőképpen kérdezhető le, ha nem tudnánk, melyik terminálon dolgozunk: Bash$ tty /dev/tty1 Bash$
Utóbbi belépések listázása – last A /var/log/wtmp fájlból olvassa ki az információkat, hogy melyik felhasználó mikor, honnan lépett be, mikor jelentkezett ki, valamint hogy melyik konzolt használta. A kijelzés fordított sorrendben történik, időben visszafelé. A reboot felhasználó a rendszer újraindítását jelzi, az újraindításának dátumát, újraindítási folyamat időtartalmát, valamint a sorban kijelzésre kerül az elindított kernel neve is. Ha nem akarjuk az egész listát megjeleníttetni, akkor a „-szám” vagy a „-n szám” paraméterben megadhatjuk a megjeleníteni kívánt sorok számát: Bash$ last –2 jonci tty2 pedro tty1 Bash$
Wed Nov 26 08:29 still logged in Sun Nov 23 14:35 - 15:35 (01:00)
Lehetőség van a kijelzett lista szűkítésére a felhasználó nevének megadásával is. Listázzuk ki a jonci felhasználó utolsó 3 belépését: Bash$ last –2 jonci jonci tty2 jonci tty1 jonci pts/1 192.168.1.1 Bash$
Wed Nov 26 08:29 still logged in Fri Nov 21 22:36 - 23:24 (00:47) Tue Nov 18 16:41 - 19:15 (02:34)
A listázás harmadik sorában „pts” azonosító jelenti, hogy a rendszerbe történő bejelentkezés nem helyi terminálról történt. A „/” jel után álló „szám” pedig a pts eszköz számát jelenti. Segítségével tudjunk megkülönböztetni több pts eszközt egymástól, úgy mint a tty eszközöket. A következő oszlopban kijelzésre került annak a számítógépnek az IP-címe, amelyről a bejelentkezés történt. A lista szűkítését kérhetjük a bejelentkezésre felhasznált terminál száma alapján is. Próbaként kérdezzük le az utolsó két bejelentkezést a tty2 terminálra: 1
Magyarul tűzfal program, ami ha jól van beállítva, a kéretlen „kopogtatásokat” blokkolja.
32
GNU/Linux - kezelési ismeretek I.
Bash$ last –2 tty2 jonci tty1 jonci tty1 Bash$
Sun Nov 23 11:07 - 13:12 Fri Nov 21 22:36 - 23:24
Jónás Zsolt
(02:05) (00:47)
Az előbbi szűkítésnél, ha nem helyi bejelentkezés szerint szeretnénk szűkíteni, akkor tty eszköz helyett pts eszközt is megadhattunk volna. (Például: last -2 pts/6) Legutolsó belépések idejének lekérdezése – lastlog E program segítségével nézhetjük meg a /var/log/lastlog fájl tartalmát. Megjeleníti a használt felhasználói nevet és terminál képernyőt, távoli bejelentkezés esetén az IP-címet, valamint az időpontot. A „-u felhasználó” paraméterrel szűkíthetjük a kijelzést a megadott felhasználóra. A „-t nap” paraméterrel megadhatjuk, hogy mennyire régi bejelentkezéseket már ne jelenítsen meg, valamint e paraméter felülbírálja a „-u” paramétert. Sikertelen bejelentkezések lekérdezése – faillog Lekérdezhető a sikertelen bejelentkezések, amelyeket a /var/log/faillog fájl tartalmaz. Érdemes megjegyezni, hogy ha a faillog fájl nem létezik, akkor nem kerülnek tárolásra a sikertelen bejelentkezések. Bash$ faillog Username Failures jonci 1 Bash$
5.2.
Maximum 0
Latest h jan 5 17:35:01 +0100 2004 on tty1
Konzol zárolása
Ha a kijelentkezés lehetőségével nem akarunk élni, akkor van mód a konzolunk lezárására, erre való a vlock parancs. Konzol zárolása – vlock Egy vagy több session lezárására használható a konzolon. Ez különösen akkor hasznos, ha a géphez több személy is hozzáférhet a konzolon keresztül. Azonban a felhasználó zárolhatja a session-jeit, így hozzáférést biztosítva mások számára a többi virtuális konzolon (VK) anélkül, hogy ki kellene lépnie a rendszerből. Amennyiben szükséges, a VK-váltást is letilthatja. This TTY is now locked. Use Alt-function keys to switch to other virtual consoles. Please enter the password to unlock. jonci's Password: root's Password:
Alapértelmezésben, csak az éppen használt VK-t zárolja a parancs. A „-a” és a „--all” kapcsolókkal az összest lezárhatjuk. A lezárt VK csak a felhasználó jelszavával vagy a root jelszóval szabadítható fel. A root jelszó bármelyik illetve mindegyik session-t nyitni tudja. A
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
33
vlock engedélyezi a jelszó újbóli beütését korlátok nélkül, így jól válasszuk meg
jelszavainkat1:
Bash$ vlock -a The entire console display is now completely locked. You will not be able to switch to another virtual console. Please enter the password to unlock. jonci's Password: root's Password:
Figyeljünk arra, hogy a „-a”, és a „--all” kapcsolókkal teljesen kizárhatjuk magunkat a rendszerből, ha elfelejtjük a jelszót, és nem tudunk bejelentkezni egy másik gépről, hogy kilőjük a vlock process-t. Ilyenkor csak a számítógép újraindításával lehet feloldani a zárat (CTRL+ALT+DEL), lehetőleg kerüljük a RESET gomb használatát. Ha a CTRL+ALT+DEL kombinációval sem tudnánk újraindítani a számítógépet, használjuk a MAGIC gombokat2.
5.3.
Kijelentkezés
Amikor a számítógép továbbra is bekapcsolva marad, de befejeztük a munkánkat vele, célszerű kijelentkezni, hogy mások a mi hozzáférésünkkel és jogainkkal ne tevékenykedhessenek a rendszerben. Kijelentkezés megvalósításához több úton is eljuthatunk: Az egyik megoldás, hogy meghívjuk az exit parancsot, ami bezárja az éppen használt parancsértelmezőnket. A másik lehetőség, hogy beírjuk a logout parancsot, amivel közölhetjük a héjprogramnak a kilépési szándékunkat. Harmadiknak említjük meg a logout forróbillentyűjét, a CTRL+D billentyűkombináció lenyomásával a logout parancs kiadását kérhetjük. Azonban, ha futnak a jogainkkal programok a háttérben3, amelyek nem démon programok, akkor kijelentkezés helyett először a héj figyelmeztet: Bash$ logout There are stopped jobs. [1]+
Stopped
mc -a –u
Ilyenkor vagy kilőjük4 az összes, felsorolt programot a memóriából, vagy egy kecses mozdulattal újra megismételjük a kijelentkezési parancsunkat, amelynek hatására a héj bezáródik, és vele együtt az összes általa elindított program is.
1
Jelszónak ne adjuk meg: családtagok, ismerősök, háziállatok, stb. neveit. Lehetőleg a jelszó tartalmazzon kis-, nagybetűt és számot. 2 A „Kernelfordítás” fejezetben részletezzük a használatát. 3 Lásd „11.3 Héjon belüli folyamatazonosítási rendszer” fejezet 4 Erre a kill vagy a killall parancs használható. A „11. Folyamatvezérlés” fejezetben bővebben ismertetjük a használatukat.
34
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Jónás Zsolt
6.
GNU/Linux - kezelési ismeretek I.
35
fejezet
Felhasználók és csoportok kezelése
Többfelhasználós rendszerekben szükséges, hogy legyenek olyan programok, amelyekkel a rendszerhez hozzáadott felhasználókat, felhasználói csoportokat lehet karbantartani, kezelni, vagy egyéb információkat kérhetünk a felhasználókkal kapcsolatban. Természetesen nem mindegyik ilyen program használható minden felhasználó által, sőt, a karbantartó és kezelő programok használata kizárólag a root privilégiuma.
6.1.
Felhasználók, csoportok és jelszavak tárolása
A rendszer által ismert felhasználók listáját a /etc/passwd fájlban tárolja több információval egyetemben, köztük a jelszóval is. Azonban e fájlt a rendszer minden felhasználója olvasni tudja, ezért ez a megoldás nem a legbiztonságosabb. Igaz, hogy a GNU/Linux a jelszavakat egyirányú kódolással tárolja, azaz nem lehet visszafejteni, csak brutalforce módszerrel, így létrehozták a /etc/shadow fájlt, amit a kódolt jelszavak tárolására van és csak a root olvashatja. A GNU/Linux alatt a rendszer a felhasználókat nem ismeri név szerint. Minden felhasználó és csoport egy azonosító számmal1 szerepel. A kijelzésnél a programok keresik meg a / etc/passwd fájlban a számhoz tartozó felhasználói nevet, amit azután megjelenítenek. A rendszergazda száma a 0 (nulla), a többi felhasználó száma Debian rendszerekben 999 feletti. Amikor egy felhasználót hozzáadunk a rendszerhez, akkor kap egy azonosító számot, valamint létre jön a felhasználói nevével azonos tulajdonosi csoport is, amelyhez ugyanaz az 1
Az azonosító csak pozitív egész szám lehet.
36
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
azonosító szám tartozik. Felhasználó eltávolítása esetén az azonosító szám felszabadul, és újra felhasználhatóvá válik a rendszer számára egy új felhasználó hozzáadásánál. Csípjünk ki egy sort a /etc/passwd fájlból és nézzük meg a felépítését: jonci:x:1000:1000:Jónás Zsolt,,,:/home/jonci:/bin/bash
A sorban eltárolt információk területekre vannak osztva a „:” (kettőspont) jellel. Legelöl szerepel a felhasználói név. A következő részben helyezkedne el a jelszó, amit biztonsági szempontból nem itt tárolunk, ezért egy „x” karakter jelzi, hogy a /etc/shadow fájlban kell keresni. Ha az „x” helyett „!” (felkiáltójel) található, akkor az adott felhasználó belépése tiltva van. A következő oszlopban szerepel a felhasználó-azonosító szám (UID), utána a csoportazonosító szám (GID). Ezután egy nagyobb rész következik, ami a felhasználóról tárol információkat, ha ki lett töltve (teljes név, telefonszám, stb.). Az utolsó előtti rész tárolja a felhasználó saját (home) könyvtárát. Legvégül pedig azt a programot kell megadni – elérési útvonallal együtt –, ami a felhasználó helyes azonosítása után elindul a rendszerbe történő belépéskor. A rendszerben létező csoportok tárolása a /etc/group fájlban történik. Nézzünk meg ebből is egy sort, hogyan is épül fel: audio:x:1000:jonci,pedro
A különböző területeket itt is a „:” (kettőspont) jel választja el. Minden sor a csoportnévvel kezdődik, ezután következik a kódolt jelszó, de a /etc/gshadow fájl használata esetén csak egy „x” látható. Ha az „x” helyett „!” (felkiáltójel) található, akkor az adott csoport tiltva van. A harmadik oszlopban helyezkedik el a csoportazonosító. Legvégül pedig a csoportba tartozó felhasználók azonosítója, vesszővel elválasztva. Most pedig nézzünk egy példát a /etc/shadow fájlra: jonci:$1$hVxspIZG$Elm./tGLTqt77oyHuykyZ/:11955:0:99999:7:::
A már megszokott „:” (kettőspont) jel szolgál itt is a mezők szeparálására. A felhasználói névvel kezdődik a sor, majd jön a kódolt jelszó. Ezután a jelszóra és az azonosítóra vonatkozó adatok következnek:
1970 január 1-je óta eltelt napok száma az utolsó jelszóváltoztatásig Két jelszóváltoztatás közötti maximális idő napokban Két jelszóváltoztatás közötti minimális idő napokban A jelszó lejárása előtt hány nappal kell a felhasználót figyelmeztetni A jelszó lejárása után mennyi nap múlva váljon a hozzáférés letiltottá 1970 január 1-je óra eltelt napok száma addig, amikor le lett tiltva a hozzáférés ez a mező fenntartva
Csoportok számára is létrehoztak egy shadow fájlt, aminek a neve gshadow lett, ami szintén a /etc könyvtárban található meg. Ebben a fájlban is a „:” (kettőspont) jel szolgál a mezők szeparálására. A /etc/gshadow fájl szintaktikája a következő: csoportnév:jelszó:csoportadmin,csoportadmin,...:tag,tag,...
Jónás Zsolt
6.2.
GNU/Linux - kezelési ismeretek I.
37
Felhasználók kezelése, karbantartása
Felhasználó hozzáadása és eltávolítása karakteres szövegszerkesztő felhasználásával is megoldható, de léteznek rá programok, amelyek használata kényelmesebbé teszik e műveletet, mivel egyszerre több fájlt is módosítani kell. Felhasználó és csoport létrehozása – adduser, addgroup Segítségükkel új felhasználót és csoportot adhatunk a rendszerhez. Az új felhasználó hozzáadásával egyidejűleg egy vele azonos nevű csoport is létrejön, hacsak nem tiltjuk le paraméterrel. Ha nem adjuk meg paraméterben a felhasználó nevét, akkor bekéri a program (addgroup esetén a csoport nevét): Bash$ adduser Enter a username to add:
Ha beírtuk a felhasználói nevet, akkor létrehozza a felhasználót, a felhasználó home könyvtárát, valamint a vele azonos nevű csoportot is, majd kéri a felhasználóhoz tartozó jelszót, amit kétszer kell beírni az elírás kiszűrése végett: Enter new UNIX password: Retype new UNIX password:
Ha azonosan írtuk be kétszer is a jelszót, akkor a rendszer menti és a továbbiakban a felhasználóról kér információkat, amiket nem kötelező kitölteni: Enter the new value, or press return for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [y/n]
Az „y” gombbal nyugtázva a felhasználó hozzáadásának procedúrája véget ér. Különböző paraméterekkel befolyásolhatjuk a program működését. A „--system” paraméterrel csak a felhasználó jön létre és a home könyvtára. A hozzá tartozó jelszót is külön kell beállítani, amíg nincs beállítva, addig a felhasználó nem tud belépni. Felhasználó és csoport hozzáadásánál a jelszókérést letilthatjuk a „--disabled-login” kapcsolóval. Felhasználó nélkül is hozhatunk létre csoportot a „--group” paraméterrel, de ezt érhetjük el az addgroup paranccsal is. Szintén az adduser programmal adhatunk hozzá egy létező felhasználót egy már létező csoporthoz: Bash$ adduser jonci audio Adding user jonci to group audio... Done. Bash$
A hangkártyát csak az audio csoport tagjai (és a root) használhatják, így érdemes hozzáadnunk a saját felhasználónkat az audio csoporthoz, ha zenét szeretnénk hallgatni.
38
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Felhasználó hozzáadása és módosítása más programmal – useradd, usermod Az említett két program a megadható paramétereiben megegyezik, ezért is szerepelnek egy cím alatt, csak annyiban térnek el egymástól, hogy a felparaméterezett useradd program hozzáadja a felhasználót a rendszerhez, ugyanekkor a usermod a már meglévő felhasználó hozzáférését módosítja a megadott tulajdonságúra. Egy táblázatban összefoglaljuk a lehetséges paramétereket, amelyekkel befolyásolható a létrehozási folyamat. A usermod parancs esetén a létrehozási és beállítási funkciók megváltoztatási műveletként értendők: -c megjegy. -d home -e lejárat -g csoport -G csoport,[…] -p jelszó -s shell -u uid
Információkat adhatunk meg a felhasználóról (lásd: /etc/passwd). Az alap /home/ könyvtárat változtathatjuk meg (megjegyzés: ettől még a home könyvtár nem jön létre). A felhasználói hozzáférés lejárását adhatjuk meg ÉÉÉÉ-HH-NN formátumban. A felhasználó alap csoportját adhatjuk meg. A csoportnak léteznie kell. Ha nem adjuk meg, a felhasználó csoportja a users (100) lesz. Megadható, hogy a felhasználó saját csoportján kívül, melyik másik csoportba tartozzon. Vesszővel elválasztva többet is megadhatunk. Meg tudjuk adni a felhasználó jelszavát is, de csak kódolt formában. A rendszer által felkínált alap shell programot tudjuk megváltoztatni. Alapesetben az 1000 feletti első szabad azonosító számot választja a rendszer a felhasználó számára, azonban ezt felülbírálhatjuk ezzel a paraméterrel. 0 és 99 közötti azonosító számot nem adhatunk meg.
Az alábbi 2 kapcsoló csak a useradd programnál használható: -m
Ha megadjuk ezt a kapcsolót, akkor a felhasználó létrehozásakor a home könyvtára is létrejön, majd a létrehozás után a rendszer bemásolja a /etc/skel1 könyvtár tartalmát a felhasználó home könyvtárába. -k skel könyvtár Csak az „-m” kapcsolóval használható. Alapesetben a /etc/skel könyvtárból másolja át a rendszer az alap fájlokat a felhasználó könyvtárába, de megadható másik könyvtár ezzel a paraméterrel. Az alábbi 3 kapcsoló csak a usermod programnál használható: -l új név -L
-U
Megváltoztatható a felhasználói név, azonban figyeljünk rá, hogy ez nem változtatja meg a home könyvtárat. Ez a kapcsoló nem használható együtt a „-p” és a „-U” paraméterekkel. Megadása esetén az elkódolt jelszó elé egy „!” (felkiáltójel) kerül, aminek hatására az adott felhasználó belépése a rendszerbe tiltva van. Ez a kapcsoló nem használható együtt a „-p” és a „-L” paraméterekkel. Megadása esetén az elkódolt jelszó elé tett „!” (felkiáltójel) elvételre kerül, aminek hatására az adott felhasználó belépése a rendszerbe újra engedélyezett.
Lássunk példákat az elmélet után: 1
Lásd értelmét a „Beállító fájlok könyvtára” fejezetben.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
39
Hozzáadunk a rendszerhez úgy egy jonci felhasználót, hogy közben megváltoztatjuk az alap home könyvtárának az elérési útvonalát, amit létre is hozatunk, és belemásoltatjuk az alap fájlokat, valamint kitöltjük a felhasználói információkat: Bash$ useradd –c ”Jónás Zsolt”,”VIP” –d /home/vip/jonci –m jonci Bash$
Úgy hozzuk létre a jonci felhasználót, hogy adjuk meg az alap csoportját, adjuk hozzá az audio és a cdrom csoporthoz, valamint az alap fájlokat ne a /etc/skel könyvtárból másolja a rendszer, hanem a /etc/alapfajlok könyvtárból. Persze gondoskodni kell, hogy a /etc/alapfajlok könyvtár létezzen és legyen is benne alap fájl, különben nincs értelme: Bash$ useradd –g staff –G audio,cdrom –m –k /etc/alapfajlok jonci Bash$
Változtassuk meg a jonci felhasználó által használt shell programot: Bash$ usermod –s /bin/csh jonci Bash$
Tiltsuk ki a jonci felhasználót a rendszerből: Bash$ usermod –L jonci Bash$
Végül engedélyezzük a jonci felhasználót, tegyük lehetővé számára, hogy újra beléphessen: Bash$ usermod –U jonci Bash$
Csoport hozzáadása és módosítása más programmal – groupadd, groupmod A groupadd program segítségével hozhatunk létre csoportokat, paraméterként megadva a létrehozandó csoport nevét. Ha nem adjuk meg paraméterként, akkor a program egy leírást ad a lehetséges paramétereiről. A „-g” paraméter által megadhatjuk a létrehozandó csoport azonosító számát. Ha nem adjuk meg, akkor a 99 fölötti első szabad egész számot választja: Bash$ groupadd -g 256 vezetoseg Bash$
E parancs kiadása során a rendszerben létrejön egy vezetoseg csoport, aminek az azonosító száma 256 lett. A groupmod paranccsal meglévő csoportot tudunk módosítani. Ennek a parancsnak is van egy „-g” paramétere, amivel már meglévő csoport csoportazonosító számát tudjuk megváltoztatni. A „-n csoportnev” paraméterével pedig új nevet adhatunk a már meglévő csoportnak. Ennek tudatában változtassuk meg az előbb létrehozott vezetoseg csoport nevét dolgozok-ra és csoportazonosító számát 655-re. Bash$ groupadd -g 655 –n dolgozok vezetoseg Bash$
40
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Felhasználói jelszó megváltoztatása – passwd A passwd a felhasználók és a csoportok jelszavainak megváltoztatását végzi. A felhasználók csak a saját jelszavukat változtathatják meg, a rendszergazda bárkiét. A csoportok jelszavát az adott csoport adminisztrátora változtathatja meg. A passwd ezen kívül használható a felhasználói adatok, mint például az teljes név, a login shell, vagy a jelszavak "szavatossági idejének" megváltoztatására is. A jelszavak csak az ABC kis betűiből, nagy betűiből, számokból és írásjelekből állhatnak. Az aktuális felhasználó jelszavának megváltoztatásához a passwd parancsot paraméter nélkül kell meghívni. Ha paraméternek megadunk egy felhasználót, akkor annak a felhasználónak a jelszavát változtathatjuk meg. Persze ez utóbbit csak a rendszergazda teheti meg: Bash$ passwd Changing password for jonci (current) UNIX password: Enter new UNIX password: Retype new UNIX password: Bash$
A program előbb bekéri az aktuális jelszót a biztonság kedvéért, majd az új jelszót kétszer az elírás kiszűrésére. Természetesen nem jeleníti meg a begépelt betűket, és csillaggal sem helyettesíti azokat. Felhasználói szinten nem tudunk egyszerű logikával előállítható jelszót elfogadtatni, amire az alábbi üzenettel hívja fel a figyelmünket: Bad: new password is too simple
Ha az új jelszó nagyon hasonlít az előző jelszavunkra, akkor szintén elutasítást kapunk: Bad: new and old password are too similar
Sikeres jelszóváltoztatás az alábbi üzenettel nyugtázza: passwd: password updated successfully
Ezután már csak az új jelszót fogadja el a rendszer, az esetleges jelszó változtatási megkötések (min, max idő a két jelszócsere között) újra kezdődnek. Azonosító információk megváltoztatása – chfn A chfn segítségével megváltoztathatók a finger információk. Ezeket a /etc/passwd fájl tartalmazza, és a finger programmal jeleníthetőek meg. A linuxos finger négy adatot ír ki: teljes nevet, munkahelyi szoba- és telefonszámot, valamint az otthoni telefonszámot. Paraméter megadása nélkül mindegyik információt újra bekéri. Csak ENTER bevitele esetén a már letárolt információ változatlanul megmarad, a none szó bevitelével törlődik. Felhasználó alap héj programjának megváltoztatása – chsh A chsh által megváltoztathatjuk az alap héj programunkat. A program elindítása után bekéri az aktuális felhasználó jelszavát a biztonság kedvéért, hogy tényleg a felhasználó akarja megváltoztatni saját magának, majd a helyes jelszó begépelése után bekéri az új héj programot
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
41
az elérési útvonalával együtt. A „-s” paraméter segítségével megadhatjuk parancssorban is, amely hatására a jelszó elfogadása után nem kérdez már rá a héj programra. A rendszergazdának joga van bármelyik felhasználó alap héj programját megváltoztatni. Valamint a felhasználók csak olyan héj programot választhatnak maguknak, amelyek fel vannak sorolva a /etc/shells fájlban. Felhasználó és csoport törlése – deluser, delgroup Felhasználót és csoportot távolíthatunk el a segítségükkel. A deluser program „--group” paraméterrel meghívva a megadott csoportot távolítja el, ugyan úgy, mint a delgroup parancs. Ha egy felhasználót akarunk eltávolítani egy csoportból, akkor a következőképpen kell eljárnunk: Bash$ deluser jonci audio Removing user jonci from group audio... done. Bash$
Ha nem adunk meg paraméterben felhasználót, akkor bekéri az eltávolítandó felhasználó nevét (delgroup esetén a csoport nevét). Azonban így megmaradt a felhasználó home könyvtára és az összes általa birtokolt fájlja is. A home könyvtárát a „--remove-home” paraméterrel töröltethetjük a deluser paranccsal. A „--remove-all-files” paraméter hatására a program átnézi az összes tárhelyet a felhasználó fájljai után kutatva, hogy eltávolítsa azokat. Felhasználó eltávolítása más programmal – userdel Eltávolíthatjuk ezzel a programmal is a felhasználót a rendszerből. Törlésre kerül a felhasználó a hozzáadott csoportokból, a felhasználó csoportja (persze csak akkor, ha nem egy alap csoportot adtunk meg, mint például a staff) és maga a felhasználó is. A felhasználó home könyvtárának és levelesládájának eltávolítását is kérhetjük, ha megadjuk az „-r” paramétert: Bash$ userdel –r jonci Bash$
Csoport eltávolítása más programmal – groupdel E programnak csak egy paramétere van, az pedig a törlendő csoport neve. A törölni kívánt csoport nevét paraméterként átadva, a program törli a rendszerből a csoportot. A csoporthoz tartozó fájlok eltávolításáról a rendszergazdának kell gondoskodnia. Példaként töröljük le a dolgozok csoportot, amit a vezetoseg csoport átnevezésével hoztunk létre a groupmod paranccsal nemrég: Bash$ groupdel dolgozok Bash$
Felhasználók szinkronizálása – pwconv, pwunconv Abban az esetben, ha nem használjuk a már megismert felhasználókat kezelő programokat, hanem saját kezűleg akarjuk szerkeszteni a /etc/passwd és a /etc/shadow fájlokat, akkor sincs gond, főleg, hogy vannak programok, amelyek még ezt az utat is próbálják
42
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
kényelmesebbé tenni. Ugyanis elég csak a passwd fájlt szerkeszteni, majd szinkronizáltatni a shadow fájllal. A pwconv program feladata a shadow fájl (újra)készítése a passwd és a (valószínűleg) létező shadow fájl felhasználásával. A konvertálás során a shadow fájl azon sorai törlésre kerülnek, amelyek csak a shadow fájlban szerepelnek, és a passwd fájlban nem. Amely sorok csak a passwd fájlban szerepelnek, hozzáadódnak a shadow fájlhoz. Azon soroknál, amelyek szerepelnek mindkét fájlban, azonban valamiért a jelszó továbbra is a passwd fájlban tárolódik, frissítésre kerülnek. A jelszó átkerül a passwd fájlból a shadow fájlban, valamint a passwd fájlban a jelszó helyére egy „x” betű kerül, jelezvén, hogy a jelszót a továbbiakban a shadow fájl tartalmazza. A pwunconv program feladata a jelszavak áthelyezése a shadow fájlból a passwd fájlba. Amelyik felhasználóhoz tartozik bejegyzés, jelszó a shadow fájlban, frissítésre kerül. A passwd fájlban a jelszó mező helyén levő „x” helyére kerül a shadow fájlban tárolt jelszó. A szinkronizálás után a shadow fájl törlődik. Csoportok szinkronizálása – grpconv, grpunconv A grpconv program működése megegyezik a pwconv működésével, annyi a különbség csupán, hogy a passwd helyett a group, a shadow helyett a gshadow fájllal dolgozik. A grpunconv program használata során is hasonló egyezést fedezhetünk fel. A passwd itt is a group, a shadow pedig a gshadow fájlnak felel meg. Jelszófájlok ellenőrzése – pwck Leellenőriztethetjük vele a /etc/passwd és a /etc/shadow fájl éppségét. A program ellenőrzni, hogy megfelelő számú mező van-e a sorokban, minden felhasználó egyedi azonosítószámmal rendelkezik-e, léteznek-e a home könyvtárak, valamint érvényes shell program van-e megadva minden felhasználónak. Példaként lássunk egy esetet, létezik egy proba felhasználó, azonban nem hoztuk létre a home könyvtárát: Bash$ pwck user proba: directory /home/proba does not exist pwck: no changes Bash$
A program magától nem hozza létre a home könyvtárat csak figyelmeztet, hogy nem létezik. Azonban, ha a /etc/passwd és a /etc/shadow fájl között eltérés van, akkor futás közben rákérdez, hogy korrigálja-e az eltérést. Példaként a proba felhasználó bejegyzés törlésre került a /etc/passwd fájlból, csak a /etc/shadow fájlban maradt meg: Bash$ pwck delete line `proba:x:12374:0:99999:7:::'? y pwck: the files have been updated Bash$
A „-r” kapcsoló megadásával bekapcsolható a „csak-olvas” üzemmód, azaz bármilyen eltérést is talál a két fájl között, nem tesz lépéseket a kijavítására.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
43
Csoportfájlok ellenőrzése – grpck E program a /etc/group és a /etc/gshadow fájlt veti össze. A program ellenőrizni, hogy megfelelő számú mező van-e a sorokban, minden csoport egyedi azonosító számmal rendelkezik-e, valamint létező felhasználók vannak-e megadva csoport-adminisztrátornak. A „-r” kapcsoló megadásával itt is a „csak-olvas” üzemmódot kapcsolhatjuk be. Bejelentkezésekre vonatkozó beállítások – /etc/login.defs Sok beállítási lehetőséget találunk benne, ha megnyitjuk egy szövegszerkesztővel. Többek között itt állíthatjuk be a következőket: ➢ felhasználók postaládáit tartalmazó könyvtárat: MAIL_DIR ➢
/var/mail
logolásra kerüljenek-e a sikertelen bejelentkezések: FAILLOG_ENAB
➢
yes
logolásra kerüljenek-e a sikeres bejelentkezések: LOG_OK_LOGINS
➢
alap útvonalak ENV_SUPATH ENV_PATH
➢
99999 0 7
felhasználó létrehozásakor a hozzárendelt azonosító szám minimum és maximum értéke (mindig a lehető legkisebbet választja ki a rendszer automatikusan, de felülbírálható): UID_MIN UID_MAX
➢
PATH=/sbin:/bin:/usr/sbin:/usr/bin:... PATH=/usr/local/bin:/usr/bin:/bin:...
megadható, hogy mennyi ideig használható maximum és minimum egy jelszó, valamint beállítható, hogy a jelszó lejárta előtt mennyi napig kapjunk figyelmeztetés: PASS_MAX_DAYS PASS_MIN_DAYS PASS_WARN_AGE
➢
no
1000 60000
csoport létrehozásakor a hozzárendelt azonosító szám minimum és maximum értéke (mindig a lehető legkisebbet választja ki a rendszer automatikusan, de felülbírálható): GID_MIN GID_MAX
100 60000
44
6.3.
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Felhasználói információk lekérdezése
Az aktuális felhasználói azonosító lekérdezése – whoami A whoami program a pillanatnyilag hatályban levő felhasználói azonosító (user ID) alapján kinyomtatja a felhasználói nevet. Egyenértékű az ’id -un’ paranccsal: Bash$ whoami jonci Bash$
Bejelentkezett felhasználók egyszerű listázása – users A parancs által lekérdezhetjük a bejelentkezett felhasználókat. A megjelenített felhasználói neveket egy sima szóközzel választja el. Minden bejelentkezett felhasználó neve annyiszor jelenik meg, ahányszor bejelentkezett a rendszerbe: Bash$ users jonci jonci Bash$
Ha nem adunk meg paramétert, akkor az adatokat a /var/run/utmp fájlból veszi, de a parancs után írva megadható más forrásfájl is. Csoportbeli hovatartozás lekérdezése – groups Lekérdezhetjük, hogy mely csoportokba is tartozunk, azaz mely csoportoknak vagyunk tagjai: Bash$ groups jonci disk dialout cdrom floppy audio video burning Bash$
Ha nem a saját felhasználónkról szeretnék megtudni az információt, akkor paraméterben felsorolhatjuk azokat a felhasználókat – szóközzel elválasztva –, amelyekre kíváncsiak vagyunk: Bash$ groups jonci pedro jonci : jonci disk dialout cdrom floppy audio video burning pedro : pedro cdrom floppy audio Bash$
Valóságos és effektív UID-eket és GID-eket lekérdezése – id Paraméter nélküli futtatás esetén kiírja a felhasználóhoz tartozó UID és GID értéket, majd felsorolja, hogy mely csoportokba tartozik bele: Bash$ id uid=1000(jonci) gid=1000(jonci) groups=1000(jonci),5(tty),6(disk), ... Bash$
A „-u” paraméterrel a felhasználó UID, a „-g” paraméterrel a GID száma kérdezhető le:
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
45
Bash$ id -u 1000 Bash$
Számok helyett lehetőség van a név megjelenítésére is a „-n” paraméterrel, azonban együtt kell használni vele a „-u”, a „-g” vagy a „-G” paramétert, így a csoport nevét a következőképpen kérdezhetjük le: Bash$ id -ng jonci Bash$
A „-G” megadásával azon csoportokat kérdezhetjük le, amelyekben beletartozunk (ugyan azt érjük el, mint a group parancs paraméter nélküli futtatásával) Bash$ id -nG jonci disk dialout cdrom floppy audio video burning Bash$
Bejelentkezett felhasználók lekérdezése – who Kiírja, hogy ki van bejelentkezve a rendszerbe. Amennyiben az opciókon kívül nincs argumentuma, a who program kinyomtatja minden, pillanatnyilag bejelentkezett felhasználóról a következő információkat: bejelentkezési név (login name) terminál vonal (terminal line) a bejelentkezés ideje (login time) távoli gépnév vagy X kijelző (remote hostname or X display)
Ha egyetlen argumentumot (amely nem opció) adunk meg a parancssorban, akkor a who program az így megadott fájlt használja a „/var/run/utmp” helyett a bejelentkezett felhasználók azonosítására. Szokás a „/var/log/wtmp” fájlt használni, hogy az előző bejelentkezéseket vizsgálhassuk. Ha két argumentum adott (amelyek nem opciók), a who csak az őt futtató felhasználó bejegyzését írja ki a gépnevet követően. (Azt, hogy ki futtatja, a standard inputból dönti el.). A hagyomány szerint ez a két argumentum: „am i”, tehát a hívás: ’who am i’, de használható helyette az „-m” paraméter is. Bash$ who am i jonci tty1 Bash$
Aug 25 01:10
A „-u” paraméterrel kiírathatjuk a felhasználók aktivitását is. A bejelentkezési idő után kiírja ’óra:perc’ formátumban, hogy a felhasználó mennyi ideje inaktív. A ’.’ (pont) azt jelenti, hogy a felhasználó aktív volt az utolsó percben, az ’old’ pedig azt, hogy a felhasználó 24 óránál régebben volt utoljára aktív. Az utolsó oszlopban a bejelentkezési folyamat azonosító száma kerül kijelzésre. Bash$ who -u jonci tty1 jonci tty2 Bash$
Aug 25 01:10 Aug 23 11:46
. old
1643 1210
46
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Kijeleztethető a felhasználók üzenetfogadási állapota is. A bejelentkezési név után egy jelet is kiír a program a „-w”, „-T”, „--mesg”, „--message”, vagy „--writable” paraméter megadásakor: Bash$ jonci jonci Bash$
+ ?
+ tty1 - tty2
Aug 25 01:10 Aug 23 11:46
a write üzenetek engedélyezettek a write üzenetek nem engedélyezettek nem talált terminál eszközt
Belépett felhasználók és tevékenységük lekérdezése – w A w információkat jelenít meg arról, hogy éppen hány felhasználó van a gépen, és hogy mit csinálnak. A fejléc megmutatja – ebben a sorrendben – az időt, mióta működik a rendszer, jelenleg hány felhasználó van belépve és a rendszer átlagos terhelését az elmúlt 1, 5 és 15 percben. Az alábbiak minden felhasználónak megjelennek: azonosító, a tty neve, a távoli host, ahonnan bejelentkezett, a belépés ideje, a "henyélési" idő (azaz mióta nem adott inputot a gépnek), JCPU, PCPU és az éppen futó programjaik parancssora. A JCPU idő a tty-re kapcsolódástól számítva az összes process idejét jelenti. Ebbe nem számítanak bele a korábbi, háttérben futtatott programok, de a jelenlegiek igen. A PCPU idő a jelenlegi, ’what’ mezőben is látható processz elindításától számított időt jelöli. Bash$ w 01:29:17 up 1 day, 13:44, USER TTY FROM jonci tty1 Bash$
4 users,
load average: 1.16, 1.06, 1.01 LOGIN@ IDLE JCPU PCPU WHAT 01:10 16:12 0.06s 0.06s -bash
A „-h” paraméterrel elhagyathatjuk a fejlécet. Az „-s” paraméterrel elhagyathatjuk a ’LOGIN’, a ’JCPU’ és a ’PCPU’ oszlopokat. Ha paraméternek felhasználónevet adunk át, akkor csak az adott felhasználóról közöl információkat. Felhasználói információk megjelenítése – finger A finger a rendszer felhasználóiról mutat információkat. Ha nem adunk meg egyetlen paramétert sem, akkor a finger minden belépett felhasználó adatait megjeleníti. Alapesetben a program megmutatja (de utasítható rá az „-s” paraméterrel is) a felhasználó belépési nevét, valódi nevét, terminálját és hogy az írható-e (a terminál neve mögött „*” jelenik meg, ha nem írható), mióta nem dolgozik, mikor lépett be, valamint irodájának helyét és telefonszámát. A belépés idejét hónap, nap, óra, perc formában adja meg, kivéve, ha hat hónapnál régebben lépett be; ez esetben az óra és a perc helyett az évet jelzi ki. Az ismeretlen eszközök és a nem létező belépési, valamint nyugalmi időt csillaggal jelzi.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
47
Az „-l” paraméter hatására többsoros megjelenítést használ. Az alapesethez képest kijelzi a használt héj programot, a levelek állapotát, az üzenetfogadási állapotot és a „.forward” , „.plan” valamint „.project” fájlok tartalmát. Az utóbbi két fájl tartalmának a megjelenítését letilthatjuk a „-p” paramétert is megadva.
48
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Jónás Zsolt
7.
GNU/Linux - kezelési ismeretek I.
49
fejezet
Fájlbejegyzések és jogok
Miután megismerkedtünk a rendszerünkben elhelyezkedő fontosabb könyvtárakkal, ideje nagyító alá venni a fájlokra vonatkozó szabályokat. Tágabb értelembe véve, minden fájl, könyvtár, hivatkozás, eszköz és csővezeték fájlként értelmezhető, kezelhető a rendszerben. Bár e megállapítás a kezdő felhasználónak zavaró lehet, mégis hasznos lehetőség. Mindenek előtt vegyük át, milyen megkötések vannak a fájlnévre vonatkozólag. Majd megismerkedünk a tulajdonosi csoportokkal, végül átnézzük a már említett állománytípusokkat.
7.1.
Fájlnévre vonatkozó megkötések
Az első és legfontosabb ismérv, hogy a Linux a POSIX szabványnak megfelel, ami azt írja elő, hogy minimálisan 14 karakter hosszúnak kell lennie a maximális fájlnév hossznak. Maximális névhossz nincs megszabva, de a Linux maximálisan 255 karakter hosszú fájlnevekkel tud dolgozni és megkülönbözteti a kis- és nagybetűket egymástól1. Rejtett fájlt vagy könyvtárat úgy hozhatunk létre, hogy egy „.” (pont) karakterrel kezdjük a nevét. Ezáltal a következő példában szereplő három fájl egyszerre lehet jelen egy könyvtárban, a második eközben rejtett fájl is: proba .proba Proba
1
Ennek fényében beláthatjuk, hogy a ’/tmp/proba’ fájl és a ’/tmp/Proba’ fájl nem azonos.
50
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
A fájlnévben szereplő karakterekre vonatkozó korlátozás nincs, minden karakter szerepelhet1, bár ajánlás annál több van. Az egyik, hogy lehetőleg kerüljük a szóközök használatát. Igaz, grafikus felületen nem okozhat gondot, de karakteres felületen saját magunknak okozunk plusz munkát. Ugyanis, ha egy parancsnak át akarunk adni egy szóközöket tartalmazó fájlnevet, akkor vagy idézőjelek közé kell tenni, vagy egy ’\’ jellel meg kell védeni mindegyik szóközt egyesével2. Szintén erősen ajánlják, hogy lehetőleg kerüljék a felhasználók a ’-’-lel (kötőjel) kezdődő fájlnevek használatát. Végül, lehetőleg a fájlneveket az angol ábécé betűi, számok és egyéb írásjelek felhasználásával alkossuk, hogy adathordozás esetén ne keletkezzen előre nem látható hiba a különböző nyelvi területeket támogató operációs rendszerek között. Bár ezen ajánlás otthoni felhasználók számára egyre kisebb jelentőséggel bír.
7.2.
Jogosultságok
Minden könyvtárhoz és fájlhoz háromféle jog tartozhat: r – értéke: 4 – olvasási jog w – értéke: 2 – írási jog x - értéke: 1 – futtatási jog (könyvtáron: belépési jog)
Minden könyvtárhoz és fájlhoz háromféle tulajdonosi csoport is tartozik, illetve a harmadik nem tulajdonos, épp ellenkezőleg, de ez részletkérdés, tehát, rendre a csoportok: u – tulajdonos g – csoporttulajdonos o – többiek, mindenki más, azaz aki nem tartozik az első két csoportba
Mindegyik csoporthoz hozzá van rendelve a három jog mindegyikének az állapota. Tehát, ha: ➢ a tulajdonos olvashatja, írhatja és futtathatja a ’proba’ nevű fájlt, akkor a tulajdonoshoz tartozó jogok a következők: rwx (4+2+1=7) ➢
a csoporttulajdonos olvashatja és futtathatja a ’proba’ nevű fájlt, akkor a csoporttulajdonoshoz tartozó jogok a következők: r-x (4+0+1=5)
➢
a többi felhasználók csak futtathatják a ’proba’ nevű fájlt, akkor a jogaik: --x (0+0+1=1)
➢
így a ’proba’ nevű fájlhoz tartozó jogok a következők: rwx r-x --x (751)
1 2
Akár ’*’ és ’?’ jel is szerepelhet(!) a névben, de lehetőleg kerüljük a használatukat. Igaz, a héj segíti a felhasználót sok mindenben, de erről bővebben a „10. BASH használata” fejezetben.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
51
Van még egy különleges jogosultsági csoport, amelyet nem kötelező megadni: s,S – értéke: 4 – SUID: tulajdonos azonosító s,S – értéke: 2 – SGID: csoporttulajdonos azonosító t,T - értéke: 1 – Sticky: nincs magyar fordítása
Ha be akarjuk állítani a SUID, a SGID és Sticky jogokat is a ’proba’ fájlra, akkor az előbbi példánál maradva a jogok a következőképpen alakulnak: rws r-x --t (5751)
Látható, hogy a SUID, SGID és Sticky jogok jelei a meglévő 3 jogi csoport x jogot jelölő pozíciójában jelennek meg. Ha az x jog be van kapcsolva, akkor s és t jelenik meg a megadott helyeken, ahol az x nincs bekapcsolva, ott a jogot jelző s és t nagybetűsként jelenik meg, azaz S és T, így ha a ’proba’ fájl jogai: rwx r-- r-- (744)
akkor ha bekapcsoljuk a SUID, SGID és Sticky jogot is, akkor a következőképpen fog kinézni a fájl jogosultsága: rws r-S r-T (7744)
Jogok a fájlokon
r(read) = olvasási lehetőség, olvasni lehessen a fájl tartalmát w(write) = írási/törlési lehetőség, hozzáírni és törölni lehessen a fájlból (új fájl létrehozását, vagy meglévő fájl törlését a „.” könyvtáron kell állítani) x(execute) = futtatási jog, le lehessen futtatni a fájlt, azonban ha a fájl a
tartalma miatt mégsem futtatható (például képfájl), a rendszer nem fogja lefuttatni s(suid) = bárki is futtassa le a fájlt (feltételezve, hogy ’x’ jog meg van adva), a tulajdonos jogaival fog futni s(sgid) = bárki is futtassa le a fájlt (feltételezve, hogy ’x’ jog meg van adva), a csoporttulajdonos jogaival fog futni t(sticky) = a program lefutása után is a memóriában marad (manapság már nincs jelentősége; a sticky szó jelentése ilyen környezetben: beragad)
Jogok a könyvtárakon
r(read) = keresési lehetőség, a benne levő fájlok listájának lekérdezése w(write) = létrehozási/törlési lehetőség, létrehozni és törölni lehessen fájlokat
és alkönyvtárakat a könyvtáron belül x(execute) = belépési jog, ha ’x’ meg van adva, de ’r’ nincs, akkor beléphetünk ugyan a könyvtárban, de nem látunk benne semmit s(suid) = GNU/Linux-on nincs értelmezve s(sgid) = a benne létrehozott állomány csoporttulajdonosa a könyvtár csoporttulajdonosa lesz t(sticky) = a benne létrehozott fájlokat és könyvtárakat csak a tulajdonos törölheti, valamint a root
52
GNU/Linux - kezelési ismeretek I.
7.3.
Jónás Zsolt
Állománytípusok
Tulajdonosi és jogosultsági szabályok átvétele után, van még egy fontos fájlbejegyzés, amivel meg kell ismerkednünk. Tágabb értelemben véve, csak fájlok helyezkednek el a rendszerben, mint már volt róla szó, de ezeket több csoportba sorolhatjuk, amelyek a következők: b c s p l d -
: : : : : : :
Blokkeszköz-fájl Karaktereszköz-fájl Domain Socket Elnevezett csővezeték (szimbolikus) Hivatkozás Könyvtár Szabványos fájl
Blokkeszköz-fájl Blokk-típusú speciális fájl, amely olyan eszközre mutat, ami blokkokban értelmezi az adatokat (például: floppy, merevlemez, egyéb tároló eszközök, stb.). Ezen speciális fájl segítségével, egyszerű fájlkezelő programokkal is kezelni tudjuk ezeket a hardver eszközöket. Karaktereszköz-fájl Karakter-típusú speciális fájl, amely olyan eszközre mutat, ami karakteresen értelmezi az adatokat (például: nyomtató, modem, konzol, PS/2 port, stb.) Itt is igaz az előbbi megállapítás, hogy egyszerű fájlkezelő programmal dolgozni tudunk egy eszközzel1. Domain Socket Sajnos nem terjedt el magyar megfelelője, de a működése alapján nevezhetnénk magyarul „ Terület kapcsoló”-nak. Processzek egymás közötti kommunikációjára használják. Ha egy processz egy másik gép processzéhez kapcsolódik, akkor egy hálózati portot is használnak, ha ugyanazon a számítógépen futó programmal kommunikál, akkor „Local Domain Socket”-nek, azaz „Helyi területi kapcsoló”-nak nevezzük. Csak a kapcsolódó processzek olvashatják és esetleg írhatják, hiába láthatja az összes. Elnevezett csővezeték Olyan átmeneti tároló „fájl”, ami FIFO2 elven működik. Amely adat először megy be rajta, az is jön ki először a másik oldalán. A sorrend nem keveredhet meg a rajta „átfolyó” adathalmazban. Segítségével az egyik program kimenetét átirányíthatjuk egy másik program bemenetére. Ezáltal gyorsulhat a feladat végrehajtása, ugyanis nem kell az előbbi program egész kimenetét megvárni, fájlba írni, majd a feladat befejeztével a másik programot elindítani a fájlba mentett adatokkal, hanem ahogy küldi az első program az adatokat a csővezetékbe, úgy dolgozza fel a másik oldalt a másik program az adatokat, így egyszerre futnak. (szimbolikus) Hivatkozás Hivatkozás készítésekor nem jön létre újra a fájl, csak egy mutatót helyezünk el az adott helyen, ami a célfájlra mutat, így egy fájlt több helyen is elérhetünk, miközben csak egyszer foglalja el a helyet. Kétféle linket különböztetünk meg. Egyik link a kemény (hard), a másik a szimbolikus (symbolic).
1
Például, ha egy 44,1KHz, 16bit, stereo WAV fájlt küldünk a hangkártya eszközmeghajtójára, akkor megszólal a hang eredeti minőségében, ugyanis az ilyen hangnál nincs szükség egyéb átalakításokra. 2 FIFO = First In First Out = Először Be Először Ki
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
53
Szimbolikus link esetén a hivatkozás törlésekor az eredeti fájl megmarad érintetlenül. Az eredeti fájl törlésekor a hivatkozás(ok) szintén megmaradnak, de egy nem létező fájlra fognak mutatni. Hard link használata esetén nem tudjuk megkülönböztetni az eredeti fájlt a rá mutató fájltól, teljesen egyenértékű vele, ezért a továbbiakban az eredeti fájlt is „hard link”-ként fogjuk említeni. Alapesetben, amikor létezik egy sima fájl, akkor is egy kemény kötés hivatkozik a háttértárolón elhelyezkedő adatra. Amikor egy újabb kemény kötést rendelünk hozzá, a fájlra vonatkozó kemény kötések száma eggyel megnövekszik. Amikor törlünk egy kemény kötést, akkor ez a szám csökken eggyel. Mivel nem tudjuk megkülönböztetni az eredeti kemény kötést az újabban létrehozottól, így olyan, mintha mindegyik könyvtárban létezne a fájl, amelyikben létrehoztuk a kemény kötést. Ezáltal csak akkor törlődik ténylegesen a fájl tartalma, ha az összes kemény kötést töröltük, azaz a számláló elérte a nullát. Könyvtár A számítógépen elhelyezett adatok rendezettebb tárolása érdekében hozták létre, tartalmazhatja az összes állománytípust. Szabványos fájl Minden más fájl, ami nem tartozik a többi csoportba, az szabványos fájl, ezért is jele a ’–’.
7.4.
Parancsok
Az elméleti rész után nézzük át, milyen parancsokkal állíthatjuk a tulajdonosi viszonyokat és a hozzáférési jogokat, majd megismerkedünk a fájlbejegyzéseket létrehozó parancsokkal1. Tulajdonos és csoporttulajdonos megváltoztatása – chown Megváltoztatható vele a fájl tulajdonosa és csoporttulajdonosa. Felhasználóként csak a csoporttulajdonos megváltoztatására használható. Tulajdonos megváltoztatásához rendszergazdai jogosultságokra van szükség a rendszerbiztonság miatt. A tulajdonost és a csoporttulajdonost „:” (kettőspont) jellel kell elválasztani egymástól, de megengedett a „.” (pont) karakter használata is az elválasztáshoz. Ha a csoporttulajdonost nem akarjuk megváltoztatni, akkor nem kötelező megadni, és ebben az esetben az elválasztójel használata sem kötelező: Bash$ chown jonci /tmp/proba Bash$
A következő példában a csoporttulajdonost is megváltoztatjuk, de átadjuk a „-f” kapcsolót is, amellyel arra utasítjuk a programot, hogy ne adjon hibaüzenetet, ha esetleg nem sikerült volna a művelet: Bash$ chown –f jonci:jonci /tmp/proba Bash$
1
A könyvtárakkal és fájlokkal kapcsolatos parancsokat az „9. Könyvtár- és fájlkezelő parancsok” fejezetben részletesen átvesszük.
54
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Most változtassuk meg csak a csoporttulajdonost úgy, hogy a könyvtáron belül az összes alkönyvtárra és a fájlra hatással legyen a parancs. Ezt a „-r” (rekurzív) kapcsolóval tehetjük meg: Bash$ chown –r :jonci /tmp/proba_konyvtar Bash$
Csoporttulajdonos megváltoztatása – chgrp Ezzel a paranccsal csak a csoporttulajdonost tudjuk megváltoztatni. A chown parancsnál megismert kapcsolók itt is használhatók. Változtassuk meg rekurzívan egy könyvtár csoporttulajdonosát, úgy, hogy ne íródjon ki hibaüzenet, ha nem sikerült megváltoztatni valamelyik fájlnál vagy könyvtárnál: Bash$ chgrp –rf jonci /tmp/proba_konyvtar Bash$
Fájlokra vonatkozó jogok megváltoztatása – chmod Az előbb megismert két parancs kapcsolói érvényesek itt is. Rekurzív működést idézhetünk elő a „-r” kapcsolóval. Az „-f” megadásával pedig a hibaüzenetek elhallgatását kérhetjük. A „7.2 Jogosultságok” alfejezetben kiveséztük a jogokat, most pedig megtanuljuk, hogyan kell beállítani. Emlékezzünk, hogy a jogokat hármas csoportba tudjuk osztani. Az első csoportba tartoznak a tulajdonosra vonatkozó jogok (read, write, execute). A második csoportba tartoznak a csoporttulajdonosra vonatkozó jogok, a harmadik csoportban megadott jogok pedig az összes többi felhasználóra értendő. Megtanultuk kiszámolni is a jogokat. Így könnyen belátható, hogy ha azt akarjuk beállítani, hogy a tulajdonos olvashassa, írhassa és futtathassa (rwx = 4+2+1 = 7), a csoporttulajdonos csak olvashassa és futtathassa (r-x = 4+1 = 5), a többi felhasználó pedig csak olvashassa (r = 4) a fájlt, akkor azt a következő paranccsal érhetjük el: Bash$ chmod 754 /tmp/proba Bash$
Foglalkoztunk a SUID, a SGID és Sticky bitekkel is. Gyakorlásképpen állítsuk be a SGID és a Sticky bitet az előző példánál maradva: Bash$ chmod 3754 /tmp/proba Bash$
Azonban, aki nem a számolgatás híve, a számok megadása helyett a jogokat megadhatja betűjelekkel is. Tudni kell, hogy a tulajdonosra az „u”, a csoportra a „g”, a többi felhasználóra az „o”, mind a három csoportra pedig az „a” betűvel hivatkozhatunk. Jogot hozzáadni a „+”, elvenni a „-” jellel lehet. Ha „=” jelet használunk, akkor a meglevő jogok törlődnek és csak a megadott jogok lesznek érvényesek a továbbiakban. Ennyi bevezető után lássunk pár példát. Állítsuk be a jogokat úgy, hogy a tulajdonos a fájlt tudja írni, a csoport futtatni, a többi felhasználónak pedig ne legyen joga a fájlra: Bash$ chmod u=w,g=x,o= /tmp/chmod_probafile Bash$
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
55
Ezután, adjuk hozzá az olvasási jogot mind a három csoporthoz: Bash$ chmod a+r /tmp/chmod_probafile Bash$
Most vegyük el a futtatási jogot a csoporttól, miközben a tulajdonoshoz hozzáadjuk: Bash$ chmod u+x,g-x /tmp/chmod_probafile Bash$
A tulajdonosra vonatkozó jogok megadását egyszerűsíthetjük annyival, hogy nem adjuk meg, kire vonatkozik a hozzáadott, elvett vagy egyenlővé tett jog, ekkor ugyanis alapértelmezettként a tulajdonosra fog vonatkozni. Adjunk a tulajdonosnak írási jogot: Bash$ chmod +w /tmp/chmod_probafile Bash$
Állítsuk be, hogy a tulajdonos csak olvasni és futtatni tudja a fájlt: Bash$ chmod =rx /tmp/chmod_probafile Bash$
Végül lássunk még egy könnyítést. Mind a három csoport összes jogának elvételére használhatjuk a következő megadást: Bash$ chmod = /tmp/chmod_probafile Bash$
A következő példában felhasználjuk azt a lehetőséget, hogy lemásolhatjuk egyik csoport jogait egy másik csoportéra. Állítsuk be, hogy a csoport ugyanolyan jogokkal rendelkezzen, mint a tulajdonos: Bash$ chmod g=u /tmp/chmod_probafile Bash$
Az előbbi példánál maradva, megtehettünk volna azt is, hogy a többi felhasználó jogait állítjuk be olyannak, mint amilyennel rendelkezik a tulajdonos, azonban figyelni kell rá, hogy az írási jog (write, w) nem másolódik át! Kifejtve bővebben: Bash$ chmod u=rwx,g=,o= /tmp/chmod_probafile Bash$ ls –lak /tmp/chmod_probafile -rwx-----1 jonci jonci 0 nov 27 16:30 /tmp/chmod_probafile Bash$ chmod g=u /tmp/chmod_probafile Bash$ ls –lak /tmp/chmod_probafile -rwxrwx--1 jonci jonci 0 nov 27 16:30 /tmp/chmod_probafile Bash$ chmod o=u /tmp/chmod_probafile Bash$ ls –lak /tmp/chmod_probafile -rwxrwxr-x 1 jonci jonci 0 nov 27 16:30 /tmp/chmod_probafile Bash$
Foglalkozzunk a SUID, a SGID és Sticky bitekkel is, adjuk hozzá mind a három jogot: Bash$ chmod u+s,g+s,o+t /tmp/chmod_probafile Bash$
Utolsóként pedig említsünk meg egy érdekességet, amit számokkal nem tudunk megtenni, illetve csak több lépéses módszerrel. Ez pedig nem más, mint a „X” (nagy x) jog. Ugyan úgy a futtatási jogot jelenti, azonban ha a „+” vagy „=” jellel akarunk futtatási (execute, x) jogot
56
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
ráadni egy fájlra azzal a feltétellel, hogy csak akkor kerüljön rá a jog, ha már valamelyik csoport birtokolja a futtatási jogot. Induljunk ki a következő állapotból: Bash$ chmod u=rw,g=,o= /tmp/chmod_probafile Bash$ ls –lak /tmp/chmod_probafile -rw------1 jonci jonci 0 nov 27 16:30 /tmp/chmod_probafile Bash$
Ezután próbáljunk futtatási jogot adni a tulajdonosnak a „X” (nagy x) jog megadásával, majd adjunk futtatási jogot a csoportnak „x” (kis x) jog megadásával, majd próbáljuk meg újra a tulajdonosnak adni „X” (nagy x) jogot: Bash$ chmod u+X /tmp/chmod_probafile Bash$ ls –lak /tmp/chmod_probafile -rw------1 jonci jonci 0 nov 27 16:30 /tmp/chmod_probafile Bash$ chmod g+x /tmp/chmod_probafile Bash$ ls –lak /tmp/chmod_probafile -rw---x--1 jonci jonci 0 nov 27 16:30 /tmp/chmod_probafile Bash$ chmod u+X /tmp/chmod_probafile Bash$ ls –lak /tmp/chmod_probafile -rwx--x--1 jonci jonci 0 nov 27 16:30 /tmp/chmod_probafile Bash$
Blokkeszköz, karaktereszköz és elnevezett csövek létrehozása – mknod Blokkeszköz, karaktereszköz vagy elnevezett csővezeték hozható létre a használatával. Csővezeték esetén csak a cső nevét kell megadni, meg azt hogy csővezetéket akarunk létrehozni: Bash$ mknod proba p Bash$ ls –l proba prw------1 root Bash$
root
0 nov 23 17:43 proba
Ha blokkeszközt akarunk létrehozni, akkor a „p” paraméter helyett „b” betűt kell írnunk, valamint meg kell adni a fő- és alcsoport azonosítót is. Lássunk egy példát: Bash$ mknod proba b 123 45 Bash$ ls –l proba brw------1 root root Bash$
123,
45 nov 23 17:44 proba
Van lehetőség, hogy megadhassuk az mknod parancsnak, milyen jogosultságokkal hozza létre a speciális fájlt. Használhatjuk a „-m jogok”, vagy a „--mod=jogok” megadást, mindegyiket elfogadja. A jogokat megadhatjuk számokkal és betűkkel is, mint ahogy olvasható a chmod parancsnál. A jogok megadása használható csővezeték és blokkeszköz létrehozásánál is, de most inkább nézzünk példát karaktereszköz létrehozására: Bash$ mknod –m 744 proba c 987 65 Bash$ ls –l proba crw-r--r-1 root root 987, Bash$
65 nov 23 17:45 proba
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
57
Elnevezett csövek létrehozása – mkfifo Ezzel a programmal csak elnevezett csővezeték hozható létre. A fájlnéven kívül csak egyetlen egy paramétere van, ez pedig nem más, mint az előbb megismert „-m jogok” és a hosszabb változata, ami a „--mod=jogok”. Hozzunk létre ezzel a programmal is egy csővezetéket: Bash$ mkfifo –-mod=u=rw,g=r,o= proba Bash$ ls –l proba prw-r----1 root root Bash$
0 nov 23 17:46 proba
Fájlok közötti kötések (linkek) létrehozása – ln Alapesetben a program kemény kötést hoz létre. Szimbolikus link létrehozására a „-s” vagy a „--symbolic” paraméterrel utasíthatjuk. A „-v” paraméter megadásával kiírathatjuk a létrejövő kötéseket. A „-f” magadásával kérhetjük, hogy törölje, ha már létezik egy azonos nevű kötés, az új kötés létrehozása előtt, azaz hibaüzenet helyett, a már létező link „felülíródik”. A „-i” kapcsoló megadásával törlés előtt rákérdez, hogy tényleg felülírja-e. Ha egy fájlt adunk meg paraméterként, akkor az aktuális könyvtárban jön létre egy azonos nevű kötés. A paraméterként megadott fájlnak az elérési útvonalát is adjuk meg, különben egy önmagára mutató kötés jön létre, amit nem tudunk mire használni. Lássunk egy jó példát: Bash$ ln –sv ../proba2 create symbolic link `proba2' to `../proba2' Bash$ ls –lak proba2 lrwxrwxrwx 1 jonci jonci 6 nov 30 15:46 proba2 -> ../proba2 Bash$
Ha két fájlt adunk meg, akkor az elsőhöz hoz létre kötést a második által megadott néven: Bash$ ln –sfiv proba1 proba2 ln: replace `proba2'? y create symbolic link `proba2' to `proba1' Bash$ ls –lak proba2 lrwxrwxrwx 1 jonci jonci 6 nov 30 15:46 proba2 -> proba1 Bash$
Amennyiben az utolsó argumentum egy létező könyvtár, az ln program minden más megadott fájlhoz létrehoz egy (ugyan olyan nevű) kötést a megadott könyvtárban: Bash$ ln –s /tmp/a /tmp/b /tmp/knyvt/abcd Bash$ ls –lak /tmp/knyvt/abcd/ lrwxrwxrwx 1 jonci jonci 6 nov 30 15:46 /tmp/knyvt/abcd/a -> /tmp/a lrwxrwxrwx 1 jonci jonci 6 nov 30 15:46 /tmp/knyvt/abcd/b -> /tmp/b Bash$
Hozzunk létre kemény kötést. Figyeljük meg a jogok utáni első oszlopot, 2-es szám jelent meg a kötés létrehozása után, utalva, hogy már kettő kemény kötés mutat a fájlra: Bash$ ln /tmp/proba4 proba5 Bash$ ls –lak /tmp/proba4 proba5 -rw-r----2 jonci jonci -rw-r----2 jonci jonci Bash$
6 nov 30 15:46 /tmp/proba4 6 nov 30 15:46 proba5
58
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Jónás Zsolt
8.
GNU/Linux - kezelési ismeretek I.
59
fejezet
Segítségkérő parancsok
A UNIX és GNU/Linux rendszerek rendkívül jól dokumentáltak, a legkisebb programhoz is készítenek leírást, ráadásul ezekhez a leírásokhoz készítettek egy egységes keretrendszert. Az évek folyamán kialakítottak egy másik keretrendszert is, hogy leváltsa az előzőt, de ez nem következett be még igazán. A Debian tartalmazza mindkét rendszert, így röviden bemutatjuk mindkettőt. Majd ezek után bemutatunk pár olyan programot, ami szintén a felhasználót segíti az operációs rendszer használatában.
8.1.
Manual oldalak1
Íratlan szabvánnyá vált szinte, hogy a programtól lekérdezhető az elérhető paraméterek listája a „--help” paraméterrel, de persze vannak kivételek, és néha a „-help” vagy a „-h” paramétert kell használni. Ezzel egy kis összefoglalóhoz juthatunk, hogy mit is tud az adott program, de a GNU/Linux rendszereken van egy kiforrott segítségnyújtási rendszer is. Az angol manual szóból származik a program neve is, ami nem más, mint a man. A használat szintaktikája: man [manual csoport] <programnév>
Ekkor a man program megnyitja a programhoz tartozó manual oldalt, ha létezik. A programhoz tartozó manual oldal fájlnévnek a "<szám> <programnév>" megadási módot kell követnie. A <programnév> megegyezik annak a programnak a nevével, amiről segítséget szeretnénk kérni, a <szám> értéke pedig a program felhasználási területétől függ, bár ez utóbbi számot elhagyhatjuk, ha csak egy csoportba tartozó man oldala van a programnak. 1
Felhasználói kézikönyvek programokhoz
60
GNU/Linux - kezelési ismeretek I.
1 2 3 4 5 6 7 8 9
Jónás Zsolt
Futtatható program vagy héjparancs Rendszerhívás (kernel számára fenntartva) Megosztott-könyvtárak (library) függvényei Speciális fájlok, eszközkezelők Fájlformátumok Játékok Makro csomagok és konvenciók Rendszer adminisztrációs programok (általában csak a root használhatja) Kernel rutinok [nem előírás]
Ezen tudás birtokában, ha találkozunk egy program manual fájljával, akkor a benne szereplő számból tudni fogjuk az adott program felhasználási területét.
Manual oldalak megtekintése – man Egy fájl man oldalának megtekintéséhez nincs más dolgunk, mint meghívni a man programot, és paraméterként megadni a program vagy a fájl nevét: Bash$ man cp
Vannak esetek, amikor nem tudjuk elkerülni a csoport számának megadását. Ugyanis, ha beírjuk a következőt, akkor a passwd parancsról kapunk információt (csoport száma: 1): Bash$ man passwd
Azonban, ha magáról a /etc könyvtárban levő passwd fájlról (csoport száma: 5) szeretnénk információt kapni, akkor mindenképp meg kell adni a csoport számát, hogy ne az első találatot adja: Bash$ man 5 passwd
De az az eset is előállhat, hogy nem is tudunk róla, hogy több azonos nevű man fájl is van más-más csoportban. A „-a” kapcsoló megadásával utasíthatjuk a man programot, hogy a paraméterként adott karaktersorozatra illeszkedő összes találatot jelenítse meg: Bash$ man -a passwd
A manual oldalt akkor is meg tudunk nézni a man paranccsal, ha az nem is a rendszer része, csak el kell indítani a man parancsot, és paraméternek megadni a man fájlt. Van egy másik módja is annak, hogy olyan man oldalakat is megnézhessünk, amelyek útvonala nem található meg a man oldalak PATH környezeti változójában. A „-M <útvonal>” paraméterrel megadható a man fájlok keresési útvonala: Bash$ man -M /usr/share/man cp
Jónás Zsolt
8.2.
GNU/Linux - kezelési ismeretek I.
61
Info oldalak
A manual oldalakon kívül elterjedt egy másik dokumentálási formátum is, ez pedig az info formátum. Az info program használható az info fájlok megtekintéséhez. Szintaktikája szinte megegyezik a man parancséval: info <programnév>
Mindkét program tudja olvasni a másik program fájljait, bár az info jobban boldogul a man fájlokkal, mint a man az info oldalakkal.
8.3.
Segítséget adó programok
Olykor elég csak egy egysoros információ a programról, hogy eszünkbe jusson, mire is való, vagy ismerjük a parancs nevét, de szeretnénk tudni, merre is található a rendszerben, ilyenkor hasznos lehet a következő programok használata. Segítségkérés beépített parancsokról – help A BASH is rendelkezik beépített parancsokkal. E beépített parancsokról a help paranccsal kérhetünk le információt. A history is egy ilyen beépített parancs, így róla szintén a help paranccsal tudhatunk meg okos információkat: Bash$ help history ... Bash$
Manual oldal egysoros leírásának megjelenítése – whatis A programokhoz tartozó man oldalak tartalmaznak mindig egy egysoros leírást az adott programról. Ezeket keresi meg ez a program és jelzi ki a képernyőre: Bash$ whatis cp cp (1) Bash$
- copy files and directories
Azonban, ha nem tudjuk a parancs teljes nevét, akkor a „-w” paraméter után megadva a mintát, kijeleztethetjük azoknak a parancsoknak az egysoros leírásait, amelyekre ráilleszkedik a megadott minta: Bash$ whatis -w who* who (1) - show who is logged on whoami (1) - print effective userid whois (1) - client for the whois directory service Bash$
A „-r” paraméter segítségével nem csak egyszerű mintát adhatunk meg, hanem használhatjuk a szabályos kifejezéseket1 is. 1
Részletes leírás róluk a „Szabályos kifejezések” fejezetben.
62
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Keresés manual oldalak címeiben és leírásaiban – apropos Míg az előbb tárgyalt program a programnevek között keres, addig az apropos a programnevek mellett az egysoros leírásokban is. A „-r” kapcsolóval szabályos kifejezéseket1 is használhatunk. Bash$ apropos recording irrecord (1) - application for recording IR-codes for usage with LIRC growisofs (1) - combined mkisofs frontend/DVD recording program. Bash$
Parancsok teljes elérési útjának lekérdezése – which A keresésben részt vevő könyvtárakat a PATH környezeti változóból olvassa ki. A paraméternek megadott parancsot megkeresi a héj által végrehajtható programok könyvtáraiban, az eredményt a képernyőre írja ki: Bash$ which who /usr/bin/who Bash$
Parancshoz tartozó bináris, forrás, man fájlok helyének lekérdezése – whereis A program kijelzi a paraméternek megadott parancs útvonalát, a hozzá tartozó forrásfájl(oka)t és a program man fájljainak megtalálási helyeit: Bash$ whereis who who: /usr/bin/who /usr/share/man/man1/who.1.gz Bash$
Ha csak a futtatható program útvonalára vagyunk kíváncsiak, akkor használjuk a „-b” paramétert: Bash$ whereis -b who who: /usr/bin/who Bash$
Több paramétere is létezik a programnak, amelyek részletezése nem szükséges alap szinten, de az érdeklődő megismerkedhet velük a program man oldalán.
1
Szabályos kifejezések használatához lásd a „Szabályos kifejezések” fejezetet.
Jónás Zsolt
9.
GNU/Linux - kezelési ismeretek I.
63
fejezet
Könyvtár- és fájlkezelő parancsok
Azokkal a parancsokkal fogunk foglalkozni e fejezeten belül, amelyek segítségével könyvtárakkal vagy fájlokkal dolgozhatunk. A legtöbb programnál nem ismertetjük az összes paramétert, elég csak a legfontosabbakat ismerni az alapok elsajátításakor. Kezdő felhasználót talán el is riaszthatja a paraméterek sorolása oldalakon keresztül. A legfontosabbakat átvesszük, a többi paraméter megtekinthető a program man oldalán.
9.1.
Könyvtárkezelő parancsok
Aktuális (munka)könyvtár kiíratása – pwd A pwd parancs kiírja az aktuális könyvtár teljes nevét elérési úttal. A kiírt név minden eleme valódi könyvtárnév lesz – nem lesznek benne szimbolikus linkek. Bash$ pwd /home/jonci Bash$
Könyvtárnév kiíratása útvonalból – dirname A dirname a fájlnév minden részét visszaadja, kivéve az utolsó „/” (per) karaktert, és az azutáni részt. Ha a fájlnév csak önmagában áll (elérési út nélkül), akkor dirname visszaad
64
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
egy ’.’ (pont) karaktert (ez az aktuális könyvtárt jelenti). Ha a paraméternek megadott útvonal végén nincs fájlnév, akkor a megadott útvonal szülőkönyvtárát írja ki a program. Bash$ dirname /home/jonci/proba.png /home/jonci Bash$ dirname proba.png . Bash$ dirname /home/jonci/ /home Bash$
Könyvtárváltás – cd A kívánt munkakönyvtárba a cd parancs segítségével léphetünk, megváltoztathatjuk a parancs segítségével, hogy melyik könyvtárban álljunk. Kétféle hivatkozási módszer van, egyik a relatív útvonal hivatkozás, amikor az aktuális könyvtártól való eltérést adjuk meg a cd programnak: Bash$ pwd /home/jonci Bash$ cd a Bash$ pwd /home/jonci/a Bash$
Egy szinttel feljebb a „..” könyvtárba való „belépéssel” mehetünk: Bash$ pwd /home/jonci/a Bash$ cd .. Bash$ pwd /home/jonci Bash$
Az előbbi két parancsmegadást kombinálhatjuk is: Bash$ pwd /home/jonci/a Bash$ cd ../b Bash$ pwd /home/jonci/b Bash$
FIGYELEM! Az MS-DOS-ban elfogadott ’cd..’ parancs itt hibát fog eredményezni, ugyanis ’cd..’ nevű parancs nem létezik. A ’..’ paraméter, így nem írható egybe a paranccsal. De hivatkozhattuk abszolút módszerrel is, ilyenkor a gyökérkönyvtártól kezdődő teljes útvonalat meg kell adni: Bash$ pwd /tmp Bash$ cd /home/jonci/a Bash$ pwd /home/jonci/a Bash$
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
65
A felhasználó saját home könyvtárára (/home/) lehet hivatkozni a „~” jellel. Másik felhasználó home könyvtárát a „~felhasznalonev” rövidítéssel érhetjük el: Bash$ cd ~/a Bash$ pwd /home/jonci/a Bash$ cd ~pedro/b Bash$ pwd /home/pedro/b Bash$
A másik könnyítés akkor hatásos, ha a felhasználó a saját home könyvtárába akar lépni, bárhol is legyen, csak ki kell adnia a cd parancsot: Bash$ pwd /tmp Bash$ cd Bash$ pwd /home/jonci Bash$
Ugyanezzel az egyszerűséggel másik felhasználó home könyvtárába is beléphetünk: Bash$ pwd /tmp Bash$ cd ~pedro Bash$ pwd /home/jonci Bash$
Könyvtárszerkezet megjelenítése – tree A könyvtárszerkezet megjeleníthető segítségével fastruktúra szerűen, fájlokkal együtt: Bash$ tree . |-- a | |-- b |-- c | `-- d | `-- proba2 `-- proba1 4 directories, 2 files Bash$
Megadható az „-L” paraméterrel, hogy milyen mélységig menjen bele a könyvtárakba, a „-d” kapcsolóval letilthatjuk a fájlok megjelenítését: Bash$ tree -L 1 -d . |-- a `-- c 2 directories, 0 files Bash$
66
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Könyvtárak tartalmának listázása – ls, dir, vdir Az ls, dir és vdir ugyan azt hajtja végre, csak a megjelenítés formázásában térnek el, így csak az ls parancsot írjuk mindenhol. Egy vagy több könyvtár tartalmát írathatjuk ki, miközben a megjelenítést különböző paraméterekkel befolyásolhatjuk. A paraméterek mellett azt is meg lehet adni, hogy mely könyvtár tartamát jelenítse meg, ha nem adunk meg könyvtárat vagy fájlt, akkor az aktuális könyvtár tartalmát listázza ki a program. Alapesetben az ls egy elég egyszerű megjelenítést használ: Bash$ ls a c proba Bash$
Kérhetjük a „-1” (egyes) kapcsolóval, hogy ne sorba rendezve, hanem oszlopba rendezve listázza a tartalmat: Bash$ ls –1 a c proba Bash$
Ha a rejtett fájlokat is meg akarjuk jeleníttetni, akkor a „-A” kapcsolót is meg kell adni: Bash$ ls –1A a c proba .proba2 Bash$
De ha a két könyvtár-mutatót is látni szeretnénk, akkor a „-a” paramétert kell átadni: Bash$ ls –1a . .. a c proba .proba2 Bash$
FIGYELEM! Mint látható, az ls parancs elfogadja, ha a paramétereket egybe írjuk, azonban nem mindegyik program „eszi” meg így a paramétereit. A programok man oldalán győződhetünk meg eme tulajdonságáról, vagy a „programnév --help” paranccsal (esetleg „programnév -h”) Egy másik hasznos paramétere az „-l” kapcsoló. Ezzel kérhetjük a ’long format’ szerű kiírást, ami a következőképpen néz ki: Bash$ ls –la /home/jonci drwxr-xr-x 3 jonci jonci drwxr-xr-x 3 jonci jonci -rw-r--r-1 jonci jonci -rw-r--r-1 jonci jonci Bash$
72 72 0 0
aug aug aug aug
3 3 3 3
11:06 10:36 10:55 12:21
a c proba .proba2
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
67
Vegyük sorra, mit is jelentenek a különböző oszlopok:
Első oszlop tovább szegmentálódik. A legelső karakter tartalmazza az állomány típusát (b, c, s, p, l, d, -)1, a maradék 9 karakter 3 darab 3-as karaktercsoportból tevődik össze, amik a jogokat ábrázolják. Az első csoport a tulajdonosra, a második csoport a csoporttulajdonosra, a harmadik csoport a többi felhasználóra vonatkozó jogokat ábrázolja. Második oszlop a kemény csatolások (hard link) száma, egy fájlhoz minimum 1-es szám tartozik, amikor eléri a 0-as számot, akkor törlődik a fájl. Könyvtárnál a szám minimum 2-es. Ennél mélyrehatóbb ismeret alapszinten nem szükséges. Harmadik oszlopban szerepel a fájl tulajdonosa. Negyedik oszlopban jelenik meg a fájl tulajdonoscsoportja. Ötödik oszlopban van kijelezve az állomány helyelfoglalása. Hatodik, hetedik, nyolcadik oszlopban szerepel a fájl létrehozási dátuma és időpontja Kilencedik oszlop tartalmazza az állomány nevét.
Azonban, ha a „-d” kapcsolót is átadjuk, akkor nem a könyvtár tartalmát kapjuk, hanem a könyvtárról kapunk információt: Bash$ ls -lda /home/jonci drwxr-xr-x 68 jonci jonci Bash$
4.0k aug
3 11:28 /home/jonci
Meg kell említenünk még a „-R” paramétert, amivel rekurzívan kérhetjük egy könyvtár tartalmát, azaz ha egy könyvtáron belül létezik egy másik könyvtár, akkor annak a tartalmát is megjeleníti a képernyőn. Bash$ ls -lR c c: total 512 drwxr-xr-x 2 linux c/d: total 0 -rw-r--r-Bash$
1 linux
linux
72 aug
linux
0 aug
3 10:51 d
3 10:51 proba2
Könyvtár létrehozása – mkdir Az mkdir létrehozza a megadott nevű könyvtárakat, de alapesetben csak egy mélységű könyvtárat tud létrehozni: Bash$ mkdir a/b mkdir: cannot create directory `a/b': No such file or directory Bash$ mkdir a Bash$ mkdir a/b Bash$
Azonban a „-p” kapcsolóval utasíthatjuk arra, hogy hozza létre a szükséges könyvtárakat a célkönyvtár létrehozásához: 1
lásd: „7. Fájlbejegyzések és jogok” fejezet
68
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Bash$ mkdir c/d mkdir: cannot create directory `c/d': No such file or directory Bash$ mkdir -p c/d Bash$ tree . |-- a | |-- b `-- c `-- d 4 directories, 0 files Bash$
Üres könyvtár törlése – rmdir Az rmdir eltávolít minden megadott üres könyvtárat. Ha bármelyik könyvtár argumentum nem egy létező üres könyvtárra utal, az hibának minősül. Bash$ tree . |-- a | |-- b `-- c `-- d 4 directories, 0 files Bash$ rmdir a rmdir: `a': Directory not empty Bash$ rmdir a/b Bash$ rmdir a Bash$
A törlési folyamatot egy lépésben is elvégezhetjük, ha megadjuk a „–p” paramétert: Bash$ rmdir -p a/b Bash$
Kérhető a program arra, hogy akkor se adjon hibaüzenetet, amikor nem sikerült a törlés: Bash$ tree . `-- c `-- d 2 directories, 0 files Bash$ rm c rmdir: `c': Directory not empty Bash$ rmdir --ignore-fail-on-non-empty c Bash$ tree . `-- c `-- d 2 directories, 0 files Bash$
Jónás Zsolt
9.2.
GNU/Linux - kezelési ismeretek I.
69
Fájlkezelő parancsok
Fájlnév kiírása útvonalból – basename A basename parancs eltávolít minden könyvtár komponenst a név elejéről. Ha a végződés1 meg van adva, és megegyezik a név végével, akkor azt szintén eltávolítja a névből. A basename a standard kimenetre nyomtatja az eredményként keletkező nevet. Bash$ basename /home/linux/proba.png .png proba Bash$ basename /home/linux/ linux Bash$
Fájl létrehozása, időbélyegének megváltoztatása – touch A touch megváltoztatja minden megadott fájl utolsó elérésének és/vagy utolsó módosításának idejét. Ha a fájl nem létezik, a touch létrehozza (üres fájlként, 0666 alap jogosultságokkal, amelyeket az umask programmal módosíthatunk), kivéve, ha a „-c” opciót is megadtuk: Bash$ ls proba ls: proba: No such file or directory Bash$ touch -c proba touch: setting times of `proba': No such file or directory Bash$ touch proba Bash$ ls -l proba -rw-r--r-1 linux linux 0 aug 3 16:00 proba Bash$
Fájlok és könyvtárak másolása – cp Amennyiben az utolsó argumentum érvényes könyvtárat nevez meg, a cp parancs minden más megadott fájlt azonos névvel a megadott könyvtárba másol: Bash$ cp proba* a
Ha mindkét paraméter könyvtár, akkor hibaüzenetet kapunk, hacsak nem adjuk meg a „-r” paramétert, amelynek hatására rekurzív másolás következik be: Bash$ cp a b cp: omitting directory `a' Bash$ cp -r a b Bash$
Ha csak két fájl adott, az elsőt a másodikra másolja, a „-v” kapcsolóval ki is írathatjuk, de ha létezik a célfájl, akkor megkérdezi a program, hogy felülírja-e ha megadjuk a „-i” kapcsolót is: 1
Nem véletlen, hogy kiterjesztés helyett végződés van írva, ugyanis UNIX és Linux rendszereken nincs definiálva a kiterjesztés fogalma. De a példánál maradva, ha ’.png’ helyett ’a.png’-t írtunk volna mintának, akkor a kimeneten a ’prob’ jelent volna meg a ’proba’ helyett, más szóval a fájl nevének a végéről nem csak a „kiterjesztés” vágható le, hanem bármilyen karakterlánc, amire illeszkedik a megadott minta.
70
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Bash$ cp -iv proba proba2 cp: overwrite `proba2'? y `proba' -> `proba2' Bash$
Hibát jelent, ha az utolsó argumentum nem könyvtár, és több mint két fájl van megadva: Bash$ cp proba* f cp: copying multiple files, but last argument ’f’ is not a directory Try `cp –help' for more information. Bash$
Fájlok és könyvtárak átnevezése vagy átmozgatása – mv Amennyiben az utolsó argumentum érvényes könyvtárat nevez meg, a mv parancs minden más megadott fájlt azonos névvel a megadott könyvtárba mozgat: Ha csak két fájl adott, akkor az elsőnek megadott fájlt átnevezi a másodiknak megadott névre, a „-v” paraméterrel kérhetjük, hogy írja is ki, hogy mit vitt véghez: Bash$ mv -v proba proba2 `proba' -> `proba2' Bash$
Hibát jelent, ha az utolsó argumentum nem könyvtár, és több mint két fájl van megadva: Bash$ mv proba1 proba2 proba3 mv: when moving multiple files, last argument must a directory Try `mv –help' for more information.
Hasonlóan, könyvtárat sem lehet megadni úgy forrásnak, hogy a cél egy fájl: Bash$ mv a proba1 mv: cannot overwrite non-directory `proba' with directory `a' Bash$
Csak szabályos fájlokat tud fájlrendszerek közt mozgatni. Amennyiben a célfájl nem írható és a „-f” vagy a „--force” opció nem adott, a mv megkérdezi a felhasználót, hogy felülírhatjae a fájlt. Ha a válasz nem ’y ’-nal vagy ’ Y’-nal kezdődik, a fájlt átugorja. Fájlok és könyvtárak törlése – rm Alapértelmezésként a könyvtárakat nem törli. Ha egy állomány nem írható és az „-f” vagy a „--force” kapcsolót nem aktiváltuk, akkor az rm megkérdezi a felhasználót, hogy eltávolíthatja-e az állományt. Ha a válasz nem ’y’ vagy ’Y’ betűvel kezdődik, a következő állományt veszi. A „-v” kapcsolóval kiírathatjuk a törölt fájl nevét: Bash$ ls -l proba[12] -r--r--r-1 linux linux 0 aug -r--r--r-1 linux linux 0 aug Bash$ rm –v proba1 rm: remove write-protected file `proba1'? y removing `proba1' Bash$ rm –f proba2
3 16:04 proba1 3 16:04 proba2
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
71
Kérhetjük a programot a „-i” kapcsoló megadásával, hogy fájltörlés előtt kérdezzen rá, hogy valóban törölni akarjuk-e a fájlt: Bash$ touch proba Bash$ rm -iv proba rm: remove `proba'? y removing `proba' Bash$
Az „-f” paraméter nem csak akkor hasznos, ha rákérdezés nélkül akarunk írásvédett fájlt törölni, hanem akkor is, ha azt akarjuk, hogy egy esetleges nem létező fájl törlésének kísérletekor se legyen hibaüzenet, főleg script programok írásakor, futtatásakor lehet segítségünkre. Azonban vigyázzunk a használatakor rendszergazdaként. A „-r” paraméterrel együtt használva root felhasználóként hatalmas károkat okozhatunk. Az alábbi két példa végzetes kimenetelű a rendszer számára, lehetőleg kerüljük a használatukat. A második parancs példa egy véletlen szóköz karakterre, aminek következtében nem a /tmp/* könyvtárat adtuk meg paraméternek, hanem felsorolásként a /tmp és a /* könyvtárakat: Bash$ rm –rf / Bash$ rm –rf /tmp /*
A második parancs helyesen így lett volna: Bash$ rm –rf /tmp/*
Leheletnyi a különbség, de halálos … Végezetül pedig lássunk egy különleges paramétert, ami sok más programnál is megtalálható, ez pedig a „--” (kettő kötőjel). E paraméter alkalmazásával mondhatjuk meg a programnak, hogy ami e mögött szerepel az már biztos nem paraméter. Tételezzük fel, hogy létezik egy „-proba” nevű fájl, amit le szeretnénk törölni: Bash$ rm -proba rm "-proba" rm: invalid option -- p Try `rm --help' for more information. Bash$
Hibaüzenetet kapunk, ugyanis a fájlnév első karaktere „-” (kötőjel), így paraméterként szeretné értelmezni az rm, ami nem sikerülhet neki. Az idézőjelek használata sem jelent megoldást a problémára: Bash$ rm '-proba'
vagy Bash$ rm „-proba”
esetén is ugyanazt a hibaüzenetet kapjuk, mint nélkülük. Ilyen problémák áthidalására használható a „--” paraméter: Bash$ rm -i -- –proba removing `-proba' Bash$
72
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Új fájl kezdeti jogainak meghatározása – umask Új fájl létrehozása mindig 0666 (a tulajdonos, a csoport és a többiek által is olvasható és írható) jogokkal történik. Ezeket az alap jogosultságokat módosíthatjuk a programmal. Akárhogy is állítsuk be őket, a futtatási, a SUID, a SGID és a Sticky jog sosem kerül rá egy újonnan létrehozott fájlra, így a program, ha paraméterben páratlan számot kap, kivon belőle egy egyest. A következőképpen képződik az alap jogosultság: a megadott umask értéket bitenként invertáljuk, majd az eredmény és az alap 0666 érték között AND műveletet végzünk. A kapott jogok kerülnek rá az újonnan létrehozott fájlra: Bash$ umask 0000 Bash$ touch proba1 Bash$ ls -lak proba1 -rw-rw-rw1 jonci Bash$ Bash$ umask 0044 Bash$ touch proba2 Bash$ ls -lak proba2 -rw--w--w1 jonci Bash$ Bash$ umask 0666 Bash$ touch proba3 Bash$ ls -lak proba3 ---------1 jonci Bash$
jonci
0 jan
7 00:38 proba1
jonci
0 jan
7 00:38 proba2
jonci
0 jan
7 00:38 proba3
A beállított umask értéket a program paraméter nélküli futtatásával kérhetjük le, a „-S” kapcsoló esetén betűkkel jelzi a jogokat: Bash$ umask 0037 Bash$ umask 0037 Bash$ umask -S u=rwx,g=r,o= Bash$
Fájl típusának meghatározása – file Három tesztet hajt végre a fájlon. Az első sikeres vizsgálat eredménye kerül a kimenetre. Az eredmény általában a következő lehet:
text executable data
: ASCII karaktereket tartalmazó fájl : a kernel számára értelmes, futtatható állomány
: bármi más, ami nem tartozik az első kettőbe
A „-z” paraméter megadásával a tömörített fájlokban elhelyezett fájlokat is vizsgálja. A „-k” paraméterrel pedig kérhetjük, hogy az első egyezéskor ne álljon meg a vizsgálat. Bash$ file /bin/cp /bin/cp: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped Bash$ file /etc/fstab /etc/fstab: UTF-8 Unicode text
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
73
Lemezfoglalást összegzése – du A parancs segítségével lekérdezhetjük az elfoglalt lemezterületet. Alapértelmezésként az aktuális könyvtárban levő könyvtárak lemezfoglaltságát jeleníti meg. Ha a fájlok lemezfoglaltságát is látni szeretnénk, akkor meg kell adni a „-a” paramétert, valamint ha a lemezfoglaltságot bájtokban szeretnénk látni, akkor adjuk meg a „-b” paramétert is: Bash$ du –ab /tmp/probakonyvtar 0 /tmp/probakonyvtar/proba1 0 /tmp/probakonyvtar/proba1 512 /tmp/probakonyvtar
A kijelzett értéket kérhetjük kilóbájtban is: Bash$ du –ak /tmp/probakonyvtar 0 /tmp/probakonyvtar/proba1 0 /tmp/probakonyvtar/proba1 1 /tmp/probakonyvtar
A „-h” paraméter segítségével bekapcsolhatjuk a „human readable”, azaz az „emberi olvashatóság” üzemmódot. Megadásával a kijelzésre került lemezfoglaltsági érték a lehető legnagyobb dimenzióval történik, amelynél az érték még nem kisebb, mint 1 (értékek lehetnek például: 1K, 2.54M, 7.1G): Bash$ du –h /tmp/probakonyvtar 512 /tmp/probakonyvtar/elso_alkonyvtar 512 /tmp/probakonyvtar/masodik_alkonyvtar 1.5k /tmp/probakonyvtar
Van még egy kellemes paramétere a programnak. A „-s” paraméter megadásával egy összegzést kérhetünk az elfoglalt helyről, így ha egy könyvtárról kérdezzük le az információt, akkor nem írja ki minden alkönyvtárára, fájljára, hanem csak a könyvtár össze lemezfoglaltságát jeleníti meg. Használjuk az előbb megismert „-h” kapcsolót is: Bash$ du –sh /bin 2.5M /bin
Szabad lemezterület kijelzése – df A rendszerbe felcsatolt partíciók, adattárolók foglaltságáról kérhetünk le adatokat. Ennek a programnak is van „-k” paramétere, aminek hatására a méreteket kilóbájtban kapjuk. Valamint itt is van „-h” paraméter az „emberi olvashatóság” üzemmód bekapcsolására: Bash$ df –h Filesystem /dev/sda7 /dev/sda1 /dev/sda6 /dev/sda8 Bash$
Size 5.6G 23M 141M 28G
Used Avail Use% Mounted on 4.6G 1.0G 82% / 5.7M 15M 27% /boot 75M 66M 53% /var/log 1.2G 27G 4% /opt
74
GNU/Linux - kezelési ismeretek I.
9.3.
Jónás Zsolt
Fájlkereső programok
Fájlok keresése egy megadott könyvtárstruktúrában – find Alapértelmezésként az aktuális könyvtárból kiindulva listázza ki a talált fájlokat és könyvtárakat rekurzívan, de megadható neki paraméternek a keresési útvonal: Bash$ find /tmp /tmp/ ... /tmp/probakonyvtar/ /tmp/probakonyvtar/elso_alkonyvtar/ /tmp/probakonyvtar/elso_alkonyvtar/probafile /tmp/probakonyvtar/masodik_alkonyvtar/ /tmp/probakonyvtar/masodik_alkonyvtar/probafile2 Bash$
A „-maxdepth szám” paraméterrel megadható, hogy milyen mélységig menjen bele a könyvtárstruktúrába: Bash$ find /tmp –maxdepth 1 ... /tmp/probakonyvtar/ Bash$
Létezik egy „-mindepth szám” paramétere is a programnak, amivel a könyvtárstruktúra mélységének minimális mélységét adhatjuk meg: Bash$ find /tmp –mindepth 1 ... /tmp/probakonyvtar/elso_alkonyvtar/ /tmp/probakonyvtar/masodik_alkonyvtar/ Bash$
Végére marad a „-type típus” paramétert. Ezzel a paraméterrel szűrhetjük a kiíratandó sorokat típus szerint, amik a következők lehetnek: b c s p l d f
Blokkeszköz-fájl Karaktereszköz-fájl Domain Socket Elnevezett csővezeték (szimbolikus) Hivatkozás Könyvtár Szabványos fájl
Lássunk példát típusmegadásra: Bash$ find /tmp –type f ... /tmp/probakonyvtar/elso_alkonyvtar/probafile /tmp/probakonyvtar/masodik_alkonyvtar/probafile Bash$
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
75
Fájlnév adatbázis frissítése – updatedb A fájlnév adatbázist frissíthetjük vele. A locate parancs ebben az adatbázisban keres. Az adatbázis frissítése nem automatikus, de automatizálhatjuk1. A frissítési időközt befolyásolhatja, hogy a fájlrendszeren milyen gyakran változnak az adatok. Sűrűn változó fájlrendszeren vagy sűrűn frissítjük az adatbázist, vagy inkább a find parancsot használjuk. Alapesetben nem frissíti a hálózatról csatolt meghajtókat, de felül bírálható a „—netpaths=’útvonal1 útvonal2 ...’” paraméterrel. Az adatbázis frissítését érdemes rendszergazdai jogokkal futtatni, hogy minden fájl belekerüljön az adatbázisba, mivel felhasználóként nem minden könyvtárba léphetünk be. Az adatbázis frissítés elvégezhető az alábbi parancs kiadásával. A parancs lefutásának időtartalma függ a háttértárolók kapacitásától, azok kihasználtságától és olvasási sebességüktől. Hosszú időt is igénybe vehet: Bash$ updatedb Bash$
Mintára illeszkedő fájlok és könyvtárak kijelzése a fájlnév adatbázisból – locate A locate parancs az előbb említett fájlnév adatbázisban tud keresni. A paraméternek megadott mintát próbálja ráilleszteni az adatbázisban tárolt fájlokra. Ha nem használunk metakaraktereket (helyettesítő karakterek) a mintában, akkor találatnak számít és megjeleníti a fájlt az elérési útvonalával együtt, ha a megadott minta illeszkedik bárhol a fájl nevében – az elérési útvonalát is beleértve. Tehát a prob minta illeszkedik a /tmp/proba_konyvtar/prob és a /tmp/proba_konyvtar/proba fájl is, mert a minta megtalálható a fájl nevében, de még a hozzá vezető útvonalban is: Bash$ locate prob /tmp/proba_konyvtar/prob /tmp/proba_konyvtar/proba Bash$
Metakarakterek használata esetén csak teljes illeszkedés esetén ad találati eredményt. A metakaraktereket csak „’” (aposztrófok) között adhatók meg, és a következők lehetnek: ? egy karaktert helyettesít * nulla vagy több karaktert helyettesít [] a két zárójel között felsorolt valamelyik karakter Ennek tudatában belátható, hogy – az előbbi példánál maradva – a `*prob` minta nem illeszkedik a /tmp/proba_konyvtar/proba fájlra, de /tmp/proba_konyvtar/prob fájlra továbbra is: Bash$ locate `*prob` /tmp/proba_konyvtar/prob Bash$
1
A lehetőségeket lásd az „Időzítési lehetőségek” fejezetben.
76
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
A minták illesztése kis- és nagybetű érzékeny függetlenül attól, hogy használunk-e metakaraktereket vagy sem. Azonban a „-i” kapcsolóval kérhetjük, hogy ne tegyen mégse különbséget közöttük: Bash$ locate –i `*PROB` /tmp/proba_konyvtar/prob /tmp/proba_konyvtar/PROB Bash$
Emlékezzünk, hogy az updatedb paranccsal egy pillanatfelvételt készítünk a rendszerben elérhető fájlokról, így elképzelhető, hogy amikor a locate paranccsal keresünk és találunk is egy fájlt az adatbázisban, már nem abban a könyvtárban található, vagy esetleg már le is töröltük. A „-e” kapcsoló megadásakor csak akkor jelzi ki a találatot, ha a megtalált fájl még most is létezik az eltárolt útvonalon: Bash$ updatedb Bash$ rm -r /tmp/proba_konyvtar/PROB Bash$ locate `*PROB` /tmp/proba_konyvtar/PROB Bash$ locate –e `*PROB` Bash$
Jónás Zsolt
10.
GNU/Linux - kezelési ismeretek I.
77
fejezet
BASH használata
Mint már említettük, a héj karakteres program, amely a rendszerbe történő bejelentkezés után automatikusan elindul és várja a parancsainkat. Az operációs rendszer ezen keresztül tartja a kapcsolatot a felhasználóval. Parancs bevitele után értelmezi, feldolgozza, ha kell, behelyettesít, majd végrehajtja a feladatot. E megközelítés végett szokás parancsértelmezőnek is nevezni. Elég sok héj látott napvilágot az évek során, ezek közül a népszerűbbek: sh:
Bourne shell, szinte mindegyik Unix és GNU/Linux változatban megtalálható, mindenki alap shell-nek tartja, szinte valamennyi shell scriptet e shell-re írnak. ksh: Korn shell, ami Bourne shell és a C shell egyfajta ötvözete. csh: C shell, amely a C programozási nyelvre sokban hasonlít. tcsh: A C nyelv kibővített változata. vsh: Visual shell, amely menüvezérelt felületével megpróbált alkalmazkodni a képernyős megjelenítőkhöz. bash: Bourne Again shell, amely a Bourne shell kibővített változata, sok kényelmi funkció bevezetésével. A mai napig az egyik legnépszerűbb a BASH (Bourne Again shell). A legtöbb terjesztésben, köztük a Debian GNU/Linux disztribúcióban is ez az alapértelmezett héj, így mi is ezzel fogunk most megismerkedni.
78
GNU/Linux - kezelési ismeretek I.
10.1.
Jónás Zsolt
A héj tulajdonságai
Említettük, hogy a héjprogramokat szokás parancsértelmezőként is emlegetni. Lehetőleg kerüljük e magyar szó használatát, mivel a héj nem csak egy „egyszerű” parancsértelmező, hanem önálló programozási nyelvvel kiegészített program. A héj kétféleképpen kaphat parancsot, vagy parancssorból, vagy állományból olvassa. Shell script fájlok1 írásával jelentősen növelhetjük hatékonyságunkat és automatizálhatjuk feladatainkat. Az I/O átirányítást2 és csővezetékek használatát egyszerű szintaktikával teszi lehetővé a felhasználónak, melyek használatával jelentősen növelhető a hatásfok és mindemellett a legtöbb héj jól is konfigurálható, ami által kényelmesebbé tehető a használatuk. /etc/profile BASH használata esetén, ebben a fájlban tarolódnak azok az információk, amelyek globálisan
határozzák meg a program működését, hatásuk kiterjed az összes BASH héjt használó felhasználóra. Beállíthatunk vele egy általános PATH útvonalat, egységes prompt-ot, stb. ~/.bash_profile Miután a BASH beolvasta a /etc/profile fájlt, átnézni az adott felhasználó home könyvtárát a személyes beállításokat tartalmazó fájlok után. Három fájlt keres a következő sorrendben: ~/.bash_profile, ~/.bash_login, ~/.profile. Az első megtalált fájlt értelmezi csak. Az elsőnek említett fájlt szokás használni egy-két környezeti változó értékének beállítása mellett arra is, hogy egyéb beállításokat tartalmazó fájlokat is beolvastassunk a BASH héjjal bejelentkezésünkkor. Erre mutat példát az alábbi idézet a fájlból: if [ -f ~/.bashrc ]; then source ~/.bashrc fi if [ -f ~/.bash_login ]; then source ~/.bash_login fi # hozzaadhatjuk az utvonalhoz a felhasznalo bin konyvtarat, ha letezik if [ -d ~/bin ]; then PATH=~/bin:”${PATH}” fi
~/.bashrc A rendszer működésen során sok alkalmazás használ környezeti változókat, hogy jobban tudjon igazodni az adott felhasználó kívánalmaihoz, de a héj program így is adhat át adatokat a belőle indított programoknak. Ilyen környezeti változó megadások találhatók meg benne elsősorban, de kezdeti alias-ok létrehozását is itt szokás elhelyezni.
1
A shell script (forgatókönyv) fájl, olyan forráskód, amely a shell nyelvén lett írva és lefordítás nélkül, közvetlenül futtatható, úgymond interpreter nyelven. 2 I/O az Input/Output rövidítése. A magyar szakirodalomban elterjedőben van a B/K (Bemenet/Kimenet) használata.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
79
~/.bash_login Bejelentkezéskor – a motd üzenet megjelenése és a levelek ellenőrzése után – lefuttatásra kerül a ~/.bash_login fájl tartalma, ha nincs ~/.bash_profile, vagy abban megadtuk a ~/.bash_login fájl használatát. Például beletehetjük a „df -h” parancsot, amelynek hatására bejelentkezésünkkor megjelennek a felcsatolt partíciók összes, szabad és elfoglalt lemezterületei. Lefuttathatjuk a quota programot is akár, hogy lássunk mennyi helyet foglalhatunk el még a korlátozott fájlrendszereken, de többfelhasználós rendszeren értelme lehet lefuttatni a finger parancsot is, hogy lássunk kik vannak még bejelentkezve rajtunk kívül. Számtalan más parancsot, parancssorozatot érdemes lehet lefuttatni, adott rendszertől és felhasználótól függ a használata. ~/.bash_logout Ebben a fájlban adhatjuk meg, hogy kijelentkezésünkkor milyen parancsok hajtódjanak végre (persze csak akkor van hatása, ha a ~/.bash_profile fájlban megadtuk ezt a fájlt). Egy átlagos ~/.bash_logout fájl tartalma: case ”`tty`” in /dev/tty[0-9]) clear esac
Aminek hatására kijelentkezéskor törlődik a képernyő, ha karakteres felületről jelentkeztünk be a rendszerbe. ~/.bash_history A bejelentkezés előtt kiadott parancsainkat a „~/.bash_history” fájl tartalmazza. Bejelentkezés után kiadott parancsainkat a history parancs segítségével kérdezhetjük le. A listán szereplő parancsok a kijelentkezésünkkor kerülnek bele a „~/.bash_history” fájlba. Kiadott parancsok listájának megjelenítése – history Alapértelmezésben a BASH eltárolja az utoljára kiadott 500 parancsunkat, de bármikor felülbírálható a HISTSIZE környezeti változóval. A listát lekérdezhetjük a history paranccsal. Ha utána írunk egy számot (n), akkor csak az utolsó n parancsot listázza ki: Bash$ history 2 499 cat /tmp/probafile 500 help history Bash$
Ha további parancsokat adunk ki, akkor a számláló tovább növekszik, az első parancsokat pedig eldobja a listából, mindig csak 500 darabot tart meg. Bash$ history 5 man cp .... 505 ls -lak Bash$
80
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Ha az n. parancsot törölni akarjuk a listából, akkor azt a „-d szám” paraméterrel tehetjük meg. A következő paranccsal töröljük a 514-es sorszámú parancsot: Bash$ history –d 514 Bash$
A teljes parancslistát pedig a „-c” paraméterrel töröltethetjük: Bash$ history –c Bash$
Kiadott parancsok előhívása és futtatása Az egyik hasznos alapszolgáltatása, hogy előhívhatók a már kiadott parancsaink. A parancsok között a fel és le nyilakkal mozoghatunk, az előhívott parancsot akár meg is változtathatjuk. Parancskeresést is használhatunk a CTRL+R lenyomásával: Bash$ man bash Bash$ (reverse-i-search)`as': man bash
Gépelés közben mindig azt a sort jeleníti meg a BASH, amelyikre a legjobban ráillik. A keresés időrendben a később kiadott parancstól a korábban kiadott parancs felé történik, így ha több parancsra is ugyan úgy ráillik a begépelt karaktersorozat, akkor a későbben kiadott parancsot jeleníti meg. Lehetőség van keresés nélkül is lefuttatni egy régebbi parancsot. A kiadott parancsok között itt is időben visszafelé történik a keresés és az első illeszkedés esetén áll meg, majd kiírja a megtalált parancsot, végül lefuttatja. Keresés indításához be kell írni egy „!” (felkiáltójel) után – szóköz nélkül – a parancsot, vagy annak első pár betűjét: Bash$ manual bash: manual: command not found Bash$ man bash Reformatting bash(1), please wait... Bash$ !ma man bash Reformatting bash(1), please wait... Bash$
Gépelést könnyítő szolgáltatás Nagyon hasznos – és talán a legtöbbet használt – a parancs, illetve fájl és könyvtárnév kiegészítés. Az aktuálisan gépelt parancsot, könyvtárnevet vagy fájlnevet automatikusan kiegészíti a BASH a TAB billentyű lenyomása után, ha egyértelműen befejezhető a név hátralevő része. Ha a beírt karaktersorozattal több fájl vagy könyvtár is kezdődik, akkor az első TAB lenyomása után nem egészül ki a név, így jelzi a BASH, hogy több betűt igényel a pontos kiegészítéshez, ilyenkor még egyszer le kell nyomni a TAB billentyű, hogy kijelezze a lehetséges neveket: Bash$ wh whatis whereis which Bash$ wh
while
whiptail
who
whoami
whois
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
81
Ha a felsorolt lista hosszú lenne, azaz nem férne el egy képernyőn, akkor a BASH a felsorolás előtt megkérdezi a felhasználót, hogy tényleg kívánja-e a listát. Az n billentyű lenyomásakor mellőzi a lista felsorolását és visszakapjuk a promptot. Az y billentyű hatására a BASH felsorolja az összes lehetséges fájlnév végződést. A használhatóság érdekében a listázáshoz segítségül hívja a more parancsot: Bash$ Display all 1910 possibilities? (y or n)
A more parancs megállítja a listázást, ha a kiírás a képernyő aljához ért. A space billentyű lenyomására egy újabb teljes oldalt listáz. Az enter billentyű hatására csak egy sort gördít. A q és a backspace gombokkal léphetünk ki a felsorolásból.
10.2.
Parancssori értelmezés
A héj értelmezi a kiadott parancsainkat, amelyeket egyszerű szabályok szerint dolgoz fel. Egy parancs felépítése egy utasításból és az esetlegesen utána írt argumentumokból áll: utasítás argumentum1 argumentum2 ... argumentumN
Az utasítást és az argumentumokat egymástól szóközzel választjuk el, így ha egy szóközt tartalmazó argumentumot egy argumentumként szeretnénk átadni, akkor vagy „megvédjük” a szóközöket1, vagy idézőjeleket használunk: utasítás argu\ men\ tum1 ”argu men tum2”
Az utasítás kiadás után, a héj végignézni a PATH környezeti változóban megadott útvonalakat, ha megtalálja valamelyik könyvtárban a programot, akkor lefuttatja, ha nem akkor egy rövid, de tömör üzenettel a tudtunkra hozza, hogy a parancs nem található: Bash$ probaparancs bash: probaparancs: command not found
Ha létezik a parancs, csak nincs egyik olyan könyvtárban sem, amelyik szerepel a PATH környezeti változóban, akkor a parancs elé meg kell adni az elérési utat, ami lehet relatív (az aktuális könyvtártól való útvonalbeli eltérés) vagy abszolút (a gyökérkönyvtárból kiindulva). Argumentumok nem feltétlenül az utasításnak szólnak közvetlenül, vannak olyanok, amelyekkel a héj parancsvégrehajtását befolyásolhatjuk, ilyenek például az állománynévhelyettesítő karakterek, I/O átirányítások, csővezetékek, stb. A következőkben ezeket tárgyaljuk. Egyszerű argumentumok Az argumentumok egy string tömbben kerülnek átadásra a programnak, így programon belül is könnyebb a feldolgozásuk. Ilyen egyszerű argumentum az összes kapcsoló és az olyan paraméter is, amely nem tartalmaz helyettesítő karaktereket.
1
A „megvédésről” és egyéb érdekességekről bővebben a „Szabályos kifejezések” fejezetben.
82
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Átirányítások A héjból indított programok három megnyitott állománnyal indulnak, amelyeket parancssorból könnyen felülbírálhatunk. A három megnyitott állomány a következő: Alap bemenet (standard input): jele: 0 Legtöbb esetben innen várják a programok az adatokat, azaz a billentyűzetről. Alap kimenet (standard output): jele: 1 Ide küldik a programok az adataikat, a felhasználónak szóló üzeneteiket, ami alapesetben a képernyő. Hiba kimenet (standard error): jele: 2 A futás során fellépő hibajelenségek leírásait, okait, bármi, ami nem várt normál lefutás során, azt itt jelzi a program. Hasonlóan az alap kimeneti állományhoz, az ide küldött információ is a képernyőn jelenik meg, azonban külön is választható tőle. Mind a három standard I/O hozzárendelést megváltoztathatjuk egy parancssori paraméterrel. A bemenetet a ’<’ jellel irányíthatjuk át: Bash$ cat < proba Ez a proba fájl tartalma. Bash$
A ’<’ jel hatására a cat program nem a billentyűzetről vár adatot, hanem a proba fájlt olvassa és tartalmát az alap kimenetre nyomtatja. A standart kimenet átirányítását a ’>’ jellel adhatjuk meg, amelynek hatására a program által közölt információk nem a képernyőn, hanem az átirányított helyre kerülnek: Bash$ ls > konyvtar_lista Bash$ cat konyvtar_lista proba proba2 Bash$
A parancs hatására az aktuális könyvtár listája nem a képernyőre kerül, hanem a konyvtar_lista fájlba íródik. Viszont a hibaüzenetek továbbra is a képernyőre kerülnek. A standard error üzeneteket a ’2>’ jelkombinációval irányíthatjuk át: Bash$ ls 2> hibak proba proba2 Bash$
Ekkor a könyvtárlista a képernyőre kerül, és csak az esetleges hibaüzenetek kerülnek a hibak fájlban. Azonban van mód az alap kimenet és hiba csatorna összevonására átirányításhoz: Bash$ ls 1> kimenet 2>$1 Bash$
Az átirányítási sorrend felcserélése hibához vezet. Rendszerfüggő a hiba megnyilvánulása, ezért az a biztos, ha a sorrendet nem cseréljük fel.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
83
Szükség lehet a fordított átirányításra is. Shell Script írásakor, ha egy hibaüzenetet akarunk kijelezni, azt a legkönnyebben így tehetjük meg: Bash$ echo ”Valami hiba van!” Valami hiba van! Bash$
Azonban sokkal kezelhetőbb lenne, ha a hibacsatornán jelenne meg, ami alapesetben szintén a képernyő, de a többi hibaüzenettel együtt, bármikor átirányítható: Bash$ echo ”Valami hiba van!” 1>$2 Valami hiba van! Bash$
A ’>’ jel használatakor a megadott célfájl felülíródik, így ha létezett is a fájl már előzőleg, akkor minden tartalma elvész. Ám van mód a fájl előző tartalmának a megőrzésére. A ’>>’ jel hatására az átirányítás hozzáfűzésként fog végbemenni, azaz a célfájl tartalmát nem cseréli fel a kimenettel, hanem azután írja. Egy fájl egyidejű megadása bemenetként és kimenetként szintaktikailag helyes, nem okoz hibát, csak bosszúságot: Bash$ cat < proba > proba Bash$
Azonban a végrehajtás során a proba fájlból kellene olvasni az adatokat és ugyanazon néven szereplő fájlba is kellene visszaírni. Azonban jó, ha tudjuk, hogy a parancs elindításakor a héj program automatikusan megnyitja a standard fájlokat, így a cat program indulásának a pillanatában a ’> proba’ megadás hatására a proba fájl újra létrejön üresen. A kimenet átirányítására a ’>> proba’ megadás sem a legcélravezetőbb, mivel így végtelen ciklusba kerülnénk, hisz bemenetként azt a fájlt olvassuk, ami a kimenet hatására egyre növekszik. Csővezeték Az egyik legegyszerűbb és mégis igen hatékony programozási segédeszköz a csővezeték. A segítségével szintén átirányítást végezhetünk, csak összetettebb módon. Az egyik program kimenetét a másik program bemenetére irányíthatjuk, a nélkül, hogy e két program tudomást szerezne róla. A csővezeték használatának előnye:
nincs szükség ideiglenes fájlokra, amiket a műveletvégzés után úgy is eltávolítanák használatával a programok párhuzamosan futnak, így egy FIFO tárnak nem kell nagynak lennie (egy FIFO csak 8 Kbyte) a csővezeték hatására az átmeneti adatok a memóriában tárolódnak a párhuzamos feldolgozás hatására a kimeneten az eredmények folyamatosan jelennek meg a bemenet feldolgozása közben
Nagyon hatásos eszköz tud lenni, ha egy adathalmazon egymás után láncolt parancsok sorozatát akarjuk elvégeztetni. A csővezeték olyan speciális I/O átirányítás, amely
84
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
használatával el tudjuk kerülni az ideiglenes fájlok használatát.1 Csővezeték használatát a „|” (pipe) jellel érhetjük el. A bal oldalán szereplő program a csővezetékbe csak írni tud, az utána álló program csak olvasni tud belőle. Az olvasás a beírás sorrendjében történik, a csőbe került adatok nem előzhetik meg egymást, nem keveredhet össze a sorrend. Lássunk egy példát: Bash$ sort proba | pr | lpr Bash$
A sort parancs abc sorrendbe rendezi a proba fájl sorait, miközben, az átadott sorokat a pr program oldalakra bontva adja tovább az lpr programnak, ami pedig kinyomtatja a csővezetéken érkező adatokat. Idézőjelek és a parancsbehelyettesítés Háromféle idézőjel használható paraméterek megadásánál. A különbség a közrezárt karakterek feldolgozásában rejlik. Használatukkal befolyásolható a héj program működése, parancsfeldolgozása. Az egyszeres idézőjelek (’...’) használata esetén a héj a benne levő karaktereket nem ellenőrzi, nem végez behelyettesítést, a köztük szereplő összes karakter változás nélkül átadódik a programnak: Bash$ export VALTOZO=”Ez egy változó!” Bash$ echo ’A változó tartalma: $VALTOZO’ A változó tartalma: $VALTOZO Bash$
A kettős idézőjelek (”...”) között megadott karaktersorozat egy paraméterként adódik át, mint az előbbi esetben, csak itt a héj program értelmezi a számára értelmes vezérlő karaktereket (*, ? , stb.)2, valamint behelyettesíti a (környezeti) változókat értékét szerint: Bash$ export VALTOZO=”Ez egy változó!” Bash$ echo ”A változó tartalma: $VALTOZO” A változó tartalma: Ez egy változó! Bash$
Ha valami oknál fogva a kettős idézőjeleket kell használnunk, miközben a héj számára értelmes karaktereket mégsem akarjuk értelmeztetni, akkor használhatjuk a fordított perjelet (’\’) a karakter megvédésére: Bash$ export VALTOZO=”Ez egy változó!” Bash$ echo ”A változó tartalma: \$VALTOZO $VALTOZO” A változó tartalma: $VALTOZO Ez egy változó! Bash$
A fordított egyszeres idézőjelekkel (`...`) parancsbehelyettesítésre utasíthatjuk a héjat. Az idézőjelek közé zárt karaktersorozatot a héj lefuttatja, és az eredményt behelyettesíti a helyére: Bash$ rm `grep –L Linux *.txt` > /dev/null 2>$1 Bash$
1
Mint említettük, a csőben egyszerre maximum 8Kbájtnyi adat lehet, ha betelik, akkor az írási folyamat szünetel, amíg nem lesz hely a csőben. 2 Bővebben a következő, „10.3 Állománynév helyettesítés” alfejezetben.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
85
Ezzel az első látásra bonyolultnak tűnő paranccsal letöröljük (rm) a könyvtárban szereplő összes olyan txt fájlt, amiben nem szerepel a Linux szó. A „> /dev/null” paraméterrel letilthatjuk a képernyőre írást. Parancsbehelyettesítés nélkül sok fájlnál hosszadalmas munka várna ránk. Másik példában bemutatjuk, hogyan tudjuk megváltoztatni a /home/jonci/ könyvtáron belül az összes fájl jogát 644-re (alkönyvtárakon belül is) a parancsbehelyettesítés felhasználásával, úgy hogy közben a könyvtárak jogát ne változtassuk meg: Bash$ chmod 755 `find /home/jonci/ -type f` Bash$
Kapcsos zárójelek használata Kapcsos zárójelekkel és vesszőkkel olyan kombinációs paraméter listát készíthetünk, amit kézzel jelentősen tovább tartana beírni. Igaz, e lehetőség ritkán használatos, de mint egy érdekességgel, mindképpen érdemes megismerkedni: Bash$ echo {tizen,huszon}{egy,ketto} tizenegy tizenketto huszonegy huszonketto Bash$
Sőt, a zárójelek egymásba is ágyazhatók, így jelentősen növelve a variációk számát: Bash$ echo {barát{o,nő}m,{ho,po}kusz} barátom barátnőm hokusz pokusz Bash$
De hogy egy gyakorlatiasabb példát is mutassunk, nézzük meg a következő példát: Bash$ mkdir -p {1,2}/{a,b,c} Bash$ tree . |-- 1 | |-- a | |-- b | `-- c `-- 2 |-- a |-- b `-- c 8 directories, 0 files Bash$
Végül nézzünk meg egy sűrűbben előfordulható esetet is. Legyen a cél több fájl átmásolása egyik könyvtárból egy másik könyvtárba olyan fájlnevekkel, hogy ne legyen felírható egyszerű helyettesítő karakterekkel a fájlnévlista. Másoljuk át a /bin könyvtárból a kill, a mount, a ping, a sh, és a touch parancsokat a /tmp könyvtárba: cp /bin/kill /bin/mount /bin/ping /bin/sh /bin/touch /tmp
Belátható, hogy még több fájl esetén még több gépeléssel jár a parancs begépelése. Célszerű ilyen esetekben használni e remek egyszerűsítési lehetőséget: cp /bin/{kill, mount,ping, sh,touche} /tmp
86
GNU/Linux - kezelési ismeretek I.
10.3.
Jónás Zsolt
Állománynév helyettesítés
Célszerű a használatuk, amikor egy műveletet több állományon szeretnénk elvégezni, amelyek megadására különböző, speciális karaktereket használhatunk fel. Az állománynév helyettesítést a héj végzi el, így biztosak lehetünk benne, hogy minden program esetén ugyan azzal a szintaktikával használhatjuk, hisz nem kell minden programban újra megírni. A helyettesítő karakterek és jelentéseik a következők: * ? [abc] [a-z] [3-7]
nulla vagy több bármilyen karakter pontosan egy tetszőleges karakter felsorolt karakterek bármelyike, így most vagy „a” vagy „b” vagy „c” intervallumban szereplő karakterek bármelyike, a határokkal együtt intervallumban szereplő számok bármelyike, a határokkal együtt
Az állománynév helyettesítés segítségével egész változatos állománynév szűkítések is végezhetünk. Lássunk pár példát: *t „t” betűre végződő fájlnevek *t* „t” betűt tartalmazó fájlnevek ??* legalább két karakterből álló fájlnevek [A-Z]* nagybetűvel kezdődő fájlnevek *[0-9] számra végződő fájlnevek [bf]alta csak a „balta” és „falta” fájlok [a-c,m-o]* csak a „a”, a „b”, a „c”, az „m”, az „n”, és az „o” betűvel kezdődő fájlok /dev/hd[ad] csak a primary master és secondary slave meghajtók (/dev/hda, /dev/hdd) [^0-9] számok kivételével minden karakter
10.4.
Több parancs összevonása
Több olyan eset is előfordulhat, amikor egymás után több parancsot is ki kell adni, de ezek vagy függnek egymástól, vagy csak ki akarjuk adni a parancslistát, és magára hagyni a gépet, hogy dolgozzon. Parancssorozatok Egyszerű parancssorozatokat parancssorban (pontosvesszővel) választjuk el:
is
kiadhatunk,
ha
a parancsokat
’;’
Bash$ touch FILE ; df –h
E parancssorozat hatására a touch program létrehozza a FILE fájlt, majd a df kiírja az üres helyeket az egyes meghajtókon. Azonban a pontosvesszős elválasztás mellett van másik két elválasztási lehetőség is, a ’||’ és ’&&’ jelek használata. Ezekkel feltételes végrehajtást lehet előidézni. Működésükhöz tudni kell, hogy használatos minden program által egy úgynevezett kilépési érték, amelynek értéke 0 (nulla), ha a program sikeresen lefutott és nullától különböző pozitív egész szám, ha valami
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
87
hiba lépett fel a működés során. Ennek tudatában már felhasználható a kilépési érték feltételes utasítások kiadására: parancs_1 || parancs_2 parancs_3 && parancs_4
A parancs_2 csak akkor hajtódik végre, ha parancs_1 kilépési értéke nem nulla, azaz valami hiba lépett fel a működés során. A parancs_4 program viszont pont akkor hajtódik végre, ha parancs_3 hiba nélkül futott le, azaz kilépési értéke nulla. Parancsösszevonások Parancsösszevonásokkal még változatosabb és hatékonyabb parancsokat adhatunk ki. Parancsok összevonásához az összevonandó parancsokat „(” és „)” közé kell rakni: Bash$ (cat tanulok ; cat tanarok) ... Bash$
Eddig még nem lenne nagy találmány, értelmét akkor látjuk meg, ha folytatjuk a parancsot egy „|” (csővezeték) jellel: Bash$ (cat tanulok ; cat tanarok) | sort ... Bash$
Ennek hatására a sort parancs megkapja bemenetként a két fájl tartalmát összefűzve, amit sorba rendez, majd a képernyőre nyomtatja. Zárójelek nélkül: Bash$ cat tanulok ; cat tanarok | sort ... Bash$
A képernyőre került volna a tanulok fájl tartalma rendezetlenül, majd a tanarok fájl tartalma sorba rendezve. Mindezek mellett az a kényelem is fogad bennünket, hogy „|” (csővezeték) jelet használhatunk zárójelen belül is: Bash$ (cat tanulok | tee /dev/lp0 ; cat tanarok | tee /dev/lp0) | sort ... Bash$
A parancs hatására a tanulok és a tanarok fájl tartalma egymásután fűzve, majd sorba rendezve megjelenik a képernyőn. Külön-külön pedig sorba rendezés nélkül a nyomtatóra kerülnek1. Hosszú parancs(sorozat)ok több sorban Lehetőség van arra, hogy a kiadandó parancsot több sorba törjük, miközben a feldolgozás során még is egy sornak számítson. Első gondolatunk az lehet, hogy pusztán csak az esztétika iránt érzett kielégíthetetlen vágyunk csillapítására jó, azonban a könyvben továbbhaladva meglátjuk majd az értelmét2. 1
A tee programot az „Egyszerű szűrő programok” fejezet „Egyéb programok” alfejezetében tárgyaljuk. A „Debian csomagkezelése” fejezetben is látunk majd rá szemléletes példákat.
2
88
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Listáztassuk ki a /tmp/proba fájl tartalmát! Először egysoros, majd „megtört” parancsot használunk: Bash$ cat /tmp/proba Ez a proba fajl tartalma. Bash$ Bash$ cat \ /tmp/proba Ez a proba fajl tartalma. Bash$
Figyeljünk oda a használata során, hogy a „\” (fordított per) jel után ne legyen semmilyen karakter, még szóköz sem, ugyanis a „\” (fordított per) jellel védjük meg a sorvég jelet a héj értelmezése elöl.
10.5.
Ide tartozó parancsok
Parancsok, parancssorozatok rövidítése – alias Segítségével hosszabb parancsneveket rövidíthetünk, felparaméterezett programot, vagy akár egy egész parancssorozatot futtathatunk egy paranccsal. Bash$ alias l=’ls -lak’ Bash$
A már meglévő hozzárendeléseket lekérdezhetjük az alias parancs paraméter nélküli lefuttatásával: Bash$ alias alias l=’ls -lak’ Bash$
A nemkívánatos alias törlését az unalias paranccsal tehetjük meg: Bash$ unalias l Bash$ alias Bash$
Konzol letisztítása, azaz képernyőtörlés – clear Képernyőtörlést hajt végre. BASH használata esetén a CTRL+L kombináció lenyomásával is elérhetjük ugyanezt, amellett, hogy az éppen begépelt parancs megmarad. Konzol inicializálása, alaphelyzetbe hozása – reset A parancs segítségével alaphelyzetbe hozhatjuk a konzol képernyőt. Többek között visszaállítja a soremelés és a speciális karakterek jelentését az alapértékre. Hasznos lehet a használata akkor is, ha egy lefagyott program szabálytalan állapotban hagyja a konzolt és így esetleg nehezen vagy egyáltalán nem olvasható.
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
89
Üzenetsor és változó tartalmának kiírása – echo Jelentése: vízhang. Az utána írt (paraméterként átadott) adatot az alap kimeneti csatornára írja: Bash$ echo ”Szép időnk van!” Szép időnk van! Bash$
De akár egy változó tartalmát is kiírathatjuk vele, ahogy azt már láthattuk pár oldallal előrébb: Bash$ export VALTOZO=”Szép időnk van!” Bash$ echo $VALTOZO Szép időnk van! Bash$
90
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Jónás Zsolt
11.
GNU/Linux - kezelési ismeretek I.
91
fejezet
Folyamatvezérlés
Többfelhasználós (multiuser) és többfeladatos (multitasking) rendszerekben szükség van a futó programok megkülönböztetésére. Ezért a Linux-ban is bevezettek egy folyamatazonosító rendszert. A rendszerben futó folyamatot, programot process-nek vagy job-oknak nevezik, innen származik a jobcontrol (folyamatvezérlés) kifejezés. GNU/Linux rendszerünkben kétféle folyamatazonosítási rendszer van. Az egyik a teljes rendszerre, a rendszerben futó összes programra kiterjed. A másik egy szűkebb kört foglal magában, amely az aktuálisan futó héj programon belül indított újabb folyamatokat tarja számon. Belátható, hogy ha két héj fut egymás mellett (például beléptünk két konzolon), akkor a futó két héj két különböző folyamatazonosítási listát tart számon. Az egyik héjon belül futó program belső folyamatazonosítójára nem tudunk hivatkozni egy másik héjból.
11.1.
A folyamatazonosítás
Minden program – elindulásakor – kap egy folyamatazonosító1 számot. Ezen a számon van nyilvántartva a rendszer számára. A sorszámok csak pozitív egész számok lehetnek, a kiosztásuk növekvő sorrendben történik, valamint egyik folyamatazonosító számot sem lehet újra felhasználni. Tudjuk, hogy az init program az első, ami elindul, így nem meglepő, hogy mind ő kapja az „1”-es sorszámot. A többi program ennél nagyobb folyamatazonosító számmal rendelkezik. Ha egy programból több példány fut, akkor mindegyik példányának külön van egy-egy 1
Folyamatazonosító = Processz Identification (PID)
92
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
folyamatazonosító száma, így mindegyik szálra külön hivatkozhatunk. Valamint a fentiek alapján könnyen belátható, hogyha egy programot elindítunk, majd megállítjuk, végül megint elindítjuk, akkor az újabb indítás alkalmával már egy másik (nagyobb) folyamatazonosító számot fog kapni. Ennyi elméleti ismeret után nézzük meg a rendelkezésünkre álló programokat, amivel lekérdezhetjük vagy megállíthatjuk a futó alkalmazásokat, esetleg megváltoztathatjuk a futási tulajdonságukat Folyamatok állapotának lekérdezése – ps A rendszerben futó processzekről, folyamatokról kérhetünk listát. Mindenféle paraméter mellőzése esetén, az aktuális konzolon futó programokról kapunk egy egyszerű listát: Bash$ PID 1401 9636 Bash$
ps TTY pts/2 pts/2
TIME CMD 00:00:00 bash 00:00:00 ps
Ha megadjuk az „u” paramétert, akkor felhasználó-orientált kinézetet kapunk, amelyben kiírásra kerül a processzt futtató felhasználó és az indítási ideje: Bash$ ps u USER PID %CPU %MEM jonci 1392 0.0 0.4 jonci 1393 0.0 0.4 jonci 9125 0.0 0.4 Bash$
VSZ RSS TTY 2792 1188 tty1 2792 1208 tty2 3200 1152 tty2
STAT S S R
START 09:02 09:02 14:34
TIME 0:00 0:00 0:00
COMMAND /bin/bash /bin/bash ps u
Ha kíváncsiak vagyunk a többi felhasználó által futtatott programokra is, akkor használjuk az „a” paramétert, amit akár kombinálhatunk az előbb látott „u” paraméterrel is: Bash$ ps au USER PID root 1249 root 1250 root 1251 jonci 1392 jonci 1393 jonci 9251 Bash$
… … … … … … …
TTY tty1 tty2 tty3 tty1 tty2 tty2
STAT S S S S S R
START 09:02 09:02 09:02 09:02 09:02 14:38
TIME COMMAND 0:00 /sbin/getty 38400 tty2 0:00 /sbin/getty 38400 tty2 0:00 /sbin/getty 38400 tty3 0:00 /bin/bash 0:00 /bin/bash 0:00 ps au
Az „x” paraméterrel kérhetjük azon processzek listázását is, amelyek konzolról leválva, a háttérben futnak (deamon programok). E processzek sorában a TTY oszlopban egy „?” (kérdőjel) található jelezvén, hogy nem kapcsolódik egyik konzolhoz sem (leválva fut). Megadhatjuk a listázandó processz számát is, amely(ek) megjelennek függetlenül az „a” és „x” paraméterek megadásától illetve meg nem adásától: Bash$ ps u 1 1400 USER PID %CPU %MEM root 1 0.0 0.1 jonci 1400 0.0 0.3 Bash$
VSZ RSS TTY 1276 456 ? 2808 1008 pts/3
STAT START S 09:00 S 09:02
TIME COMMAND 0:05 init 0:00 /bin/bash
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
93
Az „f” paraméter megadásával kérhetjük a ps programot, jelölje meg faágszerűen, a folyamatok egymáshoz való viszonyát: Bash$ PID 1392 9375 1393 9581 Bash
ps f TTY tty1 tty1 tty2 tty2
STAT S R S R
TIME COMMAND 0:00 /bin/bash 0:00 \_ mc –a –u 0:00 /bin/bash 0:00 \_ ps f
A ps program legelterjedtebb paraméterezése a „aux”, amivel kellő rálátást kapunk a rendszerben működő folyamatokra, akár alias-t is érdemes létrehozni hozzá: Bash$ alias ps=”ps aux” Bash$
Processzek ábrázolása fa struktúra szerint – pstree Az éppen futó processzekből egy fa struktúrát jelenit meg, hogy melyik processz melyik processzből származik. A rendezés az egyes ágakban név szerint történik, de a „-n” paraméterrel átállíthatjuk, hogy a PID-ek alapján történjen az – immár numerikus – rendezés. Alapértelmezés szerint összevonja az azonos ágakat. Az összevont ágak számát a „szám*” jelölés számszerűsíti: Bash$ pstree init-+-acpid |-bash |-cron `-2*[getty] Bash$
A „-c” paraméterrel kikapcsolhatjuk az azonos processzek összevonását, de a „-a” paraméter megadásával is elérhetjük ugyanezt, ráadásul utóbbi esetben még a parancssorban megadott paramétereket is megkapjuk. Ha a „-p” paramétert is odaírjuk, akkor a futó processzek PID számát is elolvashatjuk. Legvégül, ha a „-u” paraméterrel kibővítjük a paraméterek sorát, akkor az UID változásokat is nyomon követhetjük: Bash$ pstree -apuh init,1) |-acpid,279) -c /etc/acpi/events -s /var/run/.acpid.socket |-bash,1292,jonci) |-cron,922) |-getty,1291) 38400 tty2 `-getty,1292) 38400 tty3 Bash$
Tudjuk, hogy az init a root UID számával fut, de a bejelentkezett jonci felhasználó által futtatott bash (PID =1292, UID=jonci) már a jonci felhasználó UID számáéval, ezért kerül kijelzésre a változás. Az aktuális processzt pedig a „-h” paraméter megadásával emelhetjük ki, persze csak ha támogatja a terminál a kiemelést. A „-H PID” paraméterrel tetszőleges számú folyamatot kiemeltethetünk az aktuális helyett.
94
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Futó processzek megjelenítése – top Használatával egy valós idejű állapotfelmérést kapunk a rendszerünkről. A program sok paraméterrel, kapcsolóval és futás közbeni forró-billentyűvel rendelkezik, ezért csak egy kis ízelítőt adunk a program tudásából. A program paraméter nélküli futtatása esetén a következő kép tárul elénk: Bash$ top top - 13:20:10 up 55 days, 1 user, load average: 0.21, 0.24, 0.19 Tasks: 71 total, 2 running, 69 sleeping, 0 stopped, 0 zombie Cpu(s): 7.8% user, 2.0% system, 0.0% nice, 0.0% idle Mem: 192076K total, 182228K used, 9848K free, 14716K buffers Swap: 128512K total, 58644K used, 69868K free, 43204K cached PID 12739 1 5 7 102 167 183 189 210 214 233 ... Bash$
USER jonci root root root daemon root root root root root root
PRI 17 8 9 9 9 9 9 8 8 9 9
NI 0 0 0 0 0 0 0 0 0 0 0
SIZE RSS SHARE STAT %CPU %MEM 1040 1040 820 R 1.7 0.5 184 140 120 S 0.0 0.0 0 0 0 SW 0.0 0.0 0 0 0 SW 0.0 0.0 204 160 160 S 0.0 0.0 484 472 400 S 0.0 0.2 192 96 96 S 0.0 0.0 196 136 132 S 0.0 0.0 268 200 148 S 0.0 0.1 1240 1196 1168 S 0.0 0.6 152 96 96 S 0.0 0.0
TIME 0:00 0:06 16:16 6:28 0:00 0:08 0:00 0:00 0:00 0:00 0:00
COMMAND top init kswapd kupdated portmap syslogd gpm inetd cron apache getty
A „k” betű lenyomásával kezdeményezhetjük egy program kilövését (bezárását). A billentyű lenyomása után a program bekéri a bezárandó program PID számát. Megadása után megadhatjuk a küldendő szignált, ami alapesetben a TERM. Az eltérő kilövési módszerekről és a különböző szignálokról a következő két parancsnál olvashatunk. A programból a „q” betű lenyomásával léphetünk ki. Szignál küldése egy processznek – kill Minden felhasználó csak a saját programjait állíthatja meg, azonban a rendszergazdának joga van az összes felhasználó bármelyik processzének szabályozására, megállítására. Ez a megszorítás igaz a következőkben tárgyalt killall parancsra is. Különböző szignálok küldhetők a futó processzeknek, amelyekre a PID számuk alapján hivatkozhatunk. Ha nem adunk meg szignált, akkor alapesetben a (SIG)TERM1 szignált küldi el a program a megadott PID számmal rendelkező folyamatnak, így az alább kiadott két parancs teljesen egyenértékű működés szempontjából: Bash$ kill 2425 Bash$ kill -TERM 2425 Bash$
A parancsot (PID=2425) futtató konzolon (/dev/ttyX) a program (PID=2425) futásának megszakítása után a Terminated felirat jelenik meg. Az alábbi táblázatban felsoroljuk az általánosan használt szignálokat, számukat és hatásukat: 1
Szignál neve lehet TERM, KILL, stb., de írhatunk mindegyik elé egy SIG rövidítést is: SIGTERM, SIGKILL, stb.
Jónás Zsolt
Név HUP TERM KILL STOP CONT
95
GNU/Linux - kezelési ismeretek I.
Szám 0 1 15 9 19 18
Hatás processz futásának ellenőrzése; ha fut, nem kapunk hibaüzenet beállításokat tartalmazó fájlok újraolvastatása „megkéri” a programot, hogy hagyja abba a futását program futásának bezárása, kilövése processz futásának szüneteltetése szüneteltetett futás folytatása
Ha ennyivel nem elégszünk meg, akkor lekérdezhetjük a program által ismert szignálokat a „-l” paraméterrel: Bash$ kill -l 1) SIGHUP ... 58) SIGRTMAX-5 62) SIGRTMAX-1 Bash$
2) SIGINT 59) SIGRTMAX-4 63) SIGRTMAX
3) SIGQUIT 60) SIGRTMAX-3
4) SIGILL 61) SIGRTMAX-2
A számhoz tartozó szignál nevét az alábbi módon kérdezhetjük le: Bash$ kill -l 9 KILL Bash$
Az alábbi paranccsal állíthatjuk meg egy program futását (legyen PID = 4568): Bash$ kill -9 4568 Bash$
A parancsot (PID=4568) futtató konzolon (/dev/ttyX) a program (PID=4568) futásának megszakítása után a Killed felirat jelenik meg. Ezután lássunk példát egy program (legyen PID = 6578) futásának felfüggesztésére, majd futásának folytatására: Bash$ -STOP 6578 Bash$ -CONT 6578
Végül, ha a felhasználó ki akarja lőni az összes olyan programot, amit joga van bezárnia, akkor az alábbi parancsot kell kiadnia: Bash$ kill -9 -1 Login:
Processzek megállítása név szerint – killall A killall program szignált küld minden olyan futó programnak, amely nevére illeszkedik a paraméterben megadott név. Ha nem adtunk meg jelzést, akkor a SIGTERM szignált küldi a program(ok)nak. Ha a jonci felhasználó be akarja zárni az összes általa futtatott mc programot, akkor csak ki kell adnia az alábbi parancsot: Bash$ killall mc Bash$
96
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Ezután az összes konzolon, amelyiken az mc programot futtatta, megjelenik a Terminated üzenet. Azonban van rá mód a „-i” kapcsolóval, hogy rákérdezzen a program minden egyes processz kilövése előtt, biztos ami biztos alapon. A „-v” paraméterrel pedig jelentést kérhetünk a sikeres szignál küldésekről: killall -vi mc Kill mc(14473) ? (y/n) n Kill mc(14485) ? (y/n) y Killed mc(14485) with signal 15
A „-q” paraméterrel a jelentések küldésének elhallgatását kérhetjük. A „-l” paraméter megadásával pedig itt is egy listát kapunk a lehetséges szignálokról. Szignál küldése a felhasználó összes programjának – slay Csak rendszergazdai jogosultságokkal használható, mert segítségével szignált küldhetünk bármelyik felhasználó összes futó processzének. Ha nem adjuk meg a küldendő szignált, akkor a KILL (9) szignál kerül elküldésre. A jonci felhasználó összes programját az alábbi paranccsal zárhatjuk be, aminek következtében a felhasználót „kidobja” a rendszer: Bash$ jonci Bash$ Bash$ root Bash$
users jonci root slay jonci users
Látható, hogy a slay parancs használata előtt a jonci felhasználó két konzolon is be volt jelentkezve, azonban a parancs kiadása után az összes általa futtatott parancs bezáródott, így a BASH is, amit használt, ennek következtében a rendszer kiléptette.
11.2.
Prioritási szintek
Program futtatása módosított ütemezői prioritással – nice Minden futó processznek van egy prioritása, ami alapján több vagy kevesebb processzor időt kap futása során, erről a feladatütemező gondoskodik a kernelben. A prioritási érték -20 (legnagyobb prioritás) és +19 (legkisebb prioritás) között lehet. Paraméter nélkül futtatva a programot, kiírja az aktuális prioritási szintet: Bash$ nice 0 Bash$
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
97
Ha egy program elindít magán belül egy másik programot, akkor az újonnan elindított program ugyanazon a prioritási szinten indul el, mint a szülő1: Bash$ 0 Bash# Bash# 0 Bash# Bash$
nice bash nice exit
A nice programmal futtatva egy másik programot, lehetőségünk van arra, hogy az újonnan indított processz ne a szülő prioritásával fusson. Ugyanakkora vagy nagyobb prioritást mezei felhasználóként is megadhatunk, de kisebb prioritási szintet csak rendszergazdaként állíthatunk be. Ha nem adjuk meg paraméterben az új prioritási szintet – csak a futtatandó programot –, akkor újonnan elindított folyamat a +10-es prioritási szinten fog futni. Az elindított program prioritási szintjét a „-n <prioritási szint>” paraméterrel állíthatjuk be: Bash$ 0 Bash$ Bash# 10 Bash# Bash$ 0 Bash$ nice: Bash$ Bash# 15 Bash# Bash$
nice nice bash nice exit nice nice -n -15 bash cannot set priority: Permission denied nice -n 15 bash nice exit
Futó program prioritásának megváltoztatása – renice Fotó programok prioritási szintjét változtathatjuk meg vele. Lehetőségünk van külön PID számonként változtatni a prioritást, vagy felhasználókként, esetleg csoportonként. Mezei felhasználóként is használhatjuk a programot az általunk futtatott folyamatokhoz, azonban arra ügyeljünk, hogy csak az aktuális prioritási szinttel megegyezőt vagy annál magasabbat adhatunk meg. A root felhasználó jogosult egyedül a prioritási szint csökkentésére, valamint csak ő változtathatja meg másik felhasználó vagy csoport futó programjainak a prioritási szintjét. Lássunk pár példát az előbbiekre. Változtassuk meg a 758-as PID számmal rendelkező program futási szintjét +10-re. A „-p” kapcsolóval adhatjuk meg a PID számot: Bash$ renice +10 -p 758 Bash$
1
Alap Debian telepítésben a felhasználói prompt a Bash$, a rendszergazdai pedig a Bash#. A példában azonban nem ezt jelöli, csak a jobb szemléletesség jegyében lett lecserélve a „$” (dollár) jel a „#” (kettős kereszt) jelre, hogy meg lehessen különböztetni a bash programon felül futó másik bash program promptját.
98
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
A jonci felhasználó a következőképpen tudja megváltoztatni az összes futó programjának a prioritási szintjét +5-re: Bash$ renice +5 -u jonci Bash$
11.3.
Héjon belüli folyamatazonosítási rendszer
Mint olvashattuk, minden elindított héjnak saját folyamatazonosítási listája van. A héj elindítása után a lista üres, ugyanis csak a háttérben futó folyamatokat tarja számon. Program háttérben való futtatására több megoldás is kínálkozik. Az egyik lehetőségünk, hogy elindítjuk a programot, aminek a futását a CTRL+Z billentyűkombinációval megszakítjuk, amelynek hatására visszakapjuk a promptot. A továbbiakban négy lehetőségünk van. Az egyik, hogy tovább dolgozunk, a futását megszakított program pedig nem csinál semmi, áll. A második lehetőségünk, elindítjuk a program futását a háttérben a bg paranccsal. A harmadik megoldás, hogy visszahozzuk az előtérbe a program futását az fg paranccsal (így nem tudunk dolgozni a héjban). A negyedik esetben pedig kilőjük a programot a memóriából a kill paranccsal. Azonban lehetőségünk van arra is, hogy eleve úgy induljon el a program, hogy a háttérben kezdje meg a futását, ezt pedig úgy érhetjük el, hogy a kiadandó parancs végére írunk egy „&” (and) jelet. Aktív (háttérben futó) feladatok, folyamatok kilistázása – jobs A háttérben futtatott folyamatokat listáztathatjuk ki vele. Ha paraméter nélkül futtatjuk le, akkor csak egy egyszerűsített listát kapunk: Bash$ [1]+ [2] [3]Bash$
jobs Stopped Running Killed
mc -a -u updatedb & cat /dev/sda5 >/dev/null &
A „-l” paraméter megadásával egy részletesebb listát (long) kapunk: [1]+ [2] [3]-
2678 Stopped (tty output) 2680 Running 2693 Killed
mc -a -u updatedb & cat /dev/sda5 >/dev/null &
A Stopped felirat jelentése, hogy a háttérben futó program nem végez műveletet, áll. A futó processzeket a Running, a kilőtt folyamatokat pedig a Killed felirat jelzi. Ha paraméterben megadjuk a job számát, akkor csak azt jelzi ki: Bash$ jobs 2 [2] Running Bash$
updatedb &
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
99
Lehetőség van arra is, hogy csak azokat a folyamatokat listáztassuk ki, amelyek időközben megváltoztatták az állapotukat (például: Stopped Killed, Running Exit, stb...). Ehhez csak ki kell adni a következő parancsot1: Bash$ jobs -x [2] Exit 1 Bash$
cat /dev/sda5 >/dev/null
Munkafolyamat háttérbe küldése – bg Háttérbe rakott, de álló, vagy előtérben futó folyamat megállítása esetén, a folyamat háttérben történő futásának folytatását kezdeményezhetjük vele. Nézzük meg, mit jelent pontosan az előbbi mondat. Indítsunk el egy programot, aminek a futását szakítsuk meg a CTRL+Z billentyűkombinációval, aminek hatására visszakapjuk a promptot. Ha lekérdezzük a jobs paranccsal a folyamatok listáját, a következőt látjuk: Bash$ cat /dev/sda5 >/dev/null CTRL+Z [1]+ Stopped cat /dev/hda >/dev/null2 Bash$ jobs [1]+ Stopped cat /dev/hda >/dev/null Bash$
Ebben az esetben egy sima bg parancs kiadása következtében a cat parancs megkezdi futását a háttérben: Bash$ bg [1]+ cat /dev/hda >/dev/null & Bash$
Több, háttérbe rakott folyamat esetében már meg kell adnunk a bg parancsnak paraméterben, hogy melyik folyamatot szeretnénk a háttérben futtatni.: Bash$ jobs [1]- Stopped [2]+ Stopped Bash$ bg 1 [1]- cat /dev/zero & Bash$ jobs [1]- Running [2]+ Stopped Bash$
cat /dev/zero cat /dev/hda >/dev/null
cat /dev/zero & cat /dev/hda >/dev/null
Ha több folyamat esetén sem adunk meg folyamatazonosító számot, akkor a „+” (meg) jellel jelzett folyamatra fog vonatkozni a bg parancs. Ha ez a folyamat leáll (Exit vagy Killed), akkor a „-” (mínusz) jellel jelzett folyamat kapja meg a „+” (meg) jelet, a „-” (mínusz) jel pedig valamelyik nemjelölt folyamaté lesz.
1 2
Ugyan ezt az eredmény érhetjük el egy sima – parancs nélküli – ENTER lenyomásával is. Lásd: „jobs -x” parancs és lábjegyzete
100
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Munkafolyamat előtérbe hozása – fg Háttérbe rakott (futó vagy álló) folyamatot hozhatunk az előtérbe vele. Futó folyamat esetén a futás nem áll meg. Álló folyamat esetén a futás megkezdődik, vagy folytatódik a megállított helyzettől: Bash$ jobs [1]- Stopped [2]+ Stopped Bash$ fg 1 cat /dev/zero
cat /dev/zero cat /dev/hda >/dev/null
A bg programnál megismert „+” (meg) és „-” (mínusz) jelzésrendszer itt is ugyanúgy működik. Több folyamat esetén, ha az fg parancsnak nem adunk meg folyamatazonosító számot, akkor a „+” (meg) jellel jelölt processz lesz az alapértelmezett. Előtérbe hozása esetén a „-” (mínusz) jellel jelölt folyamat megkapja „+” (meg), valamelyik nemjelölt folyamat pedig a „-” (mínusz) jelet. HANGUP üzenet figyelmen kívül hagyatása kilépéskor – nohup A háttérben elindított munkafolyamatok bezáródnak, ha kilépünk az általunk használt shell programból, ugyanis a héj indította el őket, így ha az bezáródik, azzal az összes, belőle indított gyermekprocessz bezáródik. E probléma feloldására is létezik segédeszköz, ez pedig a nohup parancs. Az általa indított programok a háttérben maradva futnak tovább a shell bezárása után is. Használata a következő: Bash$ nohup <parancs> & Bash$
Jónás Zsolt
12.
GNU/Linux - kezelési ismeretek I.
101
fejezet
Szótár
Sajnos tudomásul kell vennünk, hogy a számítástechnika nyelve az angol, így biztos, hogy bármilyen eszközzel is foglalkozzunk, annak van angol neve, viszont e nyelv adottságaiból következően, nem biztos, hogy létezik magyar megfelelője. Manapság már egyre csökken azon angol szavak, kifejezések száma, amelyek magyarításra várnak, de nem szabad elsietni, mert sajnos nem minden lefordított kifejezés lett találó, valamint akad közöttük egyenesen megtévesztő is. A táblázat fürkészése előtt felhívnám figyelmet arra, hogy bár egyfajta angolmagyar, magyar-angol szótárnak is tekinthető az alábbi összeállítás, de csak óvatosan, ugyanis nem a szó szerinti fordítás volt az elsődleges célja a fordítóknak, hanem az érthetőség.
12.1.
Hardver eszközök Hardware Kézzel megfogható számítógépes eszköz Processor, Central Processing Unit (CPU) Processzor, Központi Feldolgozó Egység Socket Tokozás (processzoré) LAN Card Soundcard Videocard Motherboard Chipset Slot AGP Slot
Hálózati kártya Hangkártya Videokártya Alaplap Chipkészlet (alaplapé, videokártyáé, stb.) Foglalat (a kártyák helye az alaplapon) AGP Foglalat (a videokártya helye)
102
GNU/Linux - kezelési ismeretek I.
Hard Disk, Winchester Partition Primary partition Extended partition Logical partition Partition Table Sector Master Boot Record Super Boot Record Mobil Rack
Jónás Zsolt
Merevlemez, háttértár Partíció, szelet, rész Elsődleges (típusú) partíció Kiterjesztett (típusú) partíció Logikai (típusú) partíció Partíciós tábla Szektor (512 byte-ból áll; 8 bit 1 byte) A merevlemez első blokkja, sectora Egy partíció első blokkja, sectora Hordozható fiók (általában merevlemez hordozására használják)
Keyboard Billentyűzet, klaviatúra Mouse Egér Device (valamilyen hardver) Eszköz Jumper Összekötő, összekötés Fun Ventilátor Config file Beállító fájl
12.2.
Szoftver fogalmak Software Olyan számítógépes eszköz, amit nem lehet megfogni (például: eszközkezelő program) Operating System Kernel Driver Daemon Exit status OpenSource (program) Freeware (program) Shareware (program) Disribution Regular Expression (RegExp) Directory Root Directory Library
1
Operációs Rendszer (rendszer)mag Eszközkezelő program démon1 Kilépési érték Nyílt forráskódú Nem nyílt, de szabadon használható Megkötésekkel, de ingyen használható Disztribúció, terjesztés Szabályos Kifejezések Könyvtár Gyökér Könyvtár, Főkönyvtár Megosztott-függvények Könyvtárra
Felhívnám a figyelmet, hogy hiába terjedt el a „démon”-i fordítás, az mégsem az angol demon (gonosz, ártó szellem) szóból ered
Jónás Zsolt
13.
GNU/Linux - kezelési ismeretek I.
103
fejezet
Függelék
Az alább felsorolt rövidítések, mozaikszavak, eszköznevek és fájltípusok messze nem az összes. Csak egy kis ízelítőt akar adni, valamint az alapismereteket próbálja kicsit tágítani. A nap, mint nap használt nevek úgy is rögzülnek, a többit elég tudni táblázatból.
13.1.
Rövidítések, mozaikszavak
Közel sem az összes, csak a legáltalánosabb rövidítések kerültek felsorolásra, amik sokszor előfordulnak, találkozhatunk velük naponta. Számítógépes Hardver eszközök Central Processing Unit Read Only Memory Random Access Memory Extended Data Output RAM Single In-Line Memory Module Dual In-Line Memory Module Static RAM Dynamic RAM Synchronous DRAM Double Data Rate SDRAM Rambus DRAM
CPU ROM RAM EDO-RAM SIMM DIMM SRAM DRAM SDRAM DDR-SDRAM RDRAM
104
GNU/Linux - kezelési ismeretek I.
Floppy Disc (Drive) FD(D) Hard Disc (Drive) HD(D) Compact Disc Video CD CD-Recordable CD-Rewritable Digital Versatile Disc Monochrome Display Adapter Hercules Graphics Controller Color Graphics Adapter Enhanced Graphics Array Video Graphics Array Super VGA Video Electronics Standard Association
CD VCD CD-R CD-RW DVD MDA HGC CGA EGA VGA SVGA VESA
Csatoló felületek Intelligent Drive Electronics Enhanced Intelligent Drive Electronics Small Computer System Interface Advanced Technology AT Attachment ATA Packet Interface Direct Memory Access VESA Local Bus Industry Standard Architecture Enhanced ISA Peripheral Component Interconnect Accelerated Graphics Port Personal Computer Memory Card International Association
IDE EIDE SCSI AT ATA ATAPI DMA VLB ISA EISA PCI AGP PCMCIA
Inteligent Input/Output I2O Hálózattal kapcsolatos rövidítések Serial port (?common? port) COM PS/2 port PS/2 Universal Serial Bus USB Medium Access Control Bayonet Neil Concelman connector Unshielded Twisted Pair Local Area Network Wireless Local Area Network General Packet Radio Services Internet Protocol
MAC BNC UTP LAN W-LAN GPRS IP
Jónás Zsolt
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
Internetwork Packet exchange Transmission Control Protocol/Internet Protocol User Datagram Protocol Network File System Packet Internet Gropher Domain Name System Berkeley Internet Name Daemon Dynamic Host Configuration Protocol File Transfer Protocol Hyper Text Transfer Protocol Uniform Resource Locator Hyper Text Markup Language eXtensible Markup Language Common Gateway Interface World Wide Web Secure Socket Layer Point-to-Point Protocol Simple Mail Transfer Protocol Internet Mail Access Protocol Secure Shell Virtual Network Computing I Seek You Internet Relay Chat TCP vagy UDP: A portok egy szolgáltatási végpont TCP és UDP absztrakciói. Mielőtt egy folyamat biztosíthat vagy elérhet egy hálózati szolgáltatást, kérnie kell egy portot. A gazdagép IP címeivel együtt a portok egyedejüleg azonosítják egy TCP kapcsolat két párját
IPX TCP/IP UDP NFS PING DNS BIND DHCP FTP HTTP URL HTML XML CGI WWW SSL POP3 (PPP) SMTP IMAP SSH VNC ICQ IRC Port
Egyéb rövidítések Basic Input/Output System BIOS Master Boot Record MBR Operating System OS Nemzetközi UNIX szabványosítási hivatal POSIX American Standard Code for Information ASCII Interchange Frequently Asked Questions FAQ Linux-felhasználók Magyarországi Egyesülete LME Free Software Foundation FSF Business Software Alliance BSA Greenwich Mean Time Real Time Clock Process Identification User Identification Group Identification
GMT RTC PID UID GID
105
106
GNU/Linux - kezelési ismeretek I.
Application Programming Interface Graphic User Interface GNU Network Object Model Environment K Desktop Environment
Jónás Zsolt
API GUI GNOME KDE
Message Of The Day MOTD Nevek Alan Cox Andrea Arcangeli Richard M. Stallman Eric S. Raymond
13.2.
AC AA RMS ESR
Eszközcsatoló nevek, rövidítések
A /dev könyvtárban levő virtuális fájlok egy-egy csatoló a hozzá tartozó eszközhöz, amin keresztül elérhetjük, ezért nem árt tudni, hogy melyik rövidített név mit is takar valójában, melyik eszközhöz tartozik. A teljesség igénye nélkül: Floppy Disc fd[0-1] IDE Disc / CDROM – Primary Master IDE Disc / CDROM – Primary Slave IDE Disc / CDROM – Secondary Master IDE Disc / CDROM – Secondary Slave
hda[1-x] hdb[1-x] hdc[1-x] hdd[1-x]
SCSI CD scd[0-x] SCSI Disc, de lehet USB-s memóriakártya sd[a-x][1-x] SCSI Generic sg[0-x] TeleType (konzolos bejelentkező) Pseudo-Terminal Slave Serial Port (soros port) Point to Point Protocol (modemes kapcsolathoz) Parallel Port (párhuzamos port) Line Printer BSD printer capability data base PS/2 mouse port Universal Serial Bus USB-s egér (például: MS IntelliExplorer) GPM data Digital Sound Processor Hangkártya, Rádió- vagy TV-kártya Mixer Linux Infrared Remote Control (tavirányító) Rádió- vagy TV-kárta rádió bemenete TV- vagy digitalizálókártya képbemenete
tty[0-x] pts/[0-x] ttyS[0-3] ppp parport[0-x] lp[0-x] printcap psaux usb/… input/mice gpmdata dsp[0-x] mixer[0-x] lirc radio[0-x] video[0-x]
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
Szimbolikus link a(z első) CDROM eszközre Szimbolikus link a(z első) egér eszközre Szimbolikus link a(z első) hangkártya kimenetre Szimbolikus link a(z első) rádió eszközre Szimbolikus link a(z első) TV eszközre
107
cdrom mouse dsp radio video
loopback interfész loop[0-7] Null eszköz (fekete lyuk, mindent elnyel) null Zero (olvasva 0-t ad, írni nem lehet) zero Device File System devfs Userspace Implementation of devfs udev User-Space System Device Enumeration uSDE
13.3.
Fájlnév-konvenciók
Nem kötelező fájlnév kiterjesztéseket használnunk, de a saját dolgunkat könnyíthetjük meg vele. A leggyakrabban használt kiterjesztések: C forrásfájlok C++ forrás Assembly forrás tárgykód (object) fájlok statikus programkönyvtárak konfigurációs fájlok dinamikus programkönyvtárak (szám kiterjesztés) egyes manual page fájlok (nem mindig) script fájl, mely héj alá készült tar archiválóval készült fájl gzip (GNU zip) tömörítővel tömörített fájl .tar.gz rövidítése (a tar nem tömörít) bzip2 tömörítővel tömörített fájl compress (régebbi) tömörítővel pakolt fájl TeX vagy LaTeX forrásfájl DVI (Device Independent) szöveges-grafikus fájl formátum PostScript (oldalleíró, nyomtatókezelő nyelv) hangmintákat tartalmazó fájlok képfájlok videofájlok
.c, .h .cpp .s, .S .o .a .conf, .cf, rc .so.* .[1-9] .sh, .csh .tar .gz .tgz .bz2, .bzip2 .Z .tex .dvi .ps .au, .mpa, .mp2, .mp3, .ra, .snd, .voc, .wav .bmp, .gif, .jpg, .jpeg, .tga, .tiff, .pcx, .png .avi, .divx, .mov, .mpg, .mpeg, .qt, .rm
108
GNU/Linux - kezelési ismeretek I.
Irodalomjegyzék
13.4.
Felhasznált irodalom
Dokumentum maintainer-ek és fordítók
Angol és magyar GNU/Linux manual oldalak
Pere László
Linux felhasználó ismeretek I.
Marcel Gagné
LINUX rendszerfelügyelet
Kósa Atilla
http://debian.inf.elte.hu/linux_doksi
Debian GNU/Linux felhasználók, -rajongók és -fejlesztők levelezőlistája http://lists.linux.hu/mailman/listinfo/debian
Szabó Bálint
Linux lépésről-lépésre
Büki András
UNIX / Linux héjprogramozás
Szeberényi Imre
Bevezetés a UNIX operációs rendszerbe (oktatási segédlet)
Stefan Strobel & Volker Elling Linux
Brian Ward
Linux Hibaelhárító
Jónás Zsolt
Jónás Zsolt
13.5.
GNU/Linux - kezelési ismeretek I.
Ajánlott irodalom
Linux-HOGYANok
http://www.linux-hogyan.hu
Linux DOC
http://linux.vv.hu
Linux Dokumentációk Magyarul http://szabilinux.hu
Magyar Linux Felhasznalók Címlapja
http://mlf.linux.rulez.org/mlf/doku.html
Linux levelezesi lista kezdőknek
http://mlf.linux.rulez.org/mailman/listinfo/linux-kezdo
Shell Script Programozás
http://www.sync.hu/user/frameset.phtml?url=/varaljaisandor
109
110
GNU/Linux - kezelési ismeretek I.
Jónás Zsolt
Tartalomjegyzék
1.FEJEZET................................................................................................................................3 1.1.GNU/LINUX BEMUTATÁSA RÖVIDEN........................................................................................4 1.2.DEBIAN GNU/LINUX............................................................................................................5 2.FEJEZET................................................................................................................................7 2.1.OPERÁCIÓS RENDSZERREL KAPCSOLATOS FOGALMAK....................................................................7 2.2.PROGRAMOKKAL KAPCSOLATOS FOGALMAK.................................................................................8 2.3.TERJESZTÉSEKKEL KAPCSOLATOS ALAPFOGALMAK......................................................................10 2.4.GRAFIKUS FELÜLETTEL KAPCSOLATOS ALAPFOGALMAK................................................................10 3.FEJEZET..............................................................................................................................13 3.1.A GYÖKÉR („/”) ALKÖNYVTÁRAI............................................................................................14 3.2.AZ /USR ALKÖNYVTÁR..........................................................................................................17 3.3.A /VAR ALKÖNYVTÁR...........................................................................................................19 4.FEJEZET..............................................................................................................................23 4.1.INDULÁSI FOLYAMAT.............................................................................................................23 4.2.RENDSZER LEÁLLÍTÁS............................................................................................................26 5.FEJEZET..............................................................................................................................29 5.1.BEJELENTKEZÉS...................................................................................................................29 5.2.KONZOL ZÁROLÁSA..............................................................................................................32 5.3.KIJELENTKEZÉS....................................................................................................................33 6.FEJEZET..............................................................................................................................35 6.1.FELHASZNÁLÓK, CSOPORTOK ÉS JELSZAVAK TÁROLÁSA...............................................................35 6.2.FELHASZNÁLÓK KEZELÉSE, KARBANTARTÁSA.............................................................................37 6.3.FELHASZNÁLÓI INFORMÁCIÓK LEKÉRDEZÉSE..............................................................................44 7.FEJEZET..............................................................................................................................49 7.1.FÁJLNÉVRE VONATKOZÓ MEGKÖTÉSEK.....................................................................................49 7.2.JOGOSULTSÁGOK..................................................................................................................50 7.3.ÁLLOMÁNYTÍPUSOK..............................................................................................................52 7.4.PARANCSOK........................................................................................................................53 8.FEJEZET..............................................................................................................................59 8.1.MANUAL OLDALAK...............................................................................................................59 8.2.INFO OLDALAK.....................................................................................................................61 8.3.SEGÍTSÉGET ADÓ PROGRAMOK................................................................................................61 9.FEJEZET..............................................................................................................................63 9.1.KÖNYVTÁRKEZELŐ PARANCSOK..............................................................................................63 9.2.FÁJLKEZELŐ PARANCSOK.......................................................................................................69 9.3.FÁJLKERESŐ PROGRAMOK......................................................................................................74 10.FEJEZET............................................................................................................................77
Jónás Zsolt
GNU/Linux - kezelési ismeretek I.
111
10.1.A HÉJ TULAJDONSÁGAI........................................................................................................78 10.2.PARANCSSORI ÉRTELMEZÉS..................................................................................................81 10.3.ÁLLOMÁNYNÉV HELYETTESÍTÉS............................................................................................86 10.4.TÖBB PARANCS ÖSSZEVONÁSA..............................................................................................86 10.5.IDE TARTOZÓ PARANCSOK....................................................................................................88 11.FEJEZET............................................................................................................................91 11.1.A FOLYAMATAZONOSÍTÁS....................................................................................................91 11.2.PRIORITÁSI SZINTEK............................................................................................................96 11.3.HÉJON BELÜLI FOLYAMATAZONOSÍTÁSI RENDSZER....................................................................98 12.FEJEZET..........................................................................................................................101 12.1.HARDVER ESZKÖZÖK........................................................................................................101 12.2.SZOFTVER FOGALMAK.......................................................................................................102 13.FEJEZET..........................................................................................................................103 13.1.RÖVIDÍTÉSEK, MOZAIKSZAVAK............................................................................................103 13.2.ESZKÖZCSATOLÓ NEVEK, RÖVIDÍTÉSEK.................................................................................106 13.3.FÁJLNÉV-KONVENCIÓK......................................................................................................107 13.4.FELHASZNÁLT IRODALOM...................................................................................................108 13.5.AJÁNLOTT IRODALOM.......................................................................................................109