Hirdetés




Hirdetés

Terminal és Unix V.

MOZGATUNK VAGY MÁSOLUNK?

Az elmúlt részek során igazán sokfajta fájlműveletet megismertünk, de a kép még korántsem teljes.

Fájlokat átnevezni az mv (move) parancscsal lehet. Két változat van, az egyik esetben megadjuk a fájl nevét és az új nevet:
mv fajlnev ujnev
a másik változatban pedig egy könyvtárnevet adunk meg, ahová "átmozgatjuk" a fájlt:
mv fajlneve konyvtarnev
Az utóbbi esetben a második operandus egy létező könyvtár neve kell, hogy legyen.

A neveket megadhatjuk abszolút, vagy relatív útvonal megadással is (lásd a cikk 3. részét, amelyet a neten is megtalálsz!).

Ahogy már korábban is említettem, figyelni kell a nevek megadására. Az mv parancs rákérdezés nélkül felülírja az "ujnev" nevű fájlt, ha az már létezik, így annak eredeti tartalma már nem lesz visszaállítható. A
mv *.jpg kepek
parancs az összes JPG kiterjesztésű fájlt átmozgatja a kepek nevű könyvtárba. A csillag karakterrel, az úgynevezett helyettesítő karakterrel már korábban találkoztunk.

Helyébe bármilyen karaktersorozatot képzelhetünk.

Megjegyzés: Érdemes megjegyezni, hogy ha közben ugyanazon a partíción maradunk, akkor a fájl elhelyezkedése fizikailag nem változik meg a diszken, csak az elérési útvonal lesz más. Ezért van az, hogy nagy méretű fájlok "mozgatása" is pillanatok alatt megtörténik.

A cp (copy) parancs annyiban különbözik az előzőtől, hogy fizikailag is készít egy másolatot. A fájl az eredeti nevén és az új néven is elérhető lesz. Ugyanaz a két alapváltozata van, mint az előbbi parancsnak.

