Linux parancsok Az alábbiakban néhány Linux parancsra látunk példákat, feladatokat. Fájlműveletek 1. Hozzunk létre egy linux munka nevű könyvtárat! mkdir linux munka 2. Lépjünk be a linux munka könyvtárba, és hozzunk létre egy szöveges fájlt a cat paranccsal! cd linux munka gedit orak.txt Digitalis kepfellgozas hetfo 16-17 Digitalis kepfellgozas hetfo 11-12 Digitalis kepfellgozas hetfo 12-13 Adatbazis alapu rendszerek szerda 10-12 Adatbazis alapu rendszerek szerda 12-14 Assembly programozas csutortok 8-9 Assembly programozas csutortok 9-10 Operacios rendszerek csutortok 13-14 Operacios rendszerek pentek 11-13 Operacios rendszerek szombat 8-10 3. Nézzük meg a less programmal az orak.txt tartalmát! less orak.txt 4. Töltsük le a honlapról a fajlok.tar.gz állományt a linux munka könyvtárba, majd csomagoljuk ki! tar xvfz fajlok.tar.gz 5. Listázzuk ki a fájlokat! 1
2 fájlok listázása: ls fájlok és tulajnságok listázása: ls -l fájlok és könyvtárak rekurzív listázása: ls -R vagy ls -lr 6. Nézzük meg a fájlok típusát! le * cd linux munka le * 7. Hozzunk létre egy masolatok könyvtárat a linux munka könyvtáron belül! mkdir masolatok Másoljunk át minden fájlt és könyvtárat a masolatok könyvtárba! cp * masolatok (nem tud könyvtárat másolni) cp -r kepek masolatok (a -r kapcsoló a könyvtárak tartalmát is rekurzívan másolja) 8. Töröljük a masolatok könyvtárban lévő fájlokat! rm masolatok/* (a fájlokat letörli, de a könyvtárakat nem) rm -r masolatok/* (mindent letöröl, a könyvtárakat is) rm -rf masolatok/* (mindent letöröl, a könyvtárakat is) 9. Hozzunk létre egy (soft) linket a kepek könyvtárról, legyen a neve kepek2: ln -s kepek kepek2 ls -l 10. Archíváljuk a kepek könyvtárat egy kepek.tar.gz fájlba: tar cvfz kepek.tar.gz Nézzük meg a fájl tartamát! tar tvfz kepek.tar.gz Lépjünk be a masolatok könyvtárba és nyissuk ki ide az tömörített fájlt: cd masolatok tar xvfz../kepek.tar.gz
11. Mentsük el egy fájlba a /usr/bin/ könyvtárban található fájlok listáját tulajnságaikkal együtt! 3 ls -l /usr/bin/ tee fajl lista.txt ls -l /usr/bin/ > tee fajl lista.txt 12. Kérdezzük le az aktuális könyvtárat (az elérési úttal együtt): pwd 13. Keressük ki a.jpg fájlokat a jelenlegi könyvtárakból: nd. -name *.jpg 14. Hasonlítsuk össze az orak.txt és az orak2.txt fájlokat! cmp orak.txt orak2.txt diff orak.txt orak2.txt Könyvtárszerkezet Ebben a részben áttekintjük a Linux rendszerek fontosabb könyvtárait. / : a gyökér könyvtár /bin: a linux rendszer parancsainak gyűjteménye /dev: az egyes hardver eszközök egy-egy fájlhoz vannak rendelve, ezek találhatók itt /home: a felhasználók könyvtárai /mnt: új fájlrendszer (pl. CD, pendrive, partíciók) csatlakozópontja /media: új fájlrendszer (pl. CD, pendrive, partíciók) csatlakozópontja /root: a rendszergazada felhasználó home-ja /tmp: ide kerülnek mentésre az ideiglenes fájlok /boot: a rendszertöltő illetve a betölthető rendszerek könyvtára /etc: sokféle fájl /lib: statikus és dinamikus library-k helye (máshol is van)
4 /opt: egyes programok fájljai ide települnek, nincs külön funkciója /usr: a felhasználók által használható és a telepített programok fájljainak könyvtára /sys: a rendszer könyvtára Felhasználók, csoportok, tulajnosok Linux rendszerekben elkülönül a rendszergazdai és a hagyományos felhasználói szerepkör. A rendszergazda felhasználó neve egységesen root és a mindehez joga van. A hagyományos felhasználóknak a joga korlátozott, bizonyos programokat nem is futtathatnak, illetve bizonyos állományokat nem is látnak. A Linux rendszer telepítésekor meg kell adni egy rendszergazdai jelszót. Hagyományos felhasználó létrehozásakor meg kell adni a felhasználói nevet, a teljes nevet, majd egy külön jelszót. A rendszer indításakor általában csak a hagyományos felhasználói belépéseket látjuk. Ennek az az oka, hogy a mindennapi munkát hagyományos felhasználóként el tudjuk végezni. Rendszergazdai szerepkör a hardver beállításokhoz, telepítéskehez, illetve a programok telepítéséhez szükséges. Minden fájl esetében három jogkört kell megállapítani. Első a tulajnosi jogkör, vagyis azé, aki a fájlt létrehozta. A második jogkör a csoport jogköre, vagyis ha egy felhasználó nem tulajnosa egy fájlnak, de ugyannabba csoportba tartozik, akkor bizonyos műveleteket ő is elvégezhet a fájlokon. A harmadik jogkör a mindenki más jogköre, vagyis korlátozhatjuk vagy elérhetővé tehetjük a fájlokat mások számára. Mindegyik jogkörhöz három-három műveletre adhatunk jogokat: az írásra (w), az olvasásra (r) és a futtatásra (x). Ha tekintjük pl. az otos.txt fájlt, akkor az ls -l otos.csv utasítás az alábbi sort adja vissza: -rw-rw-r--. 1 gabor gabor 172641 márc 27 20.33 otos.csv Az első vonal azt jelzi, hogy nem könyvtárról, hanem fájlról van szó (könyvtár esetén d betű állna ott, link esetén pedig l). A következő három pozíció a tulajnos jogait mutatja ez rw-, vagyis a tulajnos olvashatja és írhatja a fájlt, de nem lehet futtatni. A következő három karakter a csoport jogait mutatja, ez ugyanaz, mint a tulajnosé, az utolsó három pedig a mindenki más -ra vonatkozó jogokat jelöli, vagyis bárki számára olvasható a fájl, de nem írható és nem futtatható. A fájlhoz tartozó jogokat csak a
tulajnos vagy a rendszergazda állíthatja át. A jogok átállítása a chmod parancssal történik: chmod +x valami.sh : mindenkinek (tulajnos, csoport, mindenki) adunk futtatási jogot a shell scripthez. chmod u+w szoveg.txt : a tulajnosnak adunk írási jogot a fájlra chmod g+x valami.sh : csak a csoportnak adunk futtatási jogot chmod o-r szoveg.txt : a többiek nem láthatják a fájlt (levettük az olvasási jogot) A jogokat egy háromjegyű számmal is megadhatjuk a következőképpen: a háromjegyű szám első számjegye a tulajnosra, a második a csoportra, a harmadik pedig a többiekre vonatkozik. Az olvasási joghoz a 4-es, az írási joghoz a 2-es, a futtatási joghoz pedig a 3-as szám tartozik. Így ha valakinek (mondjuk a tulajnosnak) minden jogot meg szeretnénk adni a fájlhoz, akkor a 7-es számot kell megadni az első számjegynek. Ha mindenkinek minden jogot szeretnénk megadni a fájlhoz, akkor a chmod 777 valami.txt utasítást kell használni. A rendszergazda meg tudja változtatni a fájl vagy könyvtár tulajnosát a chown parancssal. 1. Adjunk írási jogot a többieknek a kepek könyvtárban lévő képekhez: chmod -R o+w kepek (a -R kapcsoló a rekurzív jogkiosztáshoz kell) 2. Vegyük le a többiek olvasási jogát az otos.csv fájlról: chmod -R o-r kepek A felhasználó bizonyos nyilvános adatainak kiíratása a nger parancssal történik. nger gnemeth nger hxxxxxx nger (a bejelentkezett felhasználókat listázza ki) Hasonló, de kevesebb információt nyújtó parancsa a who. who -u (kiírja, hogy ki mikor jelentkezett be utoljára) who --count (kiírja, hogy hány felhasználó van bejelentkezve) Ha kérdéses lenne, hogy egy gépnél milyen felhasználónévvel van valaki bejelentkezve, akkor hasznos parancs a whoami. 5
6 Környezeti változók A környezeti változók a rendszer által nyilvántartott változók (általában sztringek). Ilyen pl. a PATH amely a fontosabb programok elérési útvonalát tartalmazza, vagy pedig az LD LIBRARY PATH, amely az osztott könyvtárfájloknak (shared libs) illetve a statikus könyvtárfájloknak (libs) elérési útvonalait tartalmazza. Az elérési útvonalakat a : karakter válaszja el egymástól. A környezeti változók értékét ideiglenes (az att terminál ablakban) az export parancssal tudjuk megváltoztani. A környezeti változók korábbi értékére a $ karakterrel tudunk hivatkozni, pl. $PATH. További hasznos környezeti változók: HOME PWD USER USERNAME HOSTNAME
Bash programozás Változók A=15 echo $A A= alma echo $A Feltételes vezérlés #!/bin/bash if utasítás; utasításblokk; #!/bin/bash if utasítás utasításblokk; 7
8 Példa: Melyik fájl tartalmaz több sort, az orak.txt vagy az orak2.txt? SOR1=$(wc --lines orak.txt cut -d " " -f 1) SOR2=$(wc --lines orak2.txt cut -d " " -f 1) echo $SOR1 echo $SOR2 if [ $SOR1 -lt $SOR2 ] echo "Az orak2.txt tobb sort tartalmaz, mint az orak.txt" elif [ $SOR1 -gt $SOR2 ] echo "Az orak1.txt tobb sort tartalmaz, mint az orak2.txt" else echo "mindket fajl ugyanannyi sort tartalmaz" Ciklusvezérlés Többféle ciklusvezérlés létezik, most a for-ciklusra nézünk példát. Példa: Hány fájl van az egyes könyvtárakban? # Hany fajl van az egyes konyvtarakban for dir in $(ls -l grep ^d cut -d " " -f 12 ) darab=`ls -l $dir wc --lines`; echo $dir": "$darab; Példák 1. Az otos.csv fájl alapján határozzuk meg, hogy melyik számot hányszor húzták ki.
9 Megoldás: # lotto statisztika: melyik szamot hanyszor huztak # az otos.csv fajlban A 12-16. oszlopokban # vannak a lottoszamok # a.csv fajlokban a ; karakter valasztja el # egymastol az oszlopokat # a szamok tomb inicializalasa for j in {1..90} szamok[$j]=0; echo "kiertekeles folyamatban..."; for i in $(cat otos.csv cut -d ";" -f 12-16) for j in {1..5} szam= echo $i tr -d "\r\n" cut -d ";" -f $j ; szamok[$szam]=$((szamok[$szam]+1)); for j in {1..90} echo $j": "${szamok[$j]}; 2. Mósítsuk a lottó statisztikát úgy, hogy a script csak a 5 leggyakoribb számot írja ki. Megjegyezzük, hogy több szám esetében is előfordulhat, hogy a gyakorisága ugyanakkora.
10 Megoldás: # lotto statisztika: melyik szamot hanyszor huztak # az otos.csv fajlban A 12-16. oszlopokban # vannak a lottoszamok # a.csv fajlokban a ; karakter valasztja el # egymastol az oszlopokat # a szamok tomb inicializalasa for j in {1..90} szamok[$j]=0; echo "kiertekeles folyamatban..."; for i in $(cat otos.csv cut -d ";" -f 12-16) for j in {1..5} szam= echo $i tr -d "\r\n" cut -d ";" -f $j ; szamok[$szam]=$((szamok[$szam]+1)); for k in {1..5} max=0; for j in {1..90} if [ $max -lt ${szamok[$j]} ] max=${szamok[$j]}; str=""; for j in {1..90} if [ $max -eq ${szamok[$j]} ] str=$str", "$j; szamok[$j]=0; echo $k": "$str;
3. Listázzuk ki egy megatt könyvtáron (és alkönyvtárain) belül azokat a fájlokat, amelyek a múlt hónapban változtak. Megoldás (magyar nyelvű linux esetén): 11 honap=(jan feb márc ápr máj jún júl aug szep okt nov dec) most=date +"%m" ; elozo=$((most-1)); for i in $(nd $1) str=ls -l $i ; if [ $(echo $str cut -d " " -f 6 ) == ${honap[$((elozo-1))]} ] f=$(echo $str cut -d " " -f 9); echo $f; 4. Melyek a bejelentkezett felhasználó legrégebben indított processzei? Megoldás: lista= ps -ef grep ^$USER tr " " "+" ; min=date +"%H:M" ; for i in $lista str=$(echo $i tr "+" " "); start time=$(echo $str cut -d " " -f 5); if [[ $min > $start time ]] min=$start time; for i in $lista str=$(echo $i tr "+" " "); start time=$(echo $str cut -d " " -f 5); if [[ $min == $start time ]] echo $str cut -d " " -f 8