| |
|
 |
|
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 *
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
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ű.
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
|
|
 |
Alkalmazás cikkeink 2006-ban |
|