A
cp A* Documents
parancs az összes A-betűvel kezdődő fájlról készít egy másolatot a Documents nevű könyvtárba. A
cp egyik/* masik
parancs az "egyik" könyvtárból minden fájlt átmásol a "masik" könyvtárba. Ha az "egyik" könyvtár alkönyvtárakat is tartalmaz, azok nem lesznek így átmásolva. A jól ismert -R opció ezt is megoldja, a
cp -R egyik/* masik
parancs már az "egyik" könyvtár teljes tartalmát átmásolja a "másik" könyvtárba, feltéve ugye, hogy van hozzá jogosultságunk.

A PARANCSSORI SPOTLIGHT

A legsokoldalúbb unix parancsok egyikével ismerkedünk most meg és közben felelevenítünk néhány korábban tanult fontos jelölést is. A "find" annyit tesz angolul, hogy megtalál. Nézzük meg mire juthatunk a segítségével, bátran próbáljuk ki a következő parancsokat:
find ~ -name "*.txt"
Megtalálja a saját könyvtárunkban az összes olyan fájlt, amelyik végződése: txt.

Az "*alma*" opció hatására az összes olyan nevet keresné, amiben szerepel az alma szó. A
find . -name "*.txt"
változat az aktuális könyvtárban és annak alkönyvtáraiban keres, a
find / -name "*.txt"
pedig az egész fájlrendszert végignézi a txt-vegű fájlok keresése érdekében. Nagyobb rendszerek esetében ez kicsit hoszszabb ideig is eltarthat, ugyanis a find valós idejű keresést végez, nem használ adatbázist, nem indexel, ugyanakkor mindig az aktuális eredményt szolgáltatja.

Megjegyzés: gyorsabb eredményt kaphatunk a "locate" paranccsal, ami viszont a legfrisebb fájlokat nem biztos, hogy megtalálja (> man locate).

find . -empty
Megkeresi az üres fájlokat az aktuális könyvtártól kezdve.

find ~ -newer valami.fajl
Megtalálja a "valami.fajl"-nál újabb állományokat a saját tárterületünkön.

find / -mmin -10
Megtalálja azokat a fájlokat a rendszeren, amik 10 percen belül módosítva lettek.

Tessék vigyázni, a helyzet melegszik!
find . -name "*.sh" -exec chmod a+x {} \;
Az aktuális könyvtártól lefelé megkeresi az összes sh kiterjesztésű fájlt és beállítja a mindenkire vonatkozó futtatási jogot mindegyikre.

find /Users/Valaki/Sites -name "*.txt" -exec cat {} \;
A Valaki felhasználó Sites folderétől kezdve megkeresi az összes txt végződésű fájlt és kilistázza azokat. Átirányítással ( > ) akár egyetlen text fájlba is összefűzhetjük őket!

És most tessék vigyázni!
find / -name "*torolheto*" -delete
Megkeresi a rendszerben az összes olyan fájlt aminek a neve tartalmazza a "torolheto" szót és rögtön ki is törli azokat amennyiben a find parancsot futtató felhasználónak jogosultsága van ehhez!

És ez csak egy kis ízelítő volt a find parancs által nyújtott lehetőségek széles tárházából! Lehet finnyáskodni, hogy a Spotlight az a fájlok belsejében is tud keresni. Nos, erre is van megoldás a unixban is.

Nézzünk be például a /Library/Documentation/Services/apache könyvtárba (cd parancs), ahol jónéhány szöveges fájl található. A
grep web configuring.html.en
parancs a configuring.html.en fájlban megkeresi azokat a sorokat, ahol a "web" karaktersorozat található.



Látható, hogy nem egy szóra keresünk rá, hanem egy karaktersorozatra, ami akár egy szó része is lehet.

Ha a fájlnév helyett a csillag helyettesítő karaktert alkalmazzuk, akkor már sokkal több találatunk lesz, mivel a program az aktuális könyvtárban található összes fájlt végignézi: grep web *

Kattints rá! A parancs ekkor kiírja az összes találatot: a fájl nevét és azt a sort, ahol a keresett karakterlánc található.

Tovább növekedhet a találatok száma, ha még a -R opciót is megadjuk, mivel ekkor a keresést az aktuális könyvtártól lefelé az összes alkönyvtárban is elvégzi:
grep web -R *
Ha a karakterlánc több szóból áll, akkor idézőjelek közé kell tenni, a
grep "Apache web server" *
parancs megtalálja az aktuális könyvtárban szereplő fájlokban azokat a sorokat, emelyek a zárójelben látható karaktersorozatot tartalmazzák.

A reguláris kifejezések használatával nagyon hatékony kerésésekre van lehetőség.

Például a
grep [0-9] configuring.html.en
parancs hatására megkapjuk a fenti fájl azon sorait, amelyikben szám karakter szerepel.

A szögletes zárójelen belül megadtuk a keresett karakterek egy tartományát.

Fel is sorolhattuk volna 0-tól 9-ig a számjegyeket, de így nyílván rövidebb. A [39] reguláris kifejezést használva azokat a sorokat tudnánk megkeresni, amelyekben a 3-as, vagy a 9-es karakter szerepel. A reguláris kifejezések iránt érdeklődők számára ajánlom például a következő oldalt: http://www.regular-expressions.info Akik gyakran használják a grep parancsot hasznos segítséget jelenthet a grep parancs két változata: az fgrep és a cgrep (lásd. man page).

CSÖVEZÜNK VAGY PIPÁZUNK?

A pipe ige angolul annyit tesz, hogy "csövön át továbbít". Ezt nem nehéz elképzelni, de hogy ennek a technológiának a segítségével a unix mi mindenre képes, az még több éves gyakorlattal rendelkezőknek is tud meglepetést okozni. Nézzünk először egy egyszerű példát. Korábban láttuk, hogy a ps parancs kilistázza az aktuálisan futó processzeket. Előfordulhat, hogy ez a lista akár több képernyőoldalt is betölt és ha meg kell találni benne egy adott processzt, az nem is olyan könnyű feladat. Például a Safari beragadt, és szeretnénk a kill paranccsal kilőni. Ehhez szükségünk van a processz azonosítóra (emlékeztetnék a cikksorozat 2. részében elmondottakra - amely szintén megtalálható a neten), ez a ps lista első oszlopában szerepel. Ilyenkor a ps parancs eredményét bevezetjük egy képzeletbeli csőbe és az onnan kilépő sorokat a grep paranccsal megvizsgáljuk, és csak azt a sort, vagy azokat a a sorokat íratjuk ki, amikben a Safari szó szerepel. Elmondani sokkal bonyolultabb, mint megvalósítani:
ps -ax | grep Safari

Kattints rá!Az eredmény valami hasonló lesz, mint a képen. Általában két processzt kapunk, az egyik a Safari program, a másik pedig a "Safari" karaktersorozatot kereső grep parancs.

A megvalósításhoz pedig mindössze annyit kellett tenni, hogy a ps, illetve a grep parancsot összekapcsoltuk a pipe jellel (|). Ennek eredményeképpen a ps parancs eredménye nem jelent meg a képernyőn, hanem át lett irányítva a csővezeték segítségével a grep parancs számára, mintha az egy fájlt olvasna, és abban keresgélne.

Nagyon egyszerűen megszámolhatjuk, hogy éppen hány futó processzünk van. A ps parancs eredményét most a wc parancs számára kell átvezetnünk, és az rögtön megszámolja a beérkező sorok számát:
ps -x | wc -l

Megjegyzés: bár a fenti példában a két függőleges vonal karakter nagyon hasonló, mégsem ugyanaz. Az első a pipe jel, ami általában a jobb oldali shift billentyű felett található a billentyűzeten, a második pedig a line szó kezdőbetűje, tehát egy l-betű.

Kattints rá!Az első cikkben mutattam egy példát ami akkor még talán meglepő és egyben megdöbbentő is lehetett azok számára, akik először találkoztak hasonlóval (kép). Ebből látható, hogy a csövezetékek egész hálózatát lehet felépíteni, így szinte röptében lehetséges unix parancsok sorozatát elvégezni egymás után, úgy hogy az előző eredményét rögtön átvezetjük a következő parancs bemeneteként és máris elvégezzük rajta a következő műveletet.

A "cat" paranccsal fájlokat listázhatunk.

A csillag karakter helyettesítő karakter, tehát az összes a-betűvel kezdődő fájlt kilistázzuk és elvégezzük rajtuk a következő parancsokat.

Az "awk" egy nagyon sok mindent tudó folyamatkezelő parancs, amelyik lehetővé teszi a sorok egyes részleteinek keresését, átrendezését, azokon végzett összetett műveletek elvégzését. Itt éppen kiválasztja a bemenetére érkező sorok második szavát és csak azt továbbítja a következő parancs bemenetére.

A "sed" egy folyamat szövegszerkesztő, ami úgy működik, hogy a rajta áthaladó sorokon elvégzi a kijelölt műveleteket. A reguláris kifejezések segítségével most a sed program kiválasztja a nem betű karaktereket és törli azokat (kicseréli az üres karakterrel), csak a maradék karaktereket továbbítja.

A "tr" parancs egyszerűen a kis betűket a megfelelő nagybetűre változtatja a rajta áthaladó karakterfolyamon. Itt is láthatjuk a reguláris kifejezések használatát.

A "sort" parancs hatása a nevéből is kitalálható, képes ABC sorrendbe rendezni a rajta áthaladó szavakat.

A "uniq" parancs figyeli, hogy van-e ismétlődés az egymást követő sorok között, és ha igen, akkor csak egyet hagy meg belőlük.

Végül ismét a cat parancs kapja meg az eddigi műveletek eredményét, de mivel itt az "n" opcióval hívjuk meg, ezért úgy írja ki a sorokat, hogy mindegyiket egy sorszámmal látja el.

Ugye már mondanom sem kell, hogy a "man awk", "man sed", "man tr", "man sort" és a "man unique" parancsok sok további érdekességet elárulnak.

Ez a példa egyszerre tanulságos és motiváló.

Kellő gyakorlással bárki össze tud állítani hozzá hasonló kis erőműveket, amihez persze még sok gyakorlásra és a unix parancsok kellő ismeretére van szükség.

Érdemes az Interneten körülnézni, rengeteg hasznos oldalt lehet találni. Mindenképpen javaslom a http://www.osxfaq.com oldalon a RESOURCES/Tutorials link alatti OS X | Unix leckék tanulmányozását. Ennek kétségtelen előnye, hogy az OS X-re van kiélezve. Már a bevezetőben is láttuk, hogy a unix-nak nagyon sok változata, megvalósítása létezik, még az OS X különböző verziói is tartalmaznak eltéréséket. Ezért nagyon fontos, hogyha valahol találunk bizonyos problémára üdvözítő megoldást, mindig meg kell győződni arról, hogy az a mi rendszerünkre alkalmazható-e, ott ugyanúgy működik vagy nem. Kísérletezésre nagyon hasznos a korábbiakban sokat használt teszt felhasználó.

Végezetül, egy olyan területre barangolunk, ahol a teszt felhasználó korlátaiba ütközünk.

A REJTETT LEHETŐSÉGEK

Igaz, még a Jaguár korszakból, de kerültem olyan szituációba, hogy az Apple menü Software update ... opciója besokalt. Kiírta ugyan, hogy van új verzió, amit lehetne telepíteni, de hiába kértem, hogy tegye is azt meg, nem történt semmi. Az ilyenkor szokásos varázslatok (Permission repair, Parameter reset, .... ) egyike sem segített. Végül a Terminál programban a softwareupdate parancs segítségével sikerült telepíteni az operációs rendszer újabb verzióját, és azután már az Apple menüből is működtek ismét a későbbi frissítések. A
softwareupdate -l
parancs kilistázza a potenciális frissitéseket.

A
softwareupdate -i iCal-9.1.2
parancs pedig telepíti az iCal program 9. generációjának legfrissebb verzióját! Nos, itt azért van egy kis csapda.

Mégpedig, az, hogy az install opció root jogosultságokat igényel! Anélkül futtatva csak egy hibaüzenetet kapunk: "Must be run as root", azaz super userként kell futtatnunk! Eddig mindig azt hangsúlyoztam, hogy használjuk a teszt felhasználót gyakorlásként, akinek nincsenek adminisztrátori jogosultságai. Most már elég tapasztalatunk van ahhoz, hogy kellő körültekintéssel más felhasználók területén is használjuk a Terminál parancsait. Hamarosan mutatok két lehetőséget is arra, hogyan tudjuk végrehajtani a fenti parancsot.

Érdemes előtte tisztázni, hogy mi a különbség az admin és a root jogosultságok között. Már tudjuk, hogy a Mac OS telepítésekor létrehozunk egy felhasználót, akinek alapértelmezés szerint admin jogosultságai vannak. Ez alapvetően elegendő a legtöbb adminisztrációs feladat elvégzéséhez.

Láttuk, hogy a unix széleskörűen szabályozza a felhasználói jogosultságokat. Eredetileg a unix-ban vannak felhasználók és és van egy kiemelt felhasználó, akit super user-nek, vagy root-nak neveznek. Ez utóbbinak gyakorlatilag mindenhez van jogosultsága.

Az Apple biztonsági szempontok alapján a rendszer telepítésekor nem aktivizálja a root felhasználót, helyette ad admin jogosultságot egy, vagy több felhasználónak.

Bizonyos feladatok elvégzéséhez, azonban root jogosultságra van szükség. Ezt kétféleképpen is elérhetjük. Ideiglenesen egy rövid időre, vagy úgy, hogy aktivizáljuk a root usert.

Ideiglenesen root jogosultságokhoz juthatunk a sudo parancs segítségével.

Nézzük először a sudo parancsot a megszokott teszt felhasználó területén:
teszt: sudo softwareupdate -i iCal-9.1.2
erre bizony egy figyelmeztető hibajelzést kapunk: "teszt not in the sudoers file. This incident will be reported." Egy olyan felhasználó akart root jogosultságot szerezni, akinek erre nincs felhatalmazása, ezért erről az eseményről egy feljegyzés készül a logfájlokban. Ez akár egy támadási kisérletnek a jele is lehet, a rendszeradminisztrátor feladata ennek az eldöntése.

Az, hogy ki használhatja a sudo parancsot, nagyon finoman szabályozható. Érdemes belenézni a /etc könyvtárban levő sudoers nevű fájlba. Az
ls -l /etc/sudoers
-r--r----- 1 root wheel 629 Mar 21 2005 /etc/sudoers

parancs segítségével láthatjuk, hogy ennek a fájlnak a tulajdonosa a root felhasználó, és csak ő, illetve a wheel nevű, rendszerszintű csoport tagjai olvashatják.

Egyetlen reményünk, hogy belenézhessünk ebbe a fájlba az, ha az eredeti felhasználó rendelkezik elegendő jogosultsággal ahhoz, hogy használja a sudo parancsot. És valóban, az admin jogosultsággal rendelkező felhasználók alapértelmezésben jogosultak erre, próbáljuk ki a
sudo cat /etc/sudoers
parancsot egy admin felhasználó területéről.

Ismét egy kis meglepetés ér minket, mert egy jelszót kér a rendszer.

Vajon milyen jelszót kell itt megadni? Bármilyen meglepő is, az admin jogosultsággal rendelkező felhasználó jelszavát kell megadni. Tehát a rendszer meggyőződik arról, hogy aki ideiglenesen root jogosultságot szeretne szerezni, az tényleg az a felhasználó, akinek a területén vagyunk, és nem engedi, hogy akárki, aki éppen arra téved és meglátja a nyitott Terminál ablakot, root jogosultságot szerezzen. Ehhez ismerni kell az admin jelszót. Ezután egy rövid ideig többször is kiadhatjuk a sudo parancsot, de ha később tesszük ugyanezt, akkor ismét kéri az admin jelszónkat a rendszer. Most már a
sudo softwareupdate -i iCal-9.1.2
parancs is működni fog (feltéve, hogy létezik a megadott szoftverfrissítés!).

Amennyiben gyakran, illetve sok mindent szeretnénk root jogosultsággal elvégezni, akkor fárasztó lehet mindig a sudo parancsot használni. Ekkor érdemes lehet a root felhasználót aktivizálni. Az Apple biztonsági megfontolások alapján ezt nagyon nem javasolja, de ha biztosan tudja valaki, hogy erre van szüksége, akkor az Applications/ Utlities folderben levő Netinfo Manager programot elindítva a Security menüben aktivizálhatja a root felhasználót azzal, hogy jelszót ad neki.

Ezután a Terminál programban elég annyit beírni, (egy admin felhasználó területén) hogy
su -
megadni az imént megadott jelszót és máris root felhasználóként szárnyalhatunk a rendszerünkben. Csodálatos a szabadság érzése, most gyakorlatilag mindent szabad, törölhetünk, módosíthatunk kedvünkre, amit csak akarunk! Ezt a változatot azonban kimondottan csakis akkor használjuk, amikor már kellő jártasságot szereztünk a Terminál és a unix használatában, és biztosak vagyunk abban is, hogy illetéktelenek nem fognak beletúrni a rendszerünkbe miközben éppen halaszthatatlan ügyünket végezzük egy másik helyiségben ...

Természetesen ugyanott, ahol bekapcsoltuk, a root felhasználó ki is kapcsolható, és azzal visszaáll az eredeti biztonsági szint.

Major Zoli
zoli@mac.com


A lap tetejére


Alkalmazás cikkeink 2006-ban