[[oktatas:linux|< Linux]] ====== Linux parancssor ====== * **Szerző:** Sallai András * Copyright (c) 2009, Sallai András * Szerkesztve: 2009-2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== Ez az írás a Linux alapú számítógépes operációs rendszerek parancssori lehetőségeinek bemutatásával foglalkozik. Az ismertetésre kerülő parancsok nagy része, bármely unix alapú rendszeren használható. A parancsok kidolgozása **Debian GNU/Linuxon** történt. A gyakorláshoz szükséged lesz egy Linuxra. Néhány Linuxot megtalálsz az alábbi helyeken online futtatva, de egyik sem Debian. Van köztük egyszerű parancssoros felület, ami tulajdonképpen csak egy Unix parancssor, és van köztük grafikus felület. * http://s-macke.github.io/jor1k/ * https://bellard.org/jslinux/ * http://jslinux.org/ * https://copy.sh/v86/ Ez a Linux egy JavaScriptben írt számítógép-emulátoron fut. Előrelépést jelenthet, ha letöltesz egy Live CD/Live DVD képfájlt. Ehhez a [[http://hu.wikipedia.org/wiki/Knoppix|Knoppix]] vagy a [[http://hu.wikipedia.org/wiki/Linux_Mint|Linux Mint]] rendszert ajánlom. Ki kell írnod egy DVD-re a letöltött képfájlt, majd indítsd a rendszert a DVD-ről. A DVD-ről induló rendszert -- amely telepítés nélkül használható -- Live rendszernek nevezzük. A Live rendszer nem bántja a merevlemezre telepített rendszered. A Live rendszeren mentett állományaid viszont nem maradnak meg, hacsaknem pendrive-ra mentesz. A harmadik lehetőség, hogy telepítesz egy Linuxot. Ha számítógépen, ahova telepíteni szeretnéd a Linuxot már van egy rendszer, akkor ajánlom, hogy először egy [[http://hu.wikipedia.org/wiki/Virtu%C3%A1lis_sz%C3%A1m%C3%ADt%C3%B3g%C3%A9p|virtuális számítógépre]] telepíts Linuxot. Ide már mehet például a [[http://debian.org|Debian GNU/Linux]] Ha már nem okoz gondot a particionálás a telepítőben, vagy egy üres merevlemez áll rendelkezésedre, vagy az adatok nem számítanak az adott gépen, telepítsd fel saját Linuxodat. A leírásokban nem használok fájlkezelő programot, csak tisztán parancssort. Fájlkezelő ugyan van, de előbb tanuljunk meg dolgozni fájlkezelő nélkül. Így bármely unixon és Linuxon boldogulni fogunk. Gyakorolj! "Nem kell sokat, csak csináld". ===== Azonosítás ===== ==== Belépés ==== A Linux indulása után várja, hogy bejelentkezzünk. Ehhez egy várakozási jelet jelenít meg: login: A login után kell beírnunk a felhasználónevünket. login: joska Ha a rendszerben a felhasználónevünk joska, akkor azt a login: után beírjuk. Egy leütésével tudatjuk a rendszerrel, hogy végeztünk a bevitellel. A felhasználónév beírása után a password: várakozási jelet látjuk, amely a jelszavunk beírására szólít fel: password: A jelszó gépelésénél a képernyőn nem jelenek meg a begépelt karakterek. ==== Jelszó megváltoztatása ==== Ha kapunk egy rendszerhez hozzáférést, akkor az első dolgunk szokott lenni a jelszó megváltoztatása. Ezt a "passwd" parancs kiadásával tudjuk megtenni: passwd A felhasználó a passwd paranccsal megváltoztathatja saját jelszavát. A parancs először bekéri a jelenlegi jelszót, majd kétszer az új jelszót. Rendszergazdaként, azaz a root felhasználóval mások jelszavát is megváltoztathatjuk. Ehhez adjuk meg a kívánt felhasználónevet a passwd parancs paramétereként. A Linuxos rendszer úgy van összeállítva, hogy a rendszergazda nem tudja megmondani számodra a jelszavadat, ha már megváltoztattad. Ha elveszett, akkor legfeljebb újat tud adni. ==== A joska felhasználó jelszavának megváltoztatása ==== Ha te magad is rendszergazda vagy a Linuxban, mert mondjuk most telepítetted, akkor például a joska felhasználónak a következő módon tudod megváltoztatni a jelszavát: passwd joska Ez a parancs persze csak rendszergazdaként belépve fog sikerülni, vagy ha te vagy a joska felhasználó. ==== Kijelentkezés ==== Ha valahova bejelentkeztünk, akkor ki is kell tudnunk jönni onnan. Nézzük, hogyan lehet szabályosan kijelentkezni a rendszerből. A rendszerből kijelentkezni a logout paranccsal lehetséges: logout A kijelentkezés további parancsokkal is lehetséges. Az egyik az **exit** parancs, a másik egy billentyűkombináció: **Ctrl+D**. Az exit és logout között az a különbség, ha vannak félretett munkák (jobok), akkor az exit nem lép ki. A logout mindenképpen kilép. A linuxos rendszerekben a Ctrl+D billentyűkombináció fájlvége jel küldésére is használatos néhány parancs illetve, program esetén. Ha ilyen programmal dolgozunk, előfordulhat, hogy csak fájlvége jelet akartunk küldeni, de véletlenül kétszer nyomtuk meg a Ctrl-D billentyűkombinációt, így azonnal ki is jelentkeztünk. Egy Linuxos rendszeren ha grafikus felületet is telepítettünk, akkor lehetőség van a grafikus bejelentkezésre is, de mi most csak parancssorral foglalkozunk ebben a részben. ==== Megjegyzés ==== // Ha valaki feltelepítette a grafikus felületet és szeretne parancssorra átkapcsolni, a következőket kell tudnia: // // Egy linuxos rendszer alapértelmezetten 6 azaz hat darab karakteres felületen ad belépési lehetőségeket. Ezek neve: teletype, vagy röviden csak tty. Vagyis van hat darab teletype-unk, amelyek 1-től 6-ig vannak számozva. Indulás után az tty1-en vagyunk. A többi teletype-t az F2, F3, stb. funkcióbillentyűkkel érhetjük el, egészen F6-ig, a lenyomott "Alt" billentyű mellett. A második tty tehát ezzel a billentyűkombinációval érhető el: Alt+F2. A harmadik: Alt+F3, stb. // // A Linuxos rendszerek lehetővé teszik ugyancsak hat darab grafikus felülete indítását is. Ebből általában egyet használ mindenki. A grafikus felületet indítható karakteres felületen belépés után, vagy automatikusan indul ha telepítve van egy megjelenítéskezelő (XDM, KDM vagy GDM). // // Karakteres felületről grafikus felületre váltás Alt+F7 billentyűkombinációval valósítható meg. Ha grafikus felületről karakteresre szeretnénk váltani, akkor szükséges egy Ctrl billentyű is. A tty1, karakteres felület grafikus felületről tehát így kapcsolható: Ctrl+Alt+F1. Ugyanígy érjük el a többit is. Persze ha már karakteres felületen vagyunk, akkor elég az Alt billentyű. // // Ha karakteres felületen dolgozunk, ezt szokták konzolnak hívni. Ha távolról jelentkezünk be vagy grafikus felületről indítunk egy parancssoros felületet, akkor terminálról beszélünk. // //A grafikus felületen, egy ablakban indított parancssoros programokat virtuális terminálnak hívjuk. Ebből végtelen sokat indíthatunk (a memória határáig). // //Ha GNOME grafikus környezetet telepítettünk, akkor a virtuális terminálunk lehet rendszergazdai és felhasználói. Elérésük:// * //Alkalmazások -> Kellékek -> Terminál// * //Alkalmazások -> Kellékek -> Rendszergazda terminál// ==== Gyakorlat ==== * Mit vár a rendszer, ha a következőt írja: login: * Milyen paranccsal tudjuk megváltoztatni a jelszavunkat? * Milyen utasításokkal léphetünk ki a rendszerből? * Ha van grafikus felület telepítve, hogyan tudunk konzolos felületre váltani? * Milyen grafikus bejelentkezési felületek vannak? * Hogyan tudunk egy újabb felületen bejelentkezni konzolt használva? * A linuxos rendszergazda ki tudja deríteni a felhasználók jelszavát? * Hány darab konzolos felület áll rendelkezésre? * Töltsön le egy linuxos Live CD-ét * Például Knoppix * Derítse ki, milyen felhasználónévvel lehet belépni a rendszerbe ===== Várakozási jel ===== ==== A várakozási jelről ==== A sikeres felhasználói azonosítás után a Linux parancsot vár. Ezt egy várakozási jellel adja értésünkre. A várakozási jel felhasználók és rendszergazdák számára is más. A felhasználók számára egy dollárjelet ($) jelenít meg a rendszer, a rendszergazdának pedig egy kettős-keresztet (#). A várakozási jel ki van bővítve némi információval. Tartalmazza a bejelentkezett felhasználónevet, a gép nevét és az aktuális könyvtárat. joska@iskolazo:~$ ==== Felhasználó várakozási jele ==== joska@iskolazo:~$ Ez a fajta várakozási jel a Debian GNU/Linuxra jellemző, de általában hasonló a többi linuxos rendszerben is. A felhasználónevet egy szeparátor követi (@). A gépnevet szintén, amely egy kettőspont (:). A kettőspont után egy tilde karakter (~) látható, amely a felhasználó saját könyvtárát jelképezi. A joska felhasználó esetében ez a /home/joska. A parancsokat a Bash nevű parancsértelmező várja, amelyre a dollárjel is utal. ==== Root felhasználó promptja ==== A root felhasználónak az alapértelmezett várakozási jele eltérő. A várakozási jelben az utolsó karakter egy kettős kereszt ("#"). root@iskolazo:~# A rendszergazda, azaz root felhasználó is a bash parancsértelmezőt használja, viszont ő a rendszer teljes jogú felhasználója. Éppen ezért ne használjuk felhasználói feladatokra. Csak akkor használjuk ezt a hozzáférést, ha valóban szükség van a rendszergazdai jogokra. ==== A PS1 ==== Minden operációs rendszer úgynevezett változókban tárol információkat a programok számára. Mivel ezek a változók a programok környezetéből elérhetők, környezeti változóknak is hívjuk őket. A PS1 is egy ilyen környezeti változó. Bármely környezeti változónak a tartalmát megtekinthetjük az echo parancs segítségével. Ilyenkor a környezeti változó neve elé egy dollárjelet kell írni: $PS1. Az echo paranccsal ekkor így jeleníthetjük meg: echo $PS1 ==== Gyakorlat ==== * Mit jelent a várakozási jel? * Debian GNU/Linux rendszeren mi a felhasználók alapértelmezett várakozási jele? * Mit jelent a várakozási jelben a "~" karakter? * A Debian GNU/Linux rendszerben mi a root felhasználó alapértelmezett várakozási jele? * Milyen környezeti változó tartalmazza a várakozási jel beállításait? * Hogyan épül fel a Debian GNU/Linux felhasználói várakozási jel? ===== Környezeti változók ===== Minden operációs rendszerben léteznek úgynevezett környezeti változók. Ezek az operációs rendszerről vagy programjainkról tárolnak információkat. A környezeti változók a rendszer indulása után automatikusan beállításra kerülnek. A környezeti változók megtekintése: printenv Paraméter nélkül az összes környezeti változót kiírja, amelynek van értéke. Megadhatjuk melyik változót szeretnénk: printenv PATH vagy printenv HOME vagy printenv SHELL A **set** paranccsal vigyáznunk kell, mert Shellenként másként viselkedik. Ráadásul az alapértelmezetten futó Bash parancsértelmezőben egészen mást csinál paraméterezve, minta mondjuk a csh, vagy ksh környezetben. A set parancs önmagában kiadva, mindenesetre kiírja a környezeti változókat, de a különféle parancsértelmezők esetén más, más kimenetet kapunk: set A kimenet általában túl fut a képernyőn. A kimenetet képernyőoldalakra tördelhetjük a less paranccsal: set | less A grep parancs segítségével, megmondhatjuk, hogy csak azokat a sorokat szeretném látni, ahol szerepel, például a PATH szó: set | grep PATH Beállítható saját változó is: export TEST_VAR=hello Nézzük meg az eredményt: set | grep TEST_VAR vagy: printenv A változó megszüntetése: unset TEST_VAR Érdekes, hogy a Bash esetén a set másként működik a többi parancsértelmezővel szemben, az unset viszont ugyanazt csinálja. Az unset bármely paraméterként megadott változót megszüntet. Próbáljuk ki a fenti parancsokat. Egy változót beállíthatunk az export parancs nélkül is. Így is beállítható a TEST_VAR változó: TEST_VAR=hello Akkor mi a különbség? Ha használom az export parancsot, akkor az aktuális parancssorból indított folyamatok is látni fogják a TEST_VAR változót. Ha nem használom az export parancsot, akkor ezek a folyamatok nem látják. Próbáljuk ki: BARAT_VAR=Feri Ellenőrizzük, hogy létezik-e a változó: echo $BARAT_VAR Létezik, műküdik. Most indítsunk egy másik terminált. Lehet xterm vagy mate-termianl, vagy ami rendelkezésünkre áll: xterm Nézzük meg ebben a terminálban a BARAT_VAR változó tartalmát: echo $BARAT_VAR Semmi. Most lépjünk ki az új terminálból, majd futtassuk a parancsot újra, de most az export paranccsal: export BARAT_VAR=Feri Indítsunk egy xterm terminált: xterm Majd ebben a terminálban nézzük meg a változónkat: echo $BARAT_VAR Itt is látszik a tartalma. Saját rendszer szintű környezeti változók bevezetése a /etc/environment állományban lehetséges. Az állomány alapértelmezetten üres. Vegyük fel a következő sorokat: Z1=első Z2=második Egy sor egy változó. Indítsuk újra a rendszert, majd a set paranccsal írassuk ki az összes változót: set Az /etc/environment fájlban létrehozott változók még grafikus felületen is érvényesek. A PATH változó esetén, ügyelni kell arra, hogy felülírja a változót. A PATH változó egész tartalmát itt meg kell adni: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin Néhány leírás szerint a **setenv** parancs is használható a változók beállítására, de ez csak a **csh** parancsértelmezőben áll rendelkezésre. ==== env ==== Az env parancsot arra használhatjuk, hogy egy parancsot módosított környezetben futtassunk. Paraméter nélkül kiírja a környezeti változókat. env ==== A Bash set parancsa ==== Mint fentebb már írtam a set parancs másként viselkedik a különböző parancsértelmezők esetén. A Bash set parancsa a Bash számára állít be pozíció szerinti paramétereket, úgy mint * $1, $2, $3 Legyen a GYUMOLCS változó, értéke alma: set GYUMOLCS=alma Értékét így tudjuk kiolvasni: echo $1 Ha több paramétert is szeretnénk megadni: set alma körte barack echo $1 alma echo $2 körte echo $3 barack A pozíciónális paraméterekből bármikor lekérhetők az értékek. ===== A PS1 környezeti változó tartalma ===== ==== echo ==== A PS1 környezeti változó megismerése előtt nézzük meg az echo parancs használatát. Az echo egy szöveget ír a képernyőre. echo "Helló Világ!" Az echo a szöveg végén egy sortörést is a képernyőre küld, amiről lebeszélhető a -n kapcsolóval. echo -n "Helló Világ!" Különleges karakterek is engedélyezhetők a -e kapcsolóval: echo -e "Helló\nVilág!" Vegyük észre ez utóbbi példánkban a "\n" különleges karaktereket. Ez például sortörést jelet küld a képernyőre. Különleges karakterek táblázata: ^ Karakter ^ Jelentés ^ | \a | csengőhang konzolos felületen | | \b | egy karakter törlése visszafele | | \n | sortörés | | \r | kocsi vissza | | \c | nem ír ki újsor karaktert | | \t | vízszintes tabulátor | | \v | függőleges tabulátor | | \\ | backslash | | \nnn | a karakter ASCII kódja nnn (oktálisan) | Az echo parancsot úgy is használhatjuk, mint egy ls. Az összes .txt kiterjesztésű állomány megjelenítése: echo *.txt Az echo parancsnak két változatát használhatjuk. Az egyik: * a parancsértelmező beépített parancsa * külső parancs Figyeljük meg a type echo kimenetét: $ type echo echo egy beépített parancs Alapból tehát ezt használjuk. Ha mégis a külső parancsot szeretnénk hasznáni meg kell adnunk a teljes útvonalat: /bin/echo ==== A PS1 tartalma ==== Fentebb már láttuk, hogy a PS1 környezeti változó tartalmát így tudjuk megnézni: echo $PS1 Azt is láttuk, hogy a várakozási jel ki van egészítve felhasználó- és gépnévvel, azt követően pedig az aktuális könyvtárral. A PS1 környezeti változóban van leírva ez a forma. Ha megnézzük a fenti parancs eredményét, akkor ehhez hasonlót kell látnunk Debian GNU/Linux 6, 7 és 8 verzió esetén: Konzolon: ${debian_chroot:+($debian_chroot)}\u@\h:\w\$ Ha grafikus felületen indítottunk egy virtuális terminált, akkor ez egy kicsit másként néz ki: \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ Ezek a beállítások biztosítják a várakozási jel fentiek szerinti megjelenítését. ==== X terminál színezése ==== Természetesen megadhatunk más beállításokat is. A környezeti változókat mindig az export paranccsal szokás beállítani, mert ez teszi lehetővé, hogy más folyamatok indítása után is érvényes legyen a beállítás. Az alábbi beállítás a terminál színezését mutatja be: export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;34m\]\u@\h\[\033[00m\]:\w\$ ' Vegyük észre, hogy az export parancs után írt PS1 környezeti változó elé nem írtunk "$" karaktert. Fentebb említettük, hogy erre csak akkor van szükség ha hivatkozunk rá, tehát példának okárét kiíratjuk azt. ==== Egyszerű prompt ==== A fenti prompt nagyon hosszú tud lenni ha van egy nagyon hosszú könyvtárútvonalunk. Ilyenkor beállíthatunk egy egyszerű várakozási jelet, amely csak egy dollárjelet meg egy szóközt jelenít meg: export PS1="$ " Akkor használjuk, ha az útvonal nagyon hosszú szeretnénk egy egyszerű várakozási jelet. Ezek a beállítások persze nem véglegesek, újraindítás vagy ki-, és bejelentkezés után a környezeti változó tartalma eredetire visszaáll. Ez a várakozás jel újraindítás után azonban nem érvényes. Ha újraindítás után is szeretnék látni, akkor a /home/joska/.bashrc állomány végére írhatjuk a következő sort export PS1='$ ' Ez is szép megoldás: export PS1="Irj be egy parancsot: " ==== Prompt beállítások ==== | \u | Felhasználónév | | \h | Hostnév | | \w | Aktuális könyvtár útvonallal | | \W | Aktuális könyvtár útvonal nélkül | Prompt a felhasználónév, dollárjel és egy szóköz: export PS1="\u\$ " Prompt a hostnév, dollárjel és egy szóköz: export PS1="\h\$ " Prompt az aktuális könyvtár, dollárjel és egy szóköz: export PS1="\w\$ " De keverhetjük: export PS1="\u\h\$ " Így viszont nincs elválasztó kettő között. Szokásos szeparátor a "@" karakter". export PS1="\u@\h\$ " ==== Gyakorlat ==== * Mire való az echo parancs? * Milyen különleges karaktereket használhatunk az echo paranccsal? * Hogyan állíthatjuk be, hogy a várakozási jel a felhasználónévből és egy dollárjelből álljon? * Hogyan állíthatjuk be, hogy a várakozási jel a számítógép nevéből és egy dollárjelből álljon? * Mit jelent az útvonalban a "~" karakter? * Készítsen egy ilyen várakozási jelet: "C:\> " ===== Felhasználókról ===== ==== Magamról ==== Ha várakozási jel nem tájékoztat arról, milyen néven léptünk be, akkor használjuk a whoami parancsot. Ki vagyok én? whoami Esetleg így: who am i Ez a parancs kiírja a felhasználónevünket. Például: joska Mit lehet rólam tudni? Néha azt is szeretnénk tudni, milyen csoportokban van benne a felhasználónk. Ebben segít az id parancs. id A kimenet ehhez hasonló lehet: uid=1000(joska) gid=1000(joska) csoportok=1000(joska), 4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin), 125(sambashare),126(vboxusers),1002(teachers) Jóval több információt ad. Megmondja milyen csoportokba tartozunk felhasználóként. Az id parancs az -un kapcsolóval úgy viselkedik mint a whoami parancs: id -un ==== Mi történt a rendszerben ==== Általában szeretnénk tudni ki volt utoljára bejelentkezve, vagy mikor használták utoljára a hozzáférésünket (használata-e illetéktelen). Ebben segít a last parancs: last A last parancs kimenete persze túl fut a képernyőn, ha már sokszor használtuk a Linuxot. Ezt tördelhetjük a more paranccsal így: last | more Használhatjuk ebből a célból a less parancsot is: last | less A less parancs felületéből egy billentyűvel tudunk kilépni: Q Csak a jelenlegi kapcsolatok: last -ap now ==== Kik vannak bent? ==== Van amikor csak egyszerűen arra vagyunk kíváncsiak ki van bejelentkezve: users Ha azt is szeretnénk látni honnan léptek be, akkor a következő parancsot használjuk: who who -u A legtöbb információt azonban a következő parancs adja: w Ez a parancs azt is kiírja, a bejelentkezett felhasználók mit csinálnak. Ezért ügyelnünk kell arra, hogy ha olyan parancsot használunk, amely paraméterként jelszót vár, azt ne futtassuk parancssorból önmagában. Hagyjuk, hogy a programunk kérje azt be. Belépések listázása: lslogins Csak valódi felhasználók: lslogins -u ==== A finger parancs ==== A finger parancs alapértelmezetten nem érhető el. A finger információkat közöl egy felhasználóról. Eredetileg e-mail címek alapján lehetett lekérdezni, több információt. Ha valahol van finger szolgáltatás, ez természetesen most is működik. Egy Linuxos rendszeren a felhasználónevet beírva, bővebb információkat nyújt róla: * teljes neve * könyvtára * shell * milyen TTY-on jelentkezett be * mennyi ideje van bejelentkezve * van-e új level * dolgozik-e valamilyen terven A finger eredetileg a BSD UNIX részeként jelent meg. A telepítéshez rendszergazdai jogok szükségesek: apt install finger A használathoz egyszerűen beírhatjuk a finger parancsot: finger De egy felhasználó megadható paraméterként. Így több információt jelenít meg, a kívánt felhasználóról: finger janos A plan: nano ~/.plan A felhasználó leírhatja éppen min dolgozik. ==== Gyakorlat ==== * Mi a különbség a "who" és a "w" parancs között? * Írja bent.txt fájlba kik vannak éppen a rendszerbe bejelentkezve. * Mire való az users parancs? * Hogyan nézhetjük, meg mikor volt utoljára újraindítva a rendszer? * Hogyan nézhetjük, meg kik voltak bejelentkezve a rendszerbe? * Hogyan kérdezzük le az aktuális dátumot? * Mire való a "whoami" program? * Mit csinál a "id -un" parancs? ===== A rendszer lekérdezése ===== ==== date ==== Az aktuális dátumot a date paranccsal lehet lekérdezni: date 2013. jan. 8., kedd, 20.39.43 CET A dátum és időbeállításokról később bővebben is lesz szó. A lekérdezések formája beállítható, ahogy azt az alábbiakban látjuk. Csak az óra lekérdezése: date +%H Óra perc: date +%H:%M Évszám: date +%Y Évszám, hónappal és nappal date +%Y-%m-%d A dátum kiíratható unix formátumban is: $ date +%s 1539114959 $ date -d @1417827123 2014. dec. 6., szombat, 01:52:03 CET $ ==== cal ==== A cal megmutatja az aktuális hónapot és évet. Az aktuális hónap minden napját külön is megjeleníti, naptárszerűen. Naptárat jelenít meg. A cal parancs magyar kézikönyve sajnos elavult a Debian GNU/Linux 6.x rendszerekben. Helyette nézzük meg az angol nyelvűt. Például: man -L us cal Használhatjuk a cal helyett a ncal parancsot is. A cal és az ncal parancsok a //bsdmainutils// csomag részei. A cal ma már csak egy szimbolikus link a ncal programra. Ha az ncal nézetben, hétfővel kezdődő naptárat szeretnénk, használjuk az ncal -b parancsot: ncal -b Adott hónap az évben: ncal -m 10 Az adott hónap előtt és után is egy hónap megjelenítése: ncal -b -3 Szeptemberben így augusztus, szeptember és október jelenik meg. ncal -b -3 -m 10 Így szeptember, október és november jelenik meg. ncal -y 2020 Még pluszban hány hónap jelenjen meg, az aktuális után: ncal -A 3 Még pluszban hány hónap jelenjen meg, az aktuális előtt: ncal -B 3 Adott év, adott hónapja: ncal -d 2020-4 vagy: ncal -d 2020-04 ncal -d 2020-04 -A 2 ==== uptime ==== Kiírja mennyi ideje fut a rendszer, milyen terhelésnek van kitéve. uptime ==== uname ==== Az uname a kernelről ad információt: uname Kapcsoló nélkül csak annyit mond, hogy "Linux". Ez az információ jelenik meg a -s hatására is. A -m kapcsoló kiírja milyen hardvert használunk: uname -m Vagy: uname --machine A válasz például: * x86_64 A -r megadja a kernel verziószámát: uname -r 4.9.0-4-amd64 Az összes információt a -a kapcsolóval írja a képernyőre: uname -a ==== A CPU és a memória ==== A processzor adatai: cat /proc/cpuinfo A memória adatai: cat /proc/meminfo Használt és szabad memória, cserehellyel együtt: free ==== Lemezhasználat ==== df -h du ===== Könyvtárkezelés ===== ==== Aktuális könyvtár ==== A felhasználók alapértelmezésben, belépés után a saját könyvtárukba kerülnek, amelynek a jele "~". Alapértelmezés az is, hogy az aktuális könyvtár megjelenik a várakozási-jelben. Ha változtattunk várakozási-jelen és már nem az alapértelmezett könyvtárban állunk, szeretnénk tudni az aktuális könyvtár nevét, útvonalastól együtt. Ezt a **pwd** parancs begépelésével tehetjük meg. A pwd a //present work directory// vagy a //print working directory// rövidítése. pwd A joska nevű felhasználó például ezt láthatja, ha a saját könyvtárában áll: /home/joska ==== A könyvtár tartalmának listázása ==== Általában szeretnénk a könyvtár tartalmát listázni. Szeretnénk látni milyen újabb könyvtárakat és fájlokat tartalmaz. Erre a célra az "ls" parancsot használhatjuk. === ls alapok === ls Az ls kapcsolók nélkül kiadva az aktuális könyvtár tartalmát mutatja. Ha először lépünk be egy linuxos hozzáférésünkre, akkor valószínűleg nem találunk a saját könyvtárunkban állományt. A rejtett állományok abban különböznek a többitől, hogy ponttal (.) kezdődnek. Ha először lépünk be egy hozzáférésünkre valószínűleg már vannak rejtett fájlok, csak nem látjuk őket. A -a kapcsolóval megtekinthetők a rejtett fájlok is: ls -a Egy következő kapcsoló a fájlokról a lehető legtöbb információt adja számunkra, ez a -l. Long azaz hosszú kimenet kapunk a kapcsolóval: ls -l Ha még nincs más könyvtárunk használjuk az "a" kapcsolót is: ls -la Az eredmény valami ilyesmi lehet: összesen 28 drwxr-xr-x 3 joska joska 4096 febr 24 23.49 . drwxr-xr-x 4 root root 4096 dec 13 18.37 .. -rw------- 1 joska joska 92 febr 25 00.04 .bash_history -rw-r--r-- 1 joska joska 220 dec 13 18.37 .bash_logout -rw-r--r-- 1 joska joska 3184 dec 13 18.37 .bashrc drwx------ 2 joska joska 4096 febr 24 23.49 .mc -rw-r--r-- 1 joska joska 675 dec 13 18.37 .profile Az ls parancsnak megadható, hogy melyik könyvtárat listázza számunkra. A gyökér könyvtár listázása a következő módon történhet: ls / Vagy a /bin könyvtár listázása: ls /bin === Az ls hosszú kimenete === Fentebb már láttuk a -l kapcsoló hatását (-a -val együtt): összesen 28 drwxr-xr-x 3 joska joska 4096 febr 24 23.49 . drwxr-xr-x 4 root root 4096 dec 13 18.37 .. -rw------- 1 joska joska 92 febr 25 00.04 .bash_history -rw-r--r-- 1 joska joska 220 dec 13 18.37 .bash_logout -rw-r--r-- 1 joska joska 3184 dec 13 18.37 .bashrc drwx------ 2 joska joska 4096 febr 24 23.49 .mc -rw-r--r-- 1 joska joska 675 dec 13 18.37 .profile A kimenet első elemének a neve egy pont (.), a másodiknak pedig két pont (..). Az egy pont magában az aktuális könyvtárat jelképezi, a két pont egymás után pedig a szülőkönyvtárat jelképezi. A parancs először az állományról kiírja, hogy milyen fajta állomány. A Unix alapú rendszerekben a könyvtárak is állományként vannak kezelve, ezért a könyvtárat egy speciális állománynak is tekinthetjük. Így van ez a számítógép hardver eszközeivel is. Minden eszköz egy állományként érhető el a rendszerben. Ezért szoktuk mondani, hogy a Linuxban minden állomány. | - | rw-r--r-- | 1 | joska | joska | 3184 | dec 13 18.37 | .bashrc | | az állomány típusa | jogok | linkek száma | tulajdonos | csoport | méret | utolsó módosítás dátuma | az állomány neve | Minden sor 10 darab karakterrel kezdődik. Ebből az első az állomány típusa, a többi kilenc az állományhoz tartozó jogokat mutatja. A következő szám az állományra mutató linkek számát mutatja. A linkekről lásd később a link létrehozása című részt. A linkek száma után az állomány tulajdonosa, amit a csoport neve követ. A Debian GNU/Linux rendszerekben egy felhasználó létrehozásakor létrejön egy a nevével azonos csoport is. Így lehet, hogy a csoportnév megegyezik a tulajdonos nevével. A következő szám az állomány mérete. Könyvtárak esetén itt a blokk mérettét látjuk. Ezt követi az utolsó módosítás dátuma, és végül az állomány neve. Ha listázott elem egy könyvtár, akkor a méret résznél a fájlrendszerben használatos blokkméret fog megjelenni. === Könyvtárak és fájlok megkülönböztetése === A könyvtárak és fájlok a -l kapcsolóval megkülönböztethetők, de előfordul, hogy ezen kapcsoló nélkül is szeretném látni, hogy mivel van dolgom. Ezt a -F kapcsolóval tehetem meg: ls -F === Könyvtár méret === A fájlok és könyvtárak számára legkisebb lefoglalható egység a fájlrendszertől függ. ext3 és ext4 fájlrendszeren ez 4096 bytes. Ha futtatjuk a ls -ld parancsot, akkor látjuk az adott könyvtár számára mennyi helyet foglalunk: ls -ld munka A kimenet pedig ehhez hasonló lehet: drwxr-xr-x joska joska 4096 márc 9 10.26 munka/ A könyvtár számára a 4096 a kezdeti lefoglalt hely (fájlok számára is). A könyvtárban eltárolt fájlok sokasodása után ez nőhet, a következő például 4096 valamelyik szorzatára. Az alábbi parancs létrehoz néhány fájlt: mkdir munka cd munka Hozzunk létre 200 fájlt: for ((i=0; i<200; i++)); do touch aaaaaaaaaa_$i; done Nézzük meg a ls -ld kimenetét a könyvtáron: ls -ld . drwxr-xr-x joska joska 12288 márc 12 07.03 Ezek után az aktuális könyvtár listázásánál a méret: 12288 Ne felejtsük el, hogy más fájlrendszernél ezek az értékek eltérhetnek. === Külön bejegyzések === Egy könyvtár vagy fájl listázása esetén a jogok után ritka esetben megjelenhet plusz (+) vagy pont (.) karakter: drwxr-xr-x+ joska joska 12288 márc 12 07.03 Nev vagy: drwxr-xr-x. joska joska 12288 márc 12 07.03 Nev A plusz (+) karakter arra utal, hogy a fájlhoz (vagy könyvtárhoz) külön ACL bejegyzések is tartoznak. Ha pont (.) karakter van a jogok után, akkor ez SELinux címkék bejegyzésére utal. Ha mindkettő van (ACL és SELinux címke is), akkor a plusz (+) karakter látszik. További információk az [[oktatas:linux:acl|ACL]] és az [[oktatas:linux:selinux|SELinux]] lapokon. ==== Könyvtár létrehozása ==== Könyvtárakat az "mkdir" paranccsal hozhatunk létre. Az mk, a make szóból, a dir pedig a directory szóból származik. Paraméterként több könyvtárat is megadhatunk. A linuxos, illetve unixos rendszerek kis és nagybetű érzékenyek. A következő példában szereplő nevek két külön könyvtárat jelölnek: * Informatika * informatika A parancs szintaxisa: mkdir konyvtar_neve ... A mai Linuxok már UTF-8-as kódolást használják a rendszer minden szintjén, így használhatunk ékezetes könyvtárneveket is. Ezzel azonban gond lehet, ha más rendszerre visszük a könyvtárainkat. Egyszerre több könyvtárat is létrehozhatunk, ha szóközzel tagolva felsoroljuk, vagy kapcsos zárójelek között vesszővel tagoljuk azokat. Utóbbi esetben szóköz nem lehet köztük: mkdir elso masodik harmadik mkdir {elso,masodik,harmadik} Ha útvonalat is megadunk egy könyvtár létrehozásánál a -p kapcsoló segítségével, az útvonalban szereplő nem létező könyvtárak automatikusan létrejönnek: mkdir -p /home/joska/munka/dolgozok/human/gizi ==== Könyvtárcsere ==== Ha már vannak újabb könyvtáraink szeretnék "belépni" azokba. A példa kedvéért, hozzuk létre saját könyvtárunkban a jarmu nevű könyvtárat. Tegyük fel, hogy a saját könyvtárunk a /home/joska. A "pwd" parancs tanúsága szerint pedig ebben a könyvtárban állunk. Kiadtuk a könyvtárlétrehozás parancsát: mkdir jarmu Szeretnénk az új könyvtárba belépni, vagyis könyvtárat cserélni. Erre a "cd" parancs ad lehetőséget: cd jarmu A "pwd" paranccsal ellenőrizzük a könyvtárváltás meglétét. A "cd" parancs első "c" betűje a "change" szóból van, a "d" betű pedig a "directory" szóból. Ha jól dolgoztunk a pwd parancs kimenete most a következő: /home/joska/jarmu Most a "jarmu" könyvtáron belül hozzunk létre egy "szeker" nevű könyvtárat: mkdir szeker Lépjünk bele: cd szeker Ezek után a pwd kimenete: /home/joska/jarmu/szeker Most vissza kellene lépni az előző könyvtárba. Az előző könyvtárat két pont jelképezi: .. Másként, ha most éppen a /home/joska/jarmu/szeker könyvtárban állunk akkor a két pont a /home/joska/jarmu könyvtárat jelképezi. Ha szeretnénk visszalépni a jarmu könyvtárba, akkor megtehetjük, hogy a teljes útvonal megadásával így lépek vissza: cd /home/joska/jarmu De ugyanezt az eredményt érhetjük el, ha cd paranccsal használjuk a két pontot: cd .. Ez utóbbi parancs bármely könyvtárban is állunk, azt eredményezi, hogy egy könyvtárral feljebb kerülünk. Ugyanígy használhatjuk a gyökérkönyvtár jelét a fájlrendszer gyökerébe jutáshoz: cd / Ezzel a fájlrendszer gyökerébe jutunk. Van még egy különleges karakter, amely a saját könyvtárunkat jelképezi. Ez a következő: ~ Tilde karakternek hívják. Bármely könyvtárban is állok a könyvtárstruktúrában, ha kiadom a következő parancsot, a saját könyvtárunkba fogok jutni: cd ~ Vegyük észre, hogy a várakozási jelben is szerepel egy tilde karakter (Legtöbb linuxos terjesztésben így van beállítva a várakozási jel). A saját könyvtárunkba visszaléphetünk egyszerűen a cd paranccsal is: cd Az utoljára használt könyvtárba is könnyedén visszaléphetünk: cd - ==== Könyvtár törlése ==== Az rmdir parancs segítségével minden megadott üres könyvtárat törölhetünk: rmdir konyvtarnev Itt is használható a -p kapcsoló. A parancs így a legbelső könyvtárat törli, ha az üres, és utána a többit, egyenként. Legyen a példa kedvéért egy ilyen könyvtárszerkezet: egy/ketto/harom Kiadjuk a törlésre az utasítást: rmdir egy/ketto/harom A parancs először törli a harom könyvtárat, ha az üres. Utána a ketto könyvtárat, ha az előző sikeres volt és a ketto üres. Végül ha az előző kettő sikeres volt, akkor törli az egy könyvtárat is. ==== Könyvtár átnevezése ==== A könyvtár átnevezését az mv paranccsal hajtjuk végre, amely az angol move szóból származik. Magyarul mozgatás jelent. A parancsot valójában arra találták ki, hogy egy állományt egy másik helyre mozgassunk. Viszont ha a mozgatás helye a kiindulási pont, akkor csak átnevezés történik. Szintaxisa a következő: mv eredetikonyvtar ujkonyvtar ==== Könyvtár átmozgatása ==== mv konyvtar001 konyvtar002/ A konyvtar002 könyvtárba mozgatjuk a konyvtár001 nevű könyvtárat. ==== Könyvtárak másolása ==== cp -R dir1 dir2 Ha a dir2 már egy létező könyvtár, akkor annak tartalmába másol! Ha nincs dir2 könyvtára akkor az aktuális könyvtárban létrehozza a dir2 könyvtárat. A -R kapcsoló hatására valójában rekurzív másolásra adunk parancsot, de könyvtármásolásnál éppen ezt szeretnénk. ==== Könyvtárnevek mérete ==== A könyvtárnevek maximális hossza 256 bájt. De az ékezetesekkel duplán kell számolnunk. ==== Könyvtárszerkezet ==== tree Könyvtár szerkezet a saját könyvtártól kiindulva: tree ~ A Dokumentum könyvtár szerkezete jogokkal: tree -p Dokumentumok ==== Gyakorlat ==== * Milyen könyvtárkezelő parancsok vannak? * Hozzon létre egy "tudas" nevű könyvtárat saját könyvtárában. * Hozzon létre egy "jarmu" nevű könyvtárat saját könyvtárban. * Milyen paranccsal nézzük meg, melyik könyvtárban vagyunk éppen? * Milyen parancssorral léphetünk a gyökérkönyvtárba (egy parancs)? * Lépjen saját könyvtárába. * A "jarmu" nevű könyvtárban a következő alkönyvtárakat hozza létere: * Citroen * Daewoo * Fiat * Ford * Lada * Mercedes * Nissan * Opel * Peugeot * Lépjen be a /sys/block könyvtárba. Derítse ki milyen állományok vannak ebben a könyvtárban. * Lépjen be a /sys/block/sda könyvtárba, ha az létezik. Milyen állományok vannak benne? ===== Könyvtárszerkezet ===== A Linuxos könyvtárszerkezet felépítése egy fához hasonlítható. Van egy gyökér a kiinduláspont, és abból újabb könyvtárak, alkönyvtárak nyílnak. A kiindulópontot azaz a gyökeret egyetlen karakterrel jelezzük: "/". A perjel tehát a gyökér. Ha a merevlemez több részre ún. partícióra van felosztva, gyökér akkor is csak egy van, így nem kell különféle jelöléssekkel ellátni a gyökér könyvtárat. Jó kérdés lehet, hogy akkor a többi partíciót hol és hogyan érjük el. A plusz partíciók egy-egy könyvtár alkönyvtáraiban érhetők el. A rendszergazda azokat bárhova felcsatolhatja, igaz van mindegyiknek egy megszokott helye. ==== A könyvtárak leírása ==== A felhasználók könyvtárai a "home" nevű könyvtárban találhatók. Hogy ez rögtön a gyökér könyvtárból nyílik, így szoktuk leírni: /home A /home könyvtáron belül vannak a felhasználók könyvtárai. Legyen például egy joska, egy mari és egy janos nevű felhasználó. A joska felhasználói könyvtárát ekkor így írhatjuk le: /home/joska Mari felhasználó könyvtára: /home/mari János felhasználó könyvtára: /home/janos Fa formájú szerkezetben ezt így írhatjuk le: / |--home |--janos |--joska |--mari Ha Jánosnak van a saját könyvtárában egy Dokumentumok alkönyvtár, akkor a faszerkezet így néz ki: / |--home |--janos | |--Dokumentumok |--joska |--mari Itt szeretném megjegyezni, hogy a Linuxos fájlrendszer kis- és nagybetű érzékeny. Tehát egy "dokumentumok" és egy "Dokumentumok" nevű könyvtár, két különböző könyvtár. További példa kedvéért Jánosnak legyen a Dokumentumok mellett egy Tervek és egy a tervekből nyíló Programozas könyvtára: / |--home |--janos | |--Dokumentumok | |--Tervek | |--Programozas |--joska |--mari A valósában a gyökérkönyvtárból is több könyvtár nyílik. A következő példában legyen pluszban egy "var" könyvtár is ábrázolva. A var könyvtárban a rendszer a változó adatokat tárolja: / |--home | |--janos | | |--Dokumentumok | | |--Tervek | | |--Programozas | |--joska | |--mari |--var A "var" könyvtárból nyíljon egy "log" nevű könyvtár amelyben a naplófájlok vannak: / |--home | |--janos | | |--Dokumentumok | | |--Tervek | | |--Programozas | |--joska | |--mari |--var |--log Ezzel a faszerkezettel tehát leírható az egész könyvtár hierarchia. A "log" könyvtár útvonalát egyetlen sorba, ezek után így írhatjuk fel: /var/log A János nevű felhasználó Dokumentumok könyvtára egyetlen sorban: /home/janos/Dokumentumok A János nevű felhasználó "Programozas" könyvtára így írható le: /home/janos/Tervek/Programozas A János nevű felhasználó "Tervek" könyvtára így írható le: /home/janos/Tervek Esetleg az egyértelműbb jelzés miatt a könyvtár nevek végére tehetünk egy "/" karaktert: /var/log/ /home/janos/Dokumentumok/ /home/janos/Tervek/Programozas/ /home/janos/Tervek/ Így tudjuk, hogy nem egy fájlról van szó. ==== A gyökér könyvtár könyvtárai ==== * / * bin * boot * dev * hda0 * hda1 * etc * home * jozsi * mari * kati * eszter * peter * lib * media * mnt * opt * proc * root * sbin * srv * sys * tmp * usr * bin * include * lib * local * sbin * share * var * log * mail * www Most nézzük, mi micsoda. * /bin Az alapparancsok programjai itt vannak elhelyezve. * /boot A rendszerindításhoz szükséges fájlok helye. * /dev A számítógép minden eszköze (hardvere) ebben a könyvtárban egy fájl formájában leképezésre kerül. * /dev/sr0 A CD-ROM elérése. * /etc A rendszer beállításait tároljuk itt. * /home A felhasználók saját könyvtárai. * /lib Osztott programkönyvtárak, elsősorban a kernel, a /bin és az /sbin könyvtárak számára. * /lost+found Fájlrendszer sérülése után a helyreállító program ide helyezi azokat a fájlokat amit nem képes helyre állítani. * /media Más fájlrendszerek automatikusan ide kerülnek felcsatolásra. * /media/cdrom0 * /mnt Kézzel csatlakoztatott más fájlrendszerek. * /mnt/cdrom Ha kézzel csatolunk egy CD-ROM-t a fájlrendszerbe, akkor azt ide szokás. * /proc A memória leképezése fájlokra. * /root A root (rendszergazda) felhasználó saját könyvtára. * /sbin A rendszergazda parancsainak programjai itt találhatók. * /srv A szolgáltatásokat nyújtó programok adatállományai (mint a home). * /sys Néhány kernelobjektum itt van leképezve. * /tmp Ideiglenes fájlok helye. * /usr A programok könyvtárai. * /usr/bin/ : Futtatható programok a felhasználók számára. * /usr/include/ : A programozáshoz szükséges "include" fájlok helye. * /usr/lib/ : Osztott programkönyvtárak. * /usr/sbin/ : A root felhasználók programjai. * /usr/share/ : Architektúra független adatok. * /usr/src/ : Forráskódok. (Debian csomagok fordításához; Lásd még a /usr/local/src/ könyvtárat) * /usr/X11R6/ : Az "X Window System" könyvtára. * /usr/local/ : A rendszer-adminisztrátor által telepített programok helye. * /usr/local/bin : helyi bináris programok és scriptek helye, stb. * /usr/local/src : Forráskódok helye (Nem debianos eszközök telepítési helye.) * /var Gyakran változó fájlok helye. Link: http://wiki.debian.org/FilesystemHierarchyStandard ==== Gyakorlat ==== * Mit tartalmaz a /tmp könyvtár? * Mit tartalmaz a /bin könyvtár? * Mit tartalmaz a /home könyvtár? * Mit tartalmaz a /media könyvtár? * Mit tartalmaz a /proc könyvtár? ===== Fájlkezelés ===== ==== Fájlok létrehozása ==== Egy fájl létrehozásához a legegyszerűbb parancs a touch. Igaz eredeti célja, hogy egy fájl időbélyegét megváltoztassuk, de ha egy állomány nem létezik amelynek időbélyegét aktualizálni szeretnénk, akkor azt létrehozza. Természetesen a fájl tartalma üres lesz. A touch parancs nem kérdez semmit, csak elkészíti az állományt: touch fajlneve.txt Az echo paranccsal is létrehozhatunk fájlokat. Ekkor az echo után írt "Szöveg" a fájlba kerül. echo "alma" > gyumolcsok.txt ==== Fájlok törlése ==== Egy fájl törlése: rm fajlnev Törlés rekurzívan: rm -r konyvtarnev Az rm parancs alapvetően fájlok törlésére lett kitalálva, ezért könyvtárat csak úgy tudunk törölni vele, ha beállítjuk a rekurzívitást. A könyvtár és tartalmának törlése: rm -r könyvtárnév Az egész könyvtárfa törlése a gyökértől kiindulva: rm -r / A -f kapcsolóval kérdés nélkül törölhetők az állományok. A nem létező állományok miatt sincs visszajelzés: rm -f vmi.txt Egyszerre több fájl is törölhető: rm vmi1 vmi2 vmi3 Ha óvatosak szeretnénk lenni, ezért minden fájl törlése előtt elvárnánk egy kérdés, hogy törölhetjük-e, akkor használjuk az -i kapcsolót: rm -i vmi1 vmi2 vmi3 Ha kérdés nélkül szeretnék egy könyvtárat, tartalmukkal együtt töröli, használjuk a -f és -r kapcsolókat: rm -rf könyvtárnév A -r mondja meg, hogy legyen rekurzív a művelet, a -f pedig, hogy ne problémázzon az rm parancs. Az rm parancs mellett használható a "*" jelölése, amely bármilyen szövegre illeszkedik. a .txt kiterjesztésű fájlok törlése: rm *.txt A csillag karakter persze állhat a bárhol a mintában. ==== Fájlok átnevezése ==== mv fajl001 fajl002 Az mv parancs valójában a fájlok mozgatására lett kitalálva, de ha nem adunk meg könyvtárat, vagyis ugyanabba a könyvtárba mozgatunk, akkor tulajdonképpen átnevezés történik. Átnevezés ''{}'' használatával: mv fel.txt{,.elavult} Az eredmény: ''fel.txt.elavult'' ==== Fájlok mozgatása ==== Adott állomány mozgatása adott könyvtárba: mv fajl konyvtar vagy: mv fajl konyvtar/ A fajl nevű állományt a konyvtar nevű mappába mozgatjuk. Több fájl is mozgatható egy könyvtárba, a lényeg, hogy a könyvtár neve legyen az utolsó: mv fajl1 fajl2 fajl3 konyvtar ==== Fájlok másolása ==== Az aktuális könyvtárban szeretnénk a file1 állományról egy file2 másolatot: cp fajl01 fajl02 Adott egy "munka" nevű könyvtár az aktuális könyvtáron belül. Ebbe szeretnénk másolni a file1 nevű állományt, ugyanezen a néven: cp fajl01 munka/ A -u, vagy hosszabban --update kapcsolóval, a nem kerülnek másolásra azok a nem-könyvtár fájlok, amelyek azonos vagy újabb módosítási idővel rendelkeznek. cp -u *.c cel ==== Fájlok tartalmának megtekintése ==== Gyakran szükség van arra, hogy gyorsan belenézzünk egy fájlba. Erre használható például a cat parancs: cat fajlnev more fajlnev less fajlnev ==== Fájlok darabolása ==== split -b 1440000 fajlnev Régebben ha floppy lemezre akartunk másolni, pont ekkora méretre kellett darabolnunk a fájlt. A fenti parancs segítségével a fajlnev nevű állományt 1440000 byte nagyságú részekre lett feldarabolva. A fájlokat automatikusan elnevezi ehhez hasonlóan: * xaa * xab * xac * stb ==== Darabolt fájlok összefűzése ==== A darabolt fájlokat előbb-utóbb szeretnénk összeszerkeszteni. Ezt a cat paranccsal tehetjük meg az alábbi formában: cat x* >> fajlnev A csillag, azt jelenti, hogy minden könyvtár ami x-el kezdődik. ==== Fájlok szerkesztése ==== Fájlok szerkesztésére nagyon sok eszköz áll rendelkezésre. Lehet parancssorból a sed paranccsal szerkeszteni. Vagy lehet erre a célra kitalált szövegszerkesztőket használni. Legyen például a virag.txt nevű állomány amit szeretnénk szerkeszteni: vi virag.txt vagy nano virag.txt vagy mcedit virag.txt Az Midnight Commander beépített szövegszerkesztője. Valójában egy szimbolikus link az mc parancsra. Ebből következik, hogy a használatához az "mc" csomagnak telepítve kell lennie a gépünkön. A vim a vi továbbfejlesztése. Alapértelmezetten nincs telepítve. A vim telepítése: apt install vim Használata: vim adat.txt ==== Nano ==== === Billentyűk === A nano szövegszerkesztő alapvető billentyűkombinációi Ctrl gombbal működnek. Ezt maga a szövegszerkesztő is tudatja velünk, de a Ctrl helyett egy "^" karaktert látunk mindig. A mentés például a Ctrl+O billentyűkombinációval történhet, amit így látunk: ^O Vagy a kilépés Ctrl + X billentyűkombináció, amelyet így látunk: ^X === Szerkesztés === A vágólapos szerkesztési műveleteket kezdjük a kijelöléssel. Először meg kell mondani, hogy most kijelölés jön. A kijelölés végét nem kell jelezni (ellentétben az mceditel). Ha kijelöltük azt amit vágólapra szeretnénk tenni, akkor el kell dönteni ezt hogyan szeretnénk. A kijelölt szöveg kivágásával, vagy másolásával. Ennek megfelelő billentyűkombinációt nyomunk. Ezt követően arra a helyre lépünk, ahova a szöveget be kell illeszteni, amit Ctrl + U kombinációval tehetünk meg. | Alt + A | Szelekció megkezdése | | Alt + 6 | Másolás (ha nincs kijelölve, akkor az aktuális sor) | | Ctrl + K | Kivágás | | Ctrl + U | Beillesztés | A Ctrl + K billentyűkombinációt használhatjuk kijelölés nélkül is. Ekkor azt a sort vágja ki, amelyikben éppen állt a kurzor a Ctrl + K lenyomásakor. === Egyéb === | Alt + Q | Kijelölés kezdete | ==== Linkek a fájlrendszerben ==== === Merev link === Amikor létrehozunk egy állományt a merevlemezen létrehozunk számára egy inode nevű bejegyzést. Az inode tartalmazza a következő információkat: * időbélyegek * méret * tulajdonos * csoport * jogok * elfoglalt blokk méret * IO-blokk méret A fájl neve nem az inode-ban tárolódik. A fájlnév a szülő könyvtár tartalmi részében tárolódik. A név mellett egy mutató jön létre a fájl inode-ra. Ezt nevezzük linknek. További linkeket hozhatunk létre az ln paranccsal: touch fruit.txt ln fruit.txt frutta.txt A fruit.txt és a frutta.txt is ugyanarra az inode-ra mutat. Ellenőrizzük az ls paranccsal. A -i kapcsoló megmutatja inode azonosítót: ls -li fruit.txt frutta.txt A lehetséges kimenet: 1059029 -rw-r--r-- 2 janos janos 2 okt 12 21:06 fruit.txt 1059029 -rw-r--r-- 2 janos janos 2 okt 12 21:06 frutta.txt Ha már két merev link mutat egy fájlra, a fájl csak akkor törlődik, ha mindkét linket töröljük. Vegyük a következő példát. Létrehozok egy fájlt: touch erdo.txt Most létrehozok egy rámutató linket: ln erdo.txt fak.txt Most törlöm a erdo.txt-t: rm erdo.txt A fájl maga nem kerül törlésre, mert a fak.txt nevű link még az állományra mutat. Az állomány törlése csak ekkor történhet meg. Az ls -l parancs kimenetében vegyük észre a linkek számát. === Szimbolikus link === A szimbolikus link másként viselkedik, mint a merev link, ezért is nevezzük szimbolikusnak. A szimbolikus link létrehozásakor létrejön egy új inode bejegyzés. Az ebben található mutató viszont nem célként megadott inode-ra mutat. Helyette a célhoz tartozó névre mutat (ami egy merev link neve). Ennek eredménye, ha töröljük a merev linket, a szimbolikus link nem fog mutatni sehova. Szimbolikus link létrehozása ln -s fajlnev linkfajlra A fájlrendszerben szimbolikus linkre példa: ls -l /vmlinuz A kísérletezéshez lehetőleg újonnan telepített Linuxot használjunk, ahol a háttérben nagy eséllyel nem jönnek létre újabb fájlok, nincs még szolgáltatás telepítve. Kísérletképpen hozzuk létre a fruit.txt állományt, ha az még nem létezik. A kísérlet folytatása előtt nézzük meg az adott fájlrendszeren mennyi a szabadon felhasználható inode: stat -f fruit.txt A kimenet utolsó sorában például ilyet láthatunk: Inode-ok: összes: 36626432 szabad: 35042423 Vagyis van 35042423 szabad inode. Most hozzunk létre egy obst.txt nevű szimbolikus linket, ami a fruit.txt-re mutat: touch fruit.txt ln -s fruit.txt obst.txt Most nézzük meg a hozzájuk tartozó inode azonosítókat: ls -li fruit.txt obst.txt A fruit.txt és az obst.txt inode azonosítói különböznek. Most nézzük meg újra, hány szabad inode van: stat -f fruit.txt A kimenet utolsó sora ilyen lehet: Inode-ok: összes: 36626432 szabad: 35042422 A szabad inode-ok számra eggyel csökkent, azaz létrejött egy új inode. ==== Fájlok statisztikája ==== A stat parancs még több információt szolgáltat egy állományról vagy egy könyvtárról. stat fajlnev Például: stat log.txt File: "log.txt" Size: 0 Blocks: 0 IO Block: 4096 szabályos üres fájl Device: 802h/2050d Inode: 1461005 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ andras) Gid: ( 1000/ andras) Access: 2012-01-15 23:00:17.365731988 +0100 Modify: 2011-08-09 22:35:50.584228887 +0200 Change: 2011-08-09 22:35:50.584228887 +0200 | File | A fájl neve | | Size | A fájl mérete | | Blocks | A fájl által használt blokkok száma (512 bájtos blokkokkal számol!) | | IO | IO blokkméret a fájl számára | | fájltípus | szabályos fájl, \\ szabályos üres fájl \\ könyvtár \\ szimbolikus link \\ foglalat \\ speciális karakterfájl \\ speciális blokkfájl | | Device | Az eszköz neve hexadecimális és decimális formában. | | Inode | A fájl egyedi azonosítója a fájlrendszerben | | Links | Linkek száma a fájlra | | Access | Hozzáférés szám és karakterformában. | | Uid | Tulajdonos | | Gid | Csoport | | Access | Utolsó fájlolvasási időpont | | Modify | A fájl tartalmának utolsó változása | | Change | A fájl inode leírójának utolsó változása | stat konyvtarnev Magáról a fájlrendszerről kaphatunk információt a -f kapcsoló megadásával: stat -f fajlnev Például: stat -f log.txt File: "log.txt" ID: 3f4e5580b0204b72 Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 9612076 Free: 4608081 Available: 4119806 Inodes: Total: 2444624 Free: 2115881 Ha írunk a fájlba, akkor módosul a mtime (Modify time), de ezzel együtt a ctime (Change time) is. A ctime viszont módosul még néhány esetben. Ha például módosítom a fájl jogait, vagy tulajdonsát, akkor a ctime érték frissül. A -c vagy a --format kapcsolóval kiírathatjuk (többek között) mit ért (hány bájt-ot) a stat blokkméret alatt: stat --format=%B fajlnev $ stat --format=%B vmi.txt 512 ==== Fájlok mérete ==== A fájlrendszer blokkokra van felosztva. Jelenleg szokásos blokkméret 4096 bájlt. {{:oktatas:linux:01_fajlok_merete.png?400|}} Ha nem lenne ez a felosztás, gondban lennénk, ha egy fájl bővíteni szeretnénk. {{:oktatas:linux:02_fajlok_merete.png?400|}} Ezért, ha egy kisméretű fájl, például 2 bájt méretű fájl létrehozunk, annak is le van foglalva 4096 bájt hely. {{:oktatas:linux:03_fajlok_merete.png?400|}} Ha fájl bővítjük így is törve lehet, ha elfogy a 4096 bájt hely. A fájl következő blokkja más helyen jön létre. A fájl így önmagában is töredezett lesz. {{:oktatas:linux:04_fajlok_merete.png?400|}} Ha törlünk egy fájl, akkor a fájlokat összeségében nézve is töredezettség alakul ki. {{:oktatas:linux:05_fajlok_merete.png?400|}} Ezért az ext4 fájlrendszer egy 4096 bájt lefoglalt hely után is hagy valamennyi helyet újabb lefoglalható blokkoknak. A fájlok lemezen foglalt helyét és méretét tudhatjuk meg a "du" parancs segítségével. A du alapértelmezésként a lemezen elfoglalt helyet mutatja meg blokkméretben. 1 blokk 1 kibibájt-nak számít, azaz 1024 bájtnak. Ha bájt-ban szeretnénk megkapni pontosan mekkora az állomány mérete, akkor a -b vagy --bytes kapcsolót kell használnunk. Hozzunk létre saját könyvtárunkban egy fájlt: cd ~ echo "Lorem ipsum doloest amet" > lorem.txt Nézzük meg a helyfoglalását: du lorem.txt Az eredmény: 4 lorem.txt Nem négy bájt. Négy kibibájt (4 * 1024 bájt). Ennyi helyet foglal a lemezen. A du parancs tehát alapértelmezésben 1024-es blokkokkal számol. Ha be van állítva a POSIXLY_CORRECT környezeti változó, akkor 512 bájtos blokkokkal kell számolnunk. Állítsuk be a változót és nézzük meg újra a parancs kimenetét: set -o posix export POSIXLY_CORRECT du lorem.txt Megjegyzés: A korábbi Bash változatokban (Debian10 előtt), nem volt szükség az export parancsra. Ugyanakkor, a set és export helyett megfelel egy export POSIXLY_CORRECT=1 utasítás is. A kimenet: 8 lorem.txt A kimenetben most 8 blokk, vagyis 8 darab 512 bájtos helyet foglal az állományunk, ami 4096 bájt összesen. A POSIXLY_CORRECT környezeti változót azért szokták beállítani, hogy a programok úgy működjenek, hogy megfeleljenek a POSIX szabványnak. A POSIXLY_CORRECT kikapcsolásához: set +o posix A set Bash belső parancsa, több információért nézd meg a leírását: help set Most nézzük meg a valós méretét: du -b lorem.txt vagy: du --bytes lorem.txt 26 bájtot kapunk: 26 lorem.txt Nézzük meg a stat paranccsal is a lorem.txt lefoglalt blokkméretét. Vegyük észre a különbséget. A stat azt mondja 8 blokk, mert az eleve 512 bájt mérettel számol. Ebből láthatjuk, hogy az adott fájlrendszer blokkmérete 4096 bájt. A teszteléshez létrehozhatunk egy 4096 bájt nagyságú fájlt: dd if=/dev/zero of=teszt.txt bs=1024 count=4 Nézzük meg a du paranccsal hány blokkot foglal: $ du teszt 4 teszt.txt Most adjunk hozzá még két bájtot: echo a >> teszt.txt Megjegyzés: egy sortörés is hozzáíródik, azért 2 bájt. Ellenőrizzük újra: $ du teszt 8 teszt.txt ==== Fájlnevek ==== A fájlnevek tartalmazhatnak ékezetes fájlneveket, számokat, alulvonást (_), kötőjelet, pontot stb. Maximális hosszuk: 255 bájt Vegyük észre, hogy a 255 a karakterek száma helyett a szükséges bájtokat tartalmazza. A magyar ékezetes betűk például 2 bájtosak. A fájlnevek lehetséges hossza fájlrendszerfüggő, de általában mindenhol 255. Próbáljunk meg létrehozni egy olyan fájlt, amelynek a neve 255 bájt hosszú: touch 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 A fájl létrejön. Most próbáljunk meg 256-tal: touch 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345 touch: '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345' elérése sikertelen: Túl hosszú fájlnév A fájl nem hozható létre a hibaüzenet: Túl hosszú fájlnév. A példában megadott fájlnév hosszát magunk is ellenőrizhetjük a wc -c segítségével. Vegyünk egy rövidebb fájl nevet ami csak 3 karakterből áll. Vegyük a fenti fájlnévnek csak az első 3 karakterét, hogy megnézzük hogyan működik a wc -c. echo 012 | wc -c 4 Az echo 012 | wc -c eredménye 4, tehát eggyel több, mint ahány karakter van. Most másoljuk az 012 három helyére a fent megadott teljes fájlnevet, ellenőrizzük az eredményt. Megjegyzés: Egy útvonal maximális hossza 4096 karakter. A kernel forrásában a limits.h fejállományban van definiálva a maximális nagyság. * https://github.com/torvalds/linux/blob/master/include/uapi/linux/limits.h [...] #define NAME_MAX 255 /* # chars in a file name */ #define PATH_MAX 4096 /* # chars in a path name including nul */ [...] Ha gépünkön telepítve vannak a fejállományok, akkor ott is ellenőrizhetjük. 4.9.0-3-as kernel esetén: /usr/src/linux-headers-4.9.0-3-common/include/uapi/linux/limits.h ==== Fájlok keresése ==== === Keresés név alapján === Ha a fájlok nevei alapján szeretnénk keresni, használjuk a find parnacsot: find /usr/share -name *.png Az első paraméter, megmondja, hol keressünk. A -name kapcsoló után megmondom, milyen fájlokra vagyok kíváncsi. A példában a bármilyen fájlnév, aminek kiterjesztése .png, szeretném, látni a találati listában. Az aktuális könyvtártól is kereshetünk: find . -name "*.png" === Keresés tartalom alapján === Ha fájlokat tartalom alapján szeretnénk keresni, akkor használjuk a grep parancsot rekurzívan. Például szeretnénk megkeresni azokat a fájlokat, amelyekben szerepel Ian Murdock neve: grep -r -l "Ian Murdock" /usr/share/doc * A -r --recursive kapcsoló rekurzívvá teszi a keresést. * A -l --files-with-matches kapcsoló hatására csak a fájlok nevei jelennek meg. Használhatjuk a find parancsot is, de szükséges mellé a grep parancs: find . -name "*.txt" -print | xargs grep "Nagy József" Olyan .txt kiterjesztésű fájlokat keresünk, amelyben szerepel a "Nagy József" név. A -P --perl-regexp kapcsolóval Perl reguláris kifejezés is használható A find és grep parancsról később részletesen is szó esik. === locate === A locate parancs: A locate parancs telepítése: apt install locate locate minta Létezik egy /var/lib/mlocate/mlocate.db nevű adatbázis, amely segít megtalálni állományokat. Az adatbázis a következő paranccsal frissíthető: updatedb ==== Gyakorlat ==== * Milyen fájlszerkesztő parancsok vannak? * Milyen paranccsal hozhatunk létre egy új üres állományt? * Milyen paranccsal törölhetek egy állományt? * Milyen paranccsal nevezhetek át egy állományt? Írjon példát. * Milyen paranccsal mozgathatok egy saját könyvtáramból egy alkönyvtárba egy fájlt. Írjon példát. * Milyen paranccsal kérhetünk statisztikát egy fájlról? (jogok, elérése, változtatás, csere ideje). * Milyen paranccsal kereshetünk fájlokat név alapján? * Milyen paranccsal kereshetünk fájlokat tartalmuk alapján? ===== Billentyűzet használat ===== ==== Fogalmak ==== === Terminal === Egy billentyűzet és egy monitor, amely egy számítógéphez kapcsolódik. Eredetileg a nagygépes Unix rendszerekhez több terminál is csatlakozott. Esetleg egy PC-t is lehetett terminálként használni. A Linuxot ma leggyakrabban nem nagygépre, hanem egy PC-re telepítjük. A PC-hez pedig egyetlen monitor és billentyűzet kapcsolódik alapesetben. Mi ezt tekintjük most terminálnak. A Linux lehetővé teszi, hogy több felületen is belépjünk, mintha több terminálunk lenne. Ezek nem valódi terminálok, így a linuxos terminálokat "virtuális terminálként" szoktuk említeni. === Host === A nagyszámítógép, amelyhez a terminálok kapcsolódnak. Host számítógép alatt mi most PC-t fogjuk érteni, amelyen dolgozunk. === Teletype ASR33 === Az első Unix terminálok, amelyek egy billentyűzetből és egy nyomtatóból álltak. Rövidítve TTY. Egy Linuxos rendszeren parancssoros felületen 6 helyen léphetünk be. Ezeket teletype névvel illetjük az ASR33 teletype után. Szokás még terminál néven is említeni. ==== Parancsok ==== Terminál nevének kiíratása: tty Terminál paramétereinek beállítása: stty Paraméter nélkül kiírja a Linux milyen beállításokkal használja a terminált. Több információt nyerhetünk a "-a" kapcsolóval: stty -a A kisbetűk nagybetűvé alakítása: stty olcuc A kisbetűk nagybetűvé alakításának kikapcsolása: stty -olcuc További információkért lásd a man stty parancsot. Milyen terminált használunk: echo $TERM ==== Billentyűzetkódok ==== showkey ==== Gyakorlat ==== * Honnan ered a terminál elnevezés? * Mit jelent a host? * Írjon egy Teletype típust. * Milyen paranccsal írathatjuk ki a terminálunk nevét? * Milyen paranccsal állathatjuk be a terminálunkat? * Milyen paranccsal állatja be, hogy minden beírt betű nagybetűs legyen? * Melyik környezeti változó tartalmazza a terminálunk nevét? ===== Parancsok megtalálása ===== ==== A parancsokról ==== Jó néhány parancsot megismertünk, de általában szeretnénk a parancsokról többet megtudni. Esetleg azt is szeretnénk tudni, hogy a parancsokat megvalósító programok valójában hol találhatók. Esetleg szükségünk van egy parancsra de azt sem tudjuk hol, milyen néven keressük. A következő fejezet ezeket a problémákat járja végig. ==== Külső és belső parancsok ==== Alapvetően kétféle parancs van. Ezek: * belső * külső A parancsokat a parancsértelmező fogadja. A parancsértelmező először megnézi, hogy a kiadott parancsot ő maga fogja-e végrehajtani. Ha nem ismeri, akkor egy külső programot keres, amelyet futtat. ==== Belső parancsok ==== A belső parancsok gyűjteményéről a "help" parancs tájékoztat minket. help A help valójában egy belső parancs amit Bash értelmez. A help parancs paraméterezhető, lekérdezhető vele egy konkrét parancs lírása: help cd További opciók használatához kérjünk segítéget: help --help ==== Keresünk egy parancsot ==== Valamihez szeretnék parancsot találni. Például könyvtárkezeléshez keresek egy parancsot. Ha telepített rendszer magyar, akkor kereshetek magyar szavakra is. A parancsok kereséséhez egyik lehetséges program az apropos. Az apropos parancs, a parancsok leírásában keres azt a szót amit megadunk. Keressünk olyan parancsokat, amelyek a hardverrel kapcsolatosak. apropos hardware A program kiírja azoknak a programoknak a neveit amelyeknek a leírása tartalmazza a hardware szót. adjtime_config (5) - information about hardware clock setting and drift factor arch (1) - print machine hardware name (same as uname -m) discover (1) - hardware detection utility discover-pkginstall (8) - intsall packages for available hardware using disco... hwdb (7) - Hardware Database hwinfo (8) - probe for hardware report-hw (1) - dump information on the system's hardware SDL_GetVideoInfo (3) - returns a pointer to information about the video hardware sensors-detect (8) - detect hardware monitoring chips systemd-hwdb (8) - hardware database management tool tc-mqprio (8) - Multiqueue Priority Qdisc (Offloaded Hardware QOS) wdctl (8) - show hardware watchdog status Magyar nyelvű szóra is kereshetünk: apropos hardver Figyeljük meg, hogy a leírásból egy rövid kivonatot is közöl a parancsról, ami leírja mire való a parancs. $ apropos hardver hwclock (1) - a hardveróra (Real Time Clock) lekérdezése és beá... Ha valamelyik parancs felkeltette az érdeklődésünket és többet szeretnénk róla tudni, használjuk a man parancsot. man hwclock Ha elindítottuk a "man hwclock" parancsot, kilépni a "Q" billentyűvel tudunk. Időzítéssel kapcsolatos programok: apropos schedule Ext4 fájlrendszerrel kapcsolatos parancsok: apropos ext4 Az apropos nem csak parancsokat és programokat talál, mivel a leírás nem biztos, hogy programról vagy parancsról szól. Ha tudjuk egy parancsnak a nevét, és egy rövid leírást szeretnék mire is jó, akkor használhatjuk a whatis parancsot: whatis ls A parancsnak érdemes kipróbálni help paraméterét is: ls --help Néhány parancsnak több karakterből álló paramétere csak egy kötőjellel van bevezetve: -help. De az is lehet, hogy csak egy karakter kell: -h Ez mindig az adott program írójától függ. A szabvány szerint több karakteres opciókat mindig két kötőjellel vezetjük, az egy karaktereseket egy kötőjellel. ==== Hol található maga a program? ==== Előfordulhat, hogy szeretnénk tudni hol található egy program. Például egy scriptet akarunk írni, amelyben az egész útvonalat szeretnénk felvenni. Nekiállhatnánk keresni is, de van egy parancs amelyik megmondja hol van: which ls A which parancsot pontosan erre a célra találták ki. A kimenet újaban ez: /usr/bin/ls Próbáljuk meg más parancsokkal is. ==== Beépített parancs vagy önálló program ==== A type parancs segítségével megtudhatjuk egy adott parancsról, hogy azt a shell tudja, beépített parancsként, vagy valahol a fájlrendszerben egy önálló program. Maga a type bash shell része: $ type type Még néhány beépített parancs: $ type pwd pwd egy beépített parancs $ type cd cd egy beépített parancs Ha parancs nem shell parancs akkor kiírja annak útvonalát a which utasításhoz hasonlóan: $ type cp cp: /bin/cp ==== Kézikönyvek ==== Fentebb már láttuk, hogy a programok rövid leírását a whatis parancs megadja, a bővebb leírást pedig a "man". Ne felejtsük el, hogyan léphetünk ki a **man** parancs környezetéből. Ezt a "**q**" billentyű lenyomásával tehetjük meg. man ls A kézikönyvek nem csak parancsokat írnak le. Kézikönyvük van a rendszerhívásoknak, az osztott könyvtáraknak, a speciális fájloknak (például dev), fájlformátumoknak, unixos játékoknak, a rendszer-adminisztrátori parancsoknak és a kernel rutinoknak. === Kézikönyv típusok === A kézikönyv, angolul manual, innen a parancs röviden: man. A kézikönyveknek 9 típusra oszthatók. Ezek: - Futtatható programok vagy shell parancsok - Rendszerhívások (a kernel függvényei) - Osztott könyvtári függvények - Speciális fájlok (rendszerint /dev) - Fájlformátumok, konverziók (pl. /etc/passwd) - Jétékok - Egyéb (makrócsomagok, man(7), groff(7) - Rendszer-adminisztrátori parancsok (a root felhasználó számára) - Kernel rutinok Az eredeti Unix kézikönyveknek csak 7 típusa volt, Linuxban ez 9-re bővült. === A kézikönyvek fejezetei === Egy kézikönyv a következő fejezetekre tagolható: * NAME - rövid leírás * SYNOPSIS - szintaktikai leírás, vagy áttekintés * CONFIGURATION - beállítások * DESCRIPTION - leírás * OPTIONS - kapcsolók * EXIT STATUS - kilépési kódok * RETURN VALUE - visszatérési érték * ERRORS - hibák * ENVIRONMENT - környezet * FILES - fájlok * VERSIONS - verziók * CONFORMING TO - egyezések * NOTES - megjegyzések * BUGS - a program hibái * EXAMPLE - példák * AUTHORS - tulajdonos * SEE ALSO - "lásd még" Ezeken kívül, kézikönyvenként előfordulhatnak egyedi fejezetek is, ha leírás azt igényli. === Példák === Nézzünk néhány példát: A ps parancs: man ps A chmod parancs: man chmod A chown parancs: man chown === Más nyelvek === Előfordulhat, hogy szeretnénk egy parancs eredeti angol nyelvű verzióját megnézni, mert a magyar nyelvűben nem találjuk a keresett információt (ez előfordulhat, ha például a magyarítást nem frissítették az adott programnál). A Debian GNU/Linux 6.x-es rendszerben például a magyar ps kézikönyv nem tartalmazza a <, N, L, s, l, + státuszok leírását. Az angol nyelvű verzióban azonban megtaláljuk. A nyelv beállításhoz használjuk a -L kapcsolót: man -L en ps A nyelvet az ISO-639 szabvány szerint kell beírni. ==== Gyakorlat ==== * Hogyan tudom megnézni a "cd" belső parancshoz tartozó segítő leírást? * Hogyan tudom megnézni a crontab parancshoz tartozó 5-ös típusú kézikönyvet? * Milyen fejezetekből állhat egy kézikönyv? * Milyen paranccsal tudom megnézni, hogy a firefox parancs hol található a fájlrendszerben? * Milyen paranccsal kereshetek parancsokat? * Milyen fejezetei vannak az mkfs parancs kézikönyvének? ===== Parancsok ===== ==== Szintaxis ==== A szintaxis a parancsok kiadásának formális leírása. A parancsot begépelve **parancssornak** nevezzük. A Linuxos rendszerben egymás után több parancsot is beírhatok pontosvesszővel tagolva: parancs1 ; parancs2 ; parancsN A parancsokat && karakterpárossal is tagolhatjuk: parancs1 && parancs2 Ekkor a parancs2 csak akkor fog végrehajtódni, ha az első sikeres volt. A prancssort két részre lehet osztani. A parancs neve és az argumentumok. Példa: ls -1 -F fajlnev1 A példában az ls a parancs neve ami után jön az pedig mind argumentum. Itt az ls parancsnak három paramétere van. Az argumentumokat kapcsolókra és paraméterekre osztjuk fel. | Parancssor ||| | parancsnév | argumentumok || | parancsnév | kapcsolók | paraméterek | ==== Opciók ==== Kapcsolók vagy opciók a parancs nevét követik. Egy vagy két kötőjel vezeti be őket. Ha egy kötőjel van, átláthatóbb egy hosszú parancssor. Ha hosszú formát használjuk olvashatóbb. Hogy egy-egy parancs esetén mi van megvalósítva, az csak a programozón múlik. Az opciók módosítják a parancs végrehajtását. | -F | --classify | | -a | --all | | -s | --size | ==== Paraméterek ==== A paraméterek az opciókat követik. Egy vagy több is lehet belőlük. A paraméterek határozzák meg, min kell végrehajtani a parancsot. ls -1 -F file1 file2 file3 Két opció: -1 -F Három paraméter: file1 file2 file3 ==== Összevonható opciók ==== ls -1 -F file1 ls -F -1 file1 ls -1F file1 ls -F1 file1 A -1 és -F opciókat egyetlen kötőjellel is megadhatom. Ilyenkor a két opciót leírom egymás mellé. A sorrend lényegtelen. ==== Whitespace karakterek ==== Whitespace karakter a szóköz és a tabulátor, sortörés stb. A parancs neve, az opciók és a paraméterek között szóköz vagy tabulátor egy vagy több is szerepelhet: ls -l-Ffile1 ls -l-Ffile1 ls -l-Ffile1 A parancsot pedig egy sortöréssel zárjuk. ==== Az előző argumentum felhasználása ==== Az előző argumentumot felhasználhatjuk !$ beírásával. mkdir Dokumentumok cd !$ Használhatjuk az +<.> billentyűkombinációt is. ==== Előző parancs használata ==== Tegyük fel, hogy szeretnénk létrehozni a dir1 könyvtárban egy dir2 könyvtárat. Beírjuk: mkdir dir1/dir2 De kiderül, hogy a dir1 könyvtár nem is ebben a könyvtárban van. A megfelelő könyvtárba váltunk, majd megismételjük a parancsot: !! ==== Parancsok több sorban ==== A parancsokat több sorban is írhatjuk, a "\" karakter segítségével. Legyen például a következő parancs: ls -l -i -a /usr/share/doc Két sorba írhatjuk, ha "\" karaktert írunk az első sor végére: $ ls -l -i -a \ > /usr/share/doc A mintába beírtam a várakozási jelet is, ami az első sorban "$ ". Ha "\" karaktert írunk az első sor végére, a következő sorban, a másodlagos várakozási jel jelenik meg, ami alapértelmezetten ">" karakter. Ez után folytathatjuk a parancsot. Törhetjük akár több sorba is a parancsot: $ ls \ > -l \ > -i \ > -a \ > /usr/share/doc ==== Gyakorlat ==== * Mi az opció? * Mi a paraméter? * Mutasson példát az opciók felcserélhetőségére. * Mi a Whitespace? * Hány Whitespace szerepelhet egy parancs neve után? * Milyen karakterrel kell a sor végére írni, ha a parancsot a következő sorban szeretnénk folytatni? ===== Átirányítások ===== ==== Szabványos fájlok ==== A Unix rendszerből származnak a szabványos fájlok. Fájloknak nevezzük, mert fájlként is elérhetők. Az alábbi táblázat egy összefoglalót ad ezekről. | 0 | stdin | Standard Input | billentyűzet | | 1 | stdout | Standard Output | képernyő | | 2 | stderr | Standard Error | képernyő | A programozó feladata, hogy olyan programot írjon, amely a külön kimenetre írja a normál kimenetet és a hibakimenetet. Az így megírt programok kimenetét szét tudjuk válogatni, külön fájlokba. === stdin === Az stdin a Standard Input rövidítése, magyarul szabványos bemenet. Ez alapértelmezetten a billentyűzet, azonosítója a 0. === stdout === Az stdout a Standard Output rövidítése, magyarul szabványos kimenet. Ez alapértelmezetten a képernyő, azonosítója 1-s. === stderr === Az stderr a Standard Error rövidítése, magyarul szabványos hibakimenet. Ez is alapértelmezetten a képernyő, azonosítója 2-s. ==== Átirányítás fájlba vagy fájlból ==== === A cat parancs === A cat parancs egy olyan parancs, amely szabványos bemenetről olvas (stdin), és szabványos kimenetre (stdout) ír. Próbáljuk ki. Csak írjuk be, hogy cat, majd Enter. A következő példában, néhány leütött billentyűt is beírtam: cat alma alma körte körte + Az Enter után, a cat szabványos bemenetről, azaz a billentyűzetről vár adatokat. Beírjuk, hogy alma, ekkor befejeződik a sor bevitele, a cat kiírja az alma szót a szabványos kimenetre. Ezt követően egy újabb sorban a cat megint a szabványos bemenetről vár adatokat. Beírjuk körte, az Enter megnyomása után, megint a szabványos kimenetre ír. A folyamatot a Ctrl+d billentyűkombinációval szakítjuk meg. === Az alapértelmezett kimenet átirányítása === Most a billentyűzetről fogunk olvasni, a kimenet az stdout helyett viszont egy állomány lesz. Az átirányítást a nagyobb-mint (>) karakterrel fogjuk megvalósítani. A gyumolcs.txt fájl tartalmát a képernyő helyett a gyumolcs2.txt fájlba irányítom: cat > gyumolcs.txt szilva barack körte alma+ A bevitelt a + billentyűkombinációval szakítjuk meg, amellyel tulajdonképpen "fájlvége jelet" küldünk a rendszernek. Bármely program, ha a stdout-ra (képernyőre) ír annak kimenetét átirányíthatjuk fájlba. === Az alapértelmezett hibakimenet átirányítása === Néhány program a normál üzenetek mellett hibaüzeneteket is a képernyőre íródnak. Ezek a hibaüzenetek nem kerülnek fájlba az előbbi átirányítás esetén: A hibaüzenetek átirányítását is megoldhatjuk azonban: Tegyük fel, hogy nem létezik az aktuális könyvtárban nincs "aaaa" nevű könyvtár és fájl sem, amikor kiadjuk a következő parancsot: ls aaaa Az eredmény a képernyőre íródik. ls: aaaa nem érhető el: Nincs ilyen fájl vagy könyvtár Ha ezt megpróbáljuk fájlba irányítani a fenti módon nem járunk sikerrel, mivel ez az az üzenet a stdout helyett a stderr-re íródik. Persze alapértelmezetten az is képernyő. Az alapértelmezett kimenet száma a "2". Meg kell mondanunk, hogy a 2-es számú kimenet szeretnénk fájlba irányítani: ls aaaa 2> a.txt Ezek után a képernyőre nem ír semmit a parancs. Az a.txt fájlban viszont: ls: aaaa nem érhető el: Nincs ilyen fájl vagy könyvtár === A bemenet átirányítása === A gyumolcs.txt fájl tartalmát a képernyőre írom: cat < gyumolcs.txt A cat bemenete alapértelmezetten a billentyűzet. Mi most azt mondtuk, hogy ez egy fájl legyen. === A bemenet és kimenet együttes átirányítása === Az adatokat a gyumolcs.txt fájlból vesszük. A gyumolcs.txt fájl tartalmát a képernyő helyett a gyumolcs2.txt fájlba irányítom: cat < gyumolcs.txt > gyumolcs2.txt Ha a fájl nemlétezik akkor létrehozza. Ha létezik felülírja. === Hozzáfűzés === A kimenet átirányítását a nagyobb-mint (>) karakterrel végeztük. Ez mint láttuk felülírja a létező fájlt. Néha azonban ezt szeretnénk elkerülni, és szeretnénk a már meglévő fájl végéhez fűzni. Ezt kettő darab nagyobb-mint jel egymásután írásával érjük el: echo "banán" >> gyumolcs.txt A fenti parancs a gyumolcs.txt fájl végéhez fűzi a "banán" szöveget. === Az stdout és az stderr együttes átirányítása === Néha szeretnénk a hibaüzeneteket és a normál üzeneteket is fájlba irányítani. Az alábbi program normál és hibaüzeneteket is generál. program > kimenet 2>&1 vagy: program &> kimenet.txt A kimenet stdout és az stderr képernyőre és fájlba írása, példa: dir letezofaj.txt nemletezofajl.txt 2>&1 | tee kimenetifajl.txt A "tee" parancs egyszerre ír fájlba és a képernyőre. A parancs után a képernyőn és a kimenetifajl.txt állományban is: dir: nemletezofajl.txt nem érhető el: Nincs ilyen fájl vagy könyvtár letezofajl.txt === A stderr és stdout háttere === Az alapértelmezett kimenet és az alapértelmezett hibakimenet szétválasztása a programozásnál kezdődik. A megértéshez vegyünk egy egyszerű C programot, amely a képernyőre ír. Képernyőre ír például a printf() függvény: printf("Egy\n"); Ugyanezt csinálja a következő utasítás is: fprintf(stdout, "Egy\n"); Csak itt meg kellett adni, hogy az alapértelmezett kimenet nevét: stdout. A következő utasítás azt mondja, hogy írjunk az alapértelmezett hibakimenetre: fprintf(stderr,"Három\n"); A programozó tehát néha azt mondhatja, hogy írjunk a képernyőre, de legyen megkülönböztetve a példában a "Három" szó kiíratása, mert az a hibakimenetre megy. A "\n" az sortörés. Lássunk egy komplett programot: #include main() { printf("Egy\n"); fprintf(stdout, "Kettő\n"); fprintf(stderr, "Három\n"); } A programban a "Egy" és "Kettő" szavak az alapértelmezett kimenetre mennek. Az alapértelmezett kimenet száma 1. A "Három" szó viszont a már a hibakimenetre megy, melynek száma 2. Ha gépünkön telepítve van a gcc fordító, akkor fordítsuk le a programot: gcc -o main main.c Elkészül egy main nevű állomány. Ha futtatjuk: ./main a képernyőre íródik mind a három szám: Egy Kettő Három Most használjuk az átirányítást. Irányítsuk fájlba az alapértelmezett kimenetet: ./main > naplo.txt vagy: ./main 1> naplo.txt Ekkor a "Három szót a képernyőre íjra a program, az "Egy" és a "Kettő" viszont a naplo.txt nevű állományba kerül. Most irányítsuk az alapértelmezett hibakimenetet a állományba: ./main 2> naplo.txt Most a képernyőre íródik az "Egy" és a "Kettő" szó, a "Három" pedig állományba. Ha pedig mind két kimenetet állományba szeretném irányítani, akkor: ./main &> naplo.txt Ekkor mind a három szó fájlba kerül. Láthatjuk, hogy a stdout és stderr technika lehetővé teszi, hogy elválasszuk egy program normál üzeneteit a hibaüzenetektől, ami céljainktól függően néha nagyon jól jöhet. ==== Átirányítás program számára ==== A következőkben a szintén átirányítást fogunk használni, azonban most egy másik program számára adjuk át a kimenetet. Ezt a pipe (|) karakter segítségével valósítjuk meg. cat gyumolcs.txt | sort ==== Többszörös átirányítás ==== Létrehozunk egy állományt. cat > gyumolcs3.txt körte szilva barack alma szilva+ Az állomány tartalmaz néhány ismétlődést. Ezt kezelni tudjuk az uniq paranccsal. Az uniq parancs azonban csak rendezett állománnyal képes dolgozni. Először tehát rendeznünk kell a tartalmat. cat gyumolcs3.txt | sort | uniq Esetleg ha szeretnénk megszámoltatni a sorok számát is, akkor: cat gyumolcs3.txt | sort | uniq | wc -l Az egésznek az eredményét pedig ugyancsak fájlba irányíthatjuk: cat gyumolcs3.txt | sort | uniq | wc -l > gyumolcsszam.txt ==== Fájl tartalmának törlése ==== A ">" karakter önmagában is kiadható, mint egy parancs. Ha utána írunk egy állományt, annak tartalma törlődik. Így használható állományok tartalmának törlésére: > vmi.txt ==== Gyakorlat ==== * Mi a stdin? * Mi a stdout? * Mire használjuk a "<" karaktert? * Mire használjuk a ">" karaktert? * Mire használjuk a "|" karaktert? * Mit csinál a 2> átirányítás? * Mit csinál a 1> átirányítás? * Mit csinál a &> átirányítás? * Írassuk a ki a belépett felhasználók neveit, a kimenetet a users.txt fájlba irányítva. * Mit csinál a következő parancs: > gyumolcsok.txt ===== Útvonal ===== ==== Az útvonalról ==== Egy parancsot úgy tudunk végrehajtani, ha tudjuk melyik könyvtárban van, akkor beírjuk az útvonalát és egy -t nyomunk. Például gcc paranccsal szeretnénk egy programot lefordítani, akkor ezt írhatjuk: /usr/bin/gcc -o main main.c Ehhez tudnunk kell, hogy a gcc parancs az /usr/bin könyvtárban van. Szerencsére nem kell ezt nekünk megjegyezni. A rendszer biztosít számunkra egy PATH nevű környezeti változót. Ha ez tartalmazza az /usr/bin karaktersorozatot akkor a gcc parancs kiadásánál a parancsértelmező megnézi, hogy van-e az /usr/bin/ könyvtárban gcc parancs. Ha van akkor végrehajtja. Persze a PATH változóban egyszerre több útvonal is megadható, egymástól kettősponttal elválasztva. Felhasználóként az útvonal nekem például így néz ki: /home/andras/bin:/usr/local/bin:/usr/bin:/bin:/usr/games Ezt le tudjuk kérdezni például az "echo" paranccsal, mint azt már fentebb tettük a PS1 környezeti változóval: echo $PATH Próbáljuk ki a parancsot. A parancsértelmező ezekben a könyvtárakban keresi az általunk kiadott parancsot. Ha a parancs útvonala nincs a PATH változóban, akkor kénytelen vagyunk beírni az útvonalat. Ilyen parancs lehet például az ifconfig, amely a hálózati kártyák beállítását kérdezi le. Az ifconfig parancs a /sbin könyvtárban van, ami az átlag felhasználónak nincs útvonalban. Igaz a felhasználó nem végezhet vele beállításokat, de a kártya beállításait lekérdezheti. Ehhez viszont meg kell adnia a teljes elérési utat: /sbin/ifconfig Felmerülhet a kérdés, mi van akkor ha egy parancs több könyvtárban is szerepel, amelyik útvonalban van. Ekkor az a parancs hajtódik végre, amelyik a PATH változóban hamarabb szerepel. Ha a másik parancsot szeretnénk, akkor meg kell adjuk a teljes elérési utat. ==== Útvonal beállítása ==== Parancssor beállítása általánosságban: export PATH=$PATH:/új/útvonal A példa kedvéért a joska nevű felhasználó szeretné beállítani a saját könyvtárában (/home/joska) lévő "programok" nevű könyvtárat útvonalba. Ekkor parancssorban kiadjuk a következő parancsot: export PATH=$PATH:/home/joska/programok Ezek után a /home/joska/programok nevű mappában lévő program futtathatók bárhonnan. Ez az útvonal így csak az aktuális konzolon lesz elérhető. Ha kilépünk, akkor már nem. Ha szeretnénk újra- belepés, indítás után is elérni akkor be kell másolnunk például a /home/joska/.bashrc fájl utolsó sorába. Ez után a következő belépés után az útvonalnak élnie kell. A .bashrc fájlt szerkeszthejtük így: mcedit /home/joska/.bashrc Vagy ha éppen a /home/joska könyvtárban állunk akkor csak röviden: mcedit .bashrc Parancssorból egyetlen paranccsal is megoldhatjuk a fájl végére írást: echo "export PATH=$PATH:/home/joska/programok" >> /home/joska/.bashrc Ha ezt használjuk, akkor vigyázzunk a kettő darab nagyobb-mint jelre. Ha csak egyet írunk, akkor felülírjuk az egész .bashrc fájlt. Ha biztosra akarunk menni akkor előbb készítsünk róla biztonsági másolatot: cp /home/joska/.bashrc /home/joska/.bashrc_mentes ==== Gyakorlat ==== * Az operációs rendszer hol tárolja a parancsok útvonalait? * Hogyan tudjuk megtekinteni az aktuális útvonalakat? * Milyen paranccsal állítom be az útvonalat? * Állítsuk be saját könyvtárunkban létrehozott prg nevű könyvtárban is keresse a parancsértelmező a parancsokat. ===== Környezet ===== ==== A környezetről ==== Belépés után a rendszer, egy környezetet biztosít számunkra. Kapunk egy parancsértelmezőt és különböző változókat. Lesz egy saját könyvtárunk, amit home könyvtárnak is hívunk. A home fiókok a /home főkönyvtárban kapnak helyet, alapértelmezetten. Minden felhasználó könyvtárába megjelenik két állomány is: .bashrc .profile ==== A history ==== A könyvtárunkban az első használat során létrejön egy állomány: .bash_history Ebben tárolódnak a használt parancsaink. Parancssorban a le és fel billentyűkkel lapozhatjuk az eddig használt parancsokat. Keresésre is lehetőség van. Ez akkor hasznos, ha már régen használtuk a parancsot, így könnyebb megtalálni. Legyen a régen használt parancs például: ssh -i ~/.ssh/janos_zold_rsa janos@zold.and A kereséshez elsőként nyomjuk meg a + billentyűt. Ekkor a következő várakozási jel jelenik meg: (reverse-i-search)`': Írjuk be: ssh -i Írás közben a keresési eredmények rögtön megjelennek. Ha azt a parancsot látjuk, amelyet szeretnénk alkalmazni, csak nyomjuk meg a billentyűt. A parancs ezek után várja, hogy az billentyűvel végrehajtsuk. A használt parancsokat a history nevű paranccsal is megjeleníthetjük. Egy idő után olyan sok parancs van, hogy túl fut a képernyőn. A more vagy a less szűrővel, tördelhetjük a képernyőt: history | less ==== Gyakorlat ==== * Melyik az a két állomány, ami a felhasználó létrehozásakor annak könyvtárába másolódik. * Mit tárol a Linux a historyban? * Milyen billentyű kombinációval kereshetünk a használt parancsok között? ===== Archiválás ===== Az archiválás nem egyenlő a tömörítéssel. Az archiválás azt jelenti több könyvtárat és/vagy fájlt egyetlen fájlba mozgatunk, vagyis egyetlen fájlként szeretnénk kezelni. Erre a **tar** parancs használható. ==== Archiválás ==== A konyvtar nevű könyvtár és tartalmát szeretnénk az fajlnev.tar állományba elhelyezni. A következő parancsot használhatjuk: tar -cf fajlnev.tar konyvtar A -cf tulajdonképpen két kapcsoló, egy -c és egy -f, de azok összevonhatók. A -c create szóból, az archív elkészítésre utal, a -f pedig a fájlra, vagyis utána adjuk meg az archív fájl nevét. ==== Archív csomag kibontása ==== Egy .tar archív a -x kapcsolóval csomagolható ki. A x a eXtract szóból van. Példa egy fájl kibontására: tar -x -f fajlnev.tar ==== Archiválás tömörítéssel ==== tar -czf archive.tar.gz konyvtar * A -c kapcsoló megmondja, hogy készíteni kell egy archivot. * A -z megmondja, hogy archivot tömöríteni is kell. * A -f után adjuk meg a kimeneti fájl nevét * A kimeneti fájl a példában a: archive.tar.gz * A "konyvtar", amit archiválni és tömöríteni kell. A példában a -c, -z és -f kapcsolókat halmoztuk: -czf Halmozás nélkül az eredeti parancs: tar -c -z -f archive.tar.gz konyvtar A tömörített archive kibontása: tar -xf archive.tar eXtract [UK: ɪkˈstrækt] [US: ɪkˈstrækt] kibont Tömörített archive kibontása: tar -xzf archive.tar.gz Használt kapcsolók * -c, --create * -f, --file fájlnév * -z, --gzip, --ungzip * -x, --extract, --get * -t, --list * -W, --verify (-c kapcsolóval) * -v, --verbose bőbeszédű verify [UK: ˈverɪfaɪ] [US: ˈverəˌfaɪ] átvizsgál, bizonyít, ellenőriz ==== Gyakorlat ==== * Adott három állomány: ser1, ser2, ser3. * Archiválja őket egy ser.tar nevű fájlba * Adott a ser.tar nevű archív fájl. * Csomagolja ki a tar parancs segítségével. * Adott a ser.tar nevű archív fájl. * Listázza ki, milyen állományok vannak benne. * Készítsen a dir1 nevű könyvtárról egy archívumot. * Archiválás közben ellenőrizze a fájlokat. * Adott három állomány: ser1, ser2 ser3. * Számolja ki, hány bájt összesen a 3 fájl. * Archiválja a 3 fájlt egy állományba. * Írassa ki, hány bájt lett az archív fájl. ===== Tömörítés ===== ==== A Linuxos tömörítő programokról ==== Linux alatt szinte minden tömörítő eljárás megvalósításra került. A következő lista a teljesség igénye nélkül tartalmaz tömörítő programokat: * xz * arc * gzip * bzip2 * pbzip2 * lrzip * lzip * p7zip * rzip (nagy fájlokhoz) * ncompress (csomag; parancs: compress) További parancsokért nézzük meg a gzip kézikönyvét: man gzip További csomagokért nézzünk szét a csomagok között: apt-cache search compress ==== Tömörítés ==== Tar fájl tömörítése: gzip fajlnev.tar Eredmény: fajlnev.tar.gz ==== Kibontás ==== gunzip fajlnev.tar.gz Eredmény: fajlnev.tar ==== Az xz tömörítő ==== Mostanában népszerű a xz-utils csomagban található tömörítő program. Az LZMA2 algoritmust használja. Az xz tulajdonképpen a 7z lecsupaszított változatának is tekintik (A 7z bzip2, LZMA2 és LZMA eljárásokat kombinálja). Tömörítés: xz fajlnev.tar Kapunk egy fájlt fajlnev.tar.xz nevű fájlt. Kibontás: unxz fajlnev.tar.xz Az xz-utils telepítésével létrejön egy lzma nevű szimbolikus link is. Így használható ez is tömörítésre: lzma fajlnev.tar Ennek eredménye egy fajlnev.tar.lzma csomag. Néhány esetben ez jobb tömörítési arányt adhat mint az xz parancs. ==== zcat ==== A zcat tömörített fájlok tartalmát jeleníti meg. zcat /var/log/user.log.2.gz ==== zless ==== A zcat tömörített fájlok tartalmát teszi lapozhatóvá. zless /var/log/user.log.2.gz ==== zgrep ==== A zgrep tömörített fájlok tartalmát szűrhetővé teszi. zgrep postfix /var/log/user.log.2.gz ===== Folyamatkezelés ===== ==== A folyamatokról ==== A programról **"program"** néven beszélünk amíg az egy **háttértárolón** van. Ha **elindítottuk** a programot, akkor bekerül a memóriába, ekkor **folyamatról** beszélünk. A folyamat tehát egy futó program a memóriában, másként végrehajtás alatt lévő program. Angolul task vagy process néven találkozunk vele. Az átlagfelhasználó persze nem szokta ezeket neveket használni, egyszerűen csak programként beszél róla. A folyamatok újabb folyamatokat indíthatnak. Amikor elindítunk egy parancsot, azt eleve egy parancsértelmező programban tesszük. A parancsértelmezőből indított folyamat szülője maga a parancsértelmező. Valójában minden folyamat visszavezethető a hierarchiában egy közös ősfolyamatra, ennek neve: "init". ==== Folyamatok előállítása ==== A folyamat előállítása, tulajdonképpen egy program futtatása. Két eset lehetséges, a rendszer vagy tudja hol van az elindítani kívánt program, vagy mi magunk mondjuk meg hol találhatók azok. A következő lista azon könyvtárakat sorolja fel, ahol nagy valószínűséggel találunk indítható programokat: * /bin * /sbin * /usr/bin * /usr/sbin Egyéb helyek: * /usr/games * /usr/local/bin * /usr/local/sbin Szeretnénk például futtatni az ifconfig parancsot. Írjuk be: /sbin/ifconfig Vagy a dmesg parancs: /bin/dmesg Ha egy parancs [[oktatas:operációs_rendszerek:témakörök#útvonal|útvonalban]] van, akkor nem kell megadnunk a teljes útvonalat. Elég az ifconfig, vagy a dmesg parancs kiadása. Ha egy parancs az aktuális könyvtárban van, végigírhatjuk a teljes útvonalat, vagy a "./" karakterpárossal jelzem, hogy helyben keresendő a parancs. A felhasználóknak szokás a saját könyvtárukban egy "bin" nevű könyvtár létrehozása, amelyben elhelyezhetik saját programjaikat, scriptjeiket. A joska felhasználó például ide rakja saját programjait: /home/joska/bin/ A folyamatok száma a rendszerben korlátozott. A maximálisan létrehozható folyamatok száma alapértelmezésben: 32768. A rendszeredben a maximális értéket így derítheted ki: cat /proc/sys/kernel/pid_max Egy felhasználó azonban nem hozhat létre 32768 számot. A felhasználói limit lekérdezése: ulimit -u ==== Folyamatok listázása ==== A folyamatok vagy angolosan processzek a ps parancs segítségével listázhatók. Paraméter nélkül használva csak az aktuális terminálról indított folyamatokról informál minket: ps PID TTY TIME CMD 8205 pts/2 00:00:00 bash 8215 pts/2 00:00:00 ps Indítsunk három folyamatot, amelyet rögtön a háttérbe is teszünk: nano & mcedit & yes > /dev/null & A folyamataink megtekintése: ps PID TTY TIME CMD 2975 pts/0 00:00:00 bash 22403 pts/0 00:00:00 nano 22407 pts/0 00:00:00 mcedit 22409 pts/0 00:02:59 yes 22411 pts/0 00:00:00 ps Nézzük meg milyen állapotban vannak a háttérbe tett folyamatok (ps a): ... 22403 pts/2 T 9:58 nano 22407 pts/2 T 0:00 mcedit 22409 pts/2 R 0:00 yes ... A harmadik oszlop mutatja a státuszokat. Az R futó (runing), a T megállított (terminate, de lehet trace vagyis nyomkövetett. Láthatjuk, ahogy a nano és az mcedit programokat háttérbe tettük, azok megállított állapotba kerültek. A yes parancs viszont futó állapotba került. A yes parancs csak az y karaktert írja a képernyőre szünet nélkül. Mi persze ezt a /dev/null-ba irányítottuk. Amikor az "&" karakterrel háttérbe tesszük a folyamat nem áll meg. Megnézhetjük az össze folyamatot a ps ax paranccsal: ps ax A kapcsolókat nem vezettük be kötőjellel. Ezek után ehhez hasonló kimenetet láthatunk (részlet másolata): PID TTY STAT TIME COMMAND ... 4244 ? S 0:01 /usr/sbin/apache2 -k start 4245 ? S 0:00 /usr/sbin/apache2 -k start ... 8474 ? S 0:01 [kworker/1:2] 8509 ? R 0:01 [kworker/1:1] 8572 pts/2 R+ 0:00 ps ax A PID oszlop tartalmazza a folyamatazonosítókat (process identity) az első oszlopban. A TTY oszlop azt mutatja, hogy a folyamat TeleTYpe-hoz van-e kötve. A szolgáltatást nyújtó démon programok nincsenek. A STAT oszlop a folyamat állapotáról tájékoztat. A TIME oszlop mutatja, hogy a processzor idejéből mennyit használ. Az utolsó oszlopban (COMMAND) a futtatott parancs nevét látjuk kapcsolókkal együtt. A -f kapcsoló a full szóból ered, használata teljes kiemenet ad: ps ax -f Az "f" alparancs viszont megmutatja a gyermek szülő kapcsolatokat: ps axf Például egy részlet: 1366 ? Ss 0:00 /usr/sbin/apache2 -k start 2522 ? S 0:00 \_ /usr/sbin/apache2 -k start 2523 ? S 0:00 \_ /usr/sbin/apache2 -k start 2524 ? S 0:00 \_ /usr/sbin/apache2 -k start 2525 ? S 0:00 \_ /usr/sbin/apache2 -k start 2526 ? S 0:00 \_ /usr/sbin/apache2 -k start A folyamatot indító felhasználók mutatása: ps axu ^ STAT mező ^^ | R | futó (runing) vagy futáskész (runable) | | S | alvó (sleeping) de megszakítható | | D | nem megszakíthatóan alvó (uninterruptible sleep) rendszerint IO | | T | megállított (job kontroll; stoped) vagy nyomkövetett (traced) | | Z | zombi (zombie) véget ért a futása, de a szülője még nem szüntette meg | | X | halott (valószínűleg sosem látható) | | t | nyomon követés miatt leállítva | | P | parkolt | | I | tétlenség (idle) | A STAT mezőhöz járulékos jelzések adhatók a BSD szerinti formátumban. A man -L en ps kézikönyvben találunk róla infot: | < | magas prioritás (más felhasználó nem tudja felülírni) | | N | alacsony prioritás (más felhasználó felülírhatja | | L | a lapok a memóriába vannak zárva (valós idő eléréséhez és IO tevékenységhez | | s | vezető munkamenet | | l | többszálas (CLONE_THREAD használata, az NPTL pthreads-hez hasonló tevékenység) | | + | folyamat csoport az előtérben | A folyamatok állapotai az fs/proc/array.c állományban vannak leírva, a task_state_array[] tömbben. Néhány példa: ps -f UID PID PPID C STIME TTY TIME CMD andras 22290 22151 0 07:32 pts/5 00:00:00 bash andras 23071 22290 0 11:40 pts/5 00:00:00 ps -f * UID felhasználó azonosító * PID folyamatazonosító * PPID szülőfolyamat azonosítója * C processzor kihasználtság * STIME indulási idő * TTY melyik teletájphoz van kötve * TIME felhalmozott processzoridő * CMD indító parancs Egy paraméterek esetén, pl. -f: * USER A folyamat tulajdonosa * %CPU A CPU idő osztva a folyamat futási idejével. * %MEM A folyamat rezidens része a fizikai memóriában * VSZ Az egész folyamat virtuális-memória használata (KiB) * RSS A folyamat azon része, amely a fizikai memóriában van (KiB) * STAT Többkarakteres folyamatállapot * START A folyamat indulási ideje vagy dátuma * COMMAND parancs az összes argumentummal === Felhasználói oszlopok === ps -o pid,stat,cmd PID STAT CMD 3823 Ss bash 4582 R+ ps -o pid,stat,cmd ps a -o user,tty,cmd === Szülő folyamatok PID száma === A -ef kapcsolópárossal a folyamatok szüleinek PID-t is láthatjuk, ez a PPID. Az oszlopok ekkor így néznek ki: UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:24 ? 00:00:01 /sbin/init root 2 0 0 10:24 ? 00:00:00 [kthreadd] root 3 2 0 10:24 ? 00:00:00 [ksoftirqd/0] root 4 2 0 10:24 ? 00:00:00 [kworker/0:0] root 5 2 0 10:24 ? 00:00:00 [kworker/0:0H] ... === Zombi folyamatok listázása === ps ax | grep -w Z === Szülők és gyermekek === A postfix gyermekei: ps -ef --forest | grep -v grep | grep postfix Az apache2 gyermekei: ps -ef --forest | grep -v grep | grep apache2 ps f -C apache2 ==== Folyamatok leállítása ==== === Folyamat leállítása normál módon === A folyamatot elsőként mindig próbáljuk meg normál módon leállítani, a 15-ös jelzéssel. Ha ez nem megy, csak és csakis akkor forduljunk a 9-es jelzéshez. kill -15 PIDSZÁM === Folyamat leállítása mindenképpen === kill -9 PIDSZÁM A PIDSZÁMOT a "ps ax" parancs kimenetéből nézhetjük ki. Ha leállítandó program azonosítója 4852, akkor így állítjuk le: kill -9 4852 A Linuxos rendszerben a folyamatok jelzésekkel kommunikálnak egymással. A használható jelzéseket kilistázhatod a következő paranccsal: kill -l További információkat olvashatsz a jelzésekről a man7 signal kézikönyvből. Egy folyamat egyes jelzéseket figyelmen kívül hagyhat, másokat kötelezően figyelembe kell vennie. Egyes jelzéshez tartozik alapértelmezett művelet, egyesekhez nem. Az alábbi táblázatban 31 jelzést látunk. Ezek az első Bell Laboratórium létrehozott Unixból származnak. A POSIX szabvány alapján, további jelzésekkel egészült ki a jelzések listája, 34-től 64-ig. man 7 signal kézikönyv alapján: ^ Jel ^ Azonosító ^ Tevékenység ^ Leírás ^ | HUP | 1 | Term | A kontroll terminál megszűnt (A felhasználó kilépett) \\ vagy démon esetén újra kell olvasni a konfigurációs fájlokat | | INT | 2 | Term | Megszakítás a billentyűzetről (Ctrl + C) | | QUIT | 3 | Core | Kilépés a billentyűzetről | | ILL | 4 | Core | Illegális utasítás | | ABRT | 6 | Core | Leállítási jelzés az abort(3) függvénytől | | FPE | 8 | Core | Lebegőpontos kivétel | | KILL | 9 | Term | Semlegesítő jel | | SEGV | 11 | Core | Érvénytelen memóriahivatkozás | | PIPE | 13 | Term | Eltört cső (pájp): írás vagy olvasás nem létező csőbe | | ALRM | 14 | Term | Időzítőjel az alarm(2)-től | | TERM | 15 | Term | Megszakításjel | | USR1 | 30,10,16 | Term | Felhasználó által definiált jelzés 1 | | USR2 | 31,12,17 | Term | Felhasználó által definiált jelzés 2 | | CHLD | 20,17,18 | Ign | A gyermek leállt vagy megszakadt | | CONT | 19,18,25 | Cont | Folytatás, ha meg lett állítva | | STOP | 17,19,23 | Stop | A folyamat megállítása | | TSTP | 18,20,24 | Stop | Megálljt gépeltek egy tty eszközön | | TTIN | 21,21,26 | Stop | tty bevitel egy háttérfolyamat számára | | TTOU | 22,22,27 | Stop | tty kivitel egy háttérfolyamat számára | * Termi - megállítja a folyamatot * Core - megállítja a folyamatot, majd a kidumpolja a core adatokat * Stop - megállítja a folyamatot * Cont - folytatja a folyamatot, ha az meg volt állítva * Ign - elutasítja a folyamatot A kill paranccsal lekérdezhetjük egy jelzés száma alapján a nevét. Például: kill -l 1 Démon folyamat újraindítása: killall -HUP pidszám Egy 0 számú szignállal azt is megvizsgálhatjuk, hogy egy folyamat fut vagy nem fut. A kernelfolyamatok nem fogadnak el jelzéseket, azokat figyelmen kívül hagyják. Olvasnivalók: man signal, man 7 signal ==== Több folyamat egyetlen konzolon vagy terminálon ==== === Folyamat leállítása === A folyamatokat ideiglenesen leállíthatjuk a Ctrl+Z billentyűkombinációval. Indítsuk el a nano nevű szövegszerkesztő programot: nano Az indítás után a Ctrl+Z billentyűkombinációval tegyük háttérbe. Most indítsunk egy másik nano nevű programot, tegyük ezt is háttérbe a Ctrl+Z billentyűkkel. Indítsunk egy vi nevű szövegszerkesztőt. Tegyük a Ctrl+Z-vel háttérbe. Most indítsunk egy mutt nevű levelező programot. Tegyük háttérbe ezt is. Ezek után nézzük meg a háttérbe tett folyamatokat a "jobs" paranccsal: jobs Az eredmény ehhez hasonló: [1] Megállítva nano [2] Megállítva nano [3]- Megállítva vi [4]+ Megálíltva mutt A megállított nano, vi és mutt programokat látjuk. Mindegyik kapott egy sorszámot. A sorszámokat használhatjuk annak jelzésére, hogy melyiket szeretnénk előtérbe hozni. Előtérbe az "fg" paranccsal hozhatjuk a folyamatokat. Ha csak önmagában adom ki az "fg" parancsot, akkor az utolsót, esetünkben a mutt nevű folyamatot hozza vissza. Az "fg" parancsnak azonban paraméterként megadhatok egy sorszámot is. Például a második nano program visszahívása: fg 2 Egy folyamat persze már indításkor is háttérbe tehető: yes > /dev/null & Ha az fg parancsnak nem adunk meg paramétert, akkor a legkisebb azonosító számú programot fogja előtérbe hozni. === Gyakorlás === A yes parancs folyamatosan a képernyőre írja a paraméterként megadott szöveget, és a coreutils csomagban található. Ha nem adunk meg paramétert akkor az y betűt írja. Használhatjuk tesztekhez. Például irányítsuk a y betűk sorozatát a /dev/null állományba: yes > /dev/null Így kapunk egy programot, amely folyamatosan a fut. A termináltól úgy tudom elszakítani, hogy a tanult módon háttérbe helyezem: Ctrl + Z Vagy már indításkor is a háttérbe helyezhetjük: yes > /dev/null & Az elindított folyamatok számát ellenőrizzük, majd hozzuk előtérbe azokat és szakítsuk meg. Megszakítás a következő billentyűkombinációval: Ctrl + C ==== Folyamatok fastruktúrában ==== A használható parancs: pstree Csak a jozsi felhasználó folyamatainak megjelenítése: pstree joszi A pstree kimenete átadható a less parancsnak lapozás céljából: pstree | less Vagy: pstree joszi | less A példa kedvéért indítsunk két folyamatot, amit leállítunk. Feltételezzük, hogy a felhasználónevünk "tibi". A teendők a következők: nano + nano + pstree -c tibi Lehetséges kimenet (ha tibi csak egyszer lépett, és csak ezeket a programokat futtatja egy teletájpról): bash─┬─nano └─nano ==== top ==== Folyamatok valós idejű figyelése Kilépés: q A h billentyűvel lekérdezhetjük a használható billentyűket: h | Z,B | Globálisan: a 'Z' a színtérképek cseréje; 'B' félkövér tiltása/engedése | | l,t,m | Összefoglalók: 'l' terhelési átlagok; 't' folyamat/CPU statisztika; 'm' memóriainformációk | | 1,I | SMP nézet: '1' egyszerű/kifejtett; 'I' Irix/Solaris mód | | f,o | Mezők/Oszlopok: 'f' hozzáad vagy töröl; 'o' a megjelenés sorrendje | | F vagy O | A kiválasztott mező rendezése | | <,> | A mező mozgatása: '<' a következő oszlop balra; '>' a következő oszlop jobbra | | R,H | Kulcs: 'R' normál/fordított rendezés; 'H' szálak mutatása | | c,i,S | Kulcs: 'c' cmd name/line; 'i' üres folyamatok; 'S' növekvő idő | | x,y | Kiemelő kulcsok: 'x' rendezett mezők; 'y' futó folyamatok | | z,b | Kulcs: 'z' színes/mono; 'b' félkövér/fordít (csak 'x' vagy 'y' esetén) | | u | Csak a felhasználók folyamatai | | n vagy # | Maximálisan mutatott folyamatok száma | | k,r | Folyamatok kezelése: 'k' kill; 'r' prioritás (renice) | | d vagy s | Frissítési időköz beállítása | | W | Beállítások fájlba írása | | q | Kilépés | ==== fuser ==== === Használt fájl vagy könyvtár === A folyamatok által használt fájlokat és socketeket az fuser paranccsal tudjuk vizsgálni. Szeretnénk látni azoknak a folyamatoknak a PID-jét, amelyeket az aktuális felhasználó használ: fuser . A kimenet: .: 21384c A példában szereplő PID szám végén van egy "c" karakter. Ez a hozzáférés típusát mondja meg számunkra. Lássuk milyen típusok vannak még: | c | az aktuális könyvtár | | e | végrehajtható állomány | | f | nyitott fájl | | F | írásra megnyitott fájl | | r | root könyvtár | | m | memóriába mapolt fájl vagy osztott könyvtár | A részletek megmutatásához írjuk be a -v kapcsolót: fuser -v . A kimenet: FELHASZNÁLÓ PID HOZZÁFÉRÉS PARANCS .: joska 21384 ..c.. bash === Használt port === Melyik program használt egy adott portot? Vizsgáljuk meg rootként a 80-as portot: fuser -v -n tcp 80 A kimenet: FELHASZNÁLÓ PID HOZZÁFÉRÉS PARANCS 80/tcp: root 1416 F.... apache2 www-data 1539 F.... apache2 www-data 1540 F.... apache2 www-data 1541 F.... apache2 www-data 1542 F.... apache2 www-data 1543 F.... apache2 www-data 2856 F.... apache2 www-data 2909 F.... apache2 www-data 2925 F.... apache2 www-data 2926 F.... apache2 === Porthasználat példa 2 === fuser -v -n tcp 12345 FELHASZNÁLÓ PID HOZZÁFÉRÉS PARANCS 12345/tcp: andras 3097 F.... server === Csatolt könyvtár === A mount paranccsal felcsatolt /mnt/valami könyvtárat valami foglalja. A következő parancs leállítja ezt a programot: fuser -vmk /mnt/valami === Futtatható program === ./fuser fuser -v server Eredmény: FELHASZNÁLÓ PID HOZZÁFÉRÉS PARANCS server: andras 3097 ...e. server === Socket === fuser -v /var/run/mysqld/mysqld.sock Eredmény: FELHASZNÁLÓ PID HOZZÁFÉRÉS PARANCS /var/run/mysqld/mysqld.sock: mysql 1905 F.... mysqld === Program folyamatának kilővése === fuser -v -k server FELHASZNÁLÓ PID HOZZÁFÉRÉS PARANCS server: andras 3097 ...e. server Ha program terminálhoz van kötve, akkor a következőt láthatjuk: ./server Kilőve === Folyamat kilővése interaktív módon === fuser -v -i -k server FELHASZNÁLÓ PID HOZZÁFÉRÉS PARANCS server: andras 3199 ...e. server Kilövi a(z) 3199 folyamatot? (i/N) fuser -v -i -k ./ Eredmény: ./: FELHASZNÁLÓ PID HOZZÁFÉRÉS PARANCS joska 1231 ..c.. bash joska 1327 ..c.. nano joska 1343 ..c.. mcedit joska 1345 ..c.. yes Kilövi a(z) 1282 folyamatot? (i/N) n Kilövi a(z) 1327 folyamatot? (i/N) i Kilövi a(z) 1343 folyamatot? (i/N) i Kilövi a(z) 1345 folyamatot? (i/N) i [1] Kilőve nano [2] Kilőve mcedit [3] Kilőve yes ==== pgrep és pkill ==== A pgrep és pkill parancsok segítségével a folyamatlistát tudjuk megszűrni minta alapján. A mintában használhatók helyettesítő karakterek is, a man 7 regex alapján. A rendszerben több felhasználó is indíthatott nano szövegszerkesztőt. Mi most a joska nevű felhasználó által indított nano folyamat PID számára vagyunk kíváncsiak: pgrep -u joska nano Szeretnénk leállítani mindenáron a joska által indított nano folyamatokat: pkill -9 -u joska nano A pgrep és a pkill persze igazán akkor hasznos, ha mintákat is használunk. A felhasználókat megadhatjuk a UID alapján is. A root felhasználó folyamatai: pgrep -lu 0 ==== pidof ==== A pidof segítségével folyamatok azonosítóját deríthetjük ki. Indítsunk egy nano programot, majd tegyük a Ctrl+Z-vel háttérbe. Majd futtassuk a következő parancsot: pidof nano A parancs az összes nano folyamat PID számát kiírja. Lehetséges kimenet: 3745 3694 3693 ==== pmap ==== Folyamatok memóriatérképének riportja. $ pmap 5350 Egy futtatás lehetséges kimenete: $ pmap 915 915: ./test 0000559510372000 4K r-x-- test 0000559510572000 4K r---- test 0000559510573000 4K rw--- test 00005595116cd000 132K rw--- [ anon ] 00007efdffcb3000 1620K r-x-- libc-2.24.so 00007efdffe48000 2048K ----- libc-2.24.so 00007efe00048000 16K r---- libc-2.24.so 00007efe0004c000 8K rw--- libc-2.24.so 00007efe0004e000 16K rw--- [ anon ] 00007efe00053000 140K r-x-- ld-2.24.so 00007efe00276000 4K r---- ld-2.24.so 00007efe00277000 4K rw--- ld-2.24.so 00007efe00278000 12K rw--- [ anon ] 00007efe0027b000 12K rw--- [ anon ] 00007fff3003e000 132K rw--- [ stack ] 00007fff30143000 8K r---- [ anon ] 00007fff30145000 8K r-x-- [ anon ] ffffffffff600000 4K r-x-- [ anon ] total 4176K ==== Gyakorlat ==== * Hogyan tudjuk listázni a rendszer összes folyamatát? * Hogyan tudjuk megjeleníteni a folyamatokat valós időben? * Milyen jelzést kell küldeni egy folyamatnak, hogy biztosan leálljon? ===== Gyorsbillentyűk ===== ==== Tab ==== A billentyű, parancs-, fájl- és könyvtárnevek kiegészítésére használható. A következő feladatokhoz saját könyvtárunkban hozzunk létre egy bil nevű könyvtárat. Lépjünk a bil könyvtárba, majd itt dolgozzunk tovább. mkdir bil cd bil Hozzunk létre egy fájlt: touch kedvenc_hosszu_fajlnev.txt Ha szeretnénk megnézni a tartalmát a cat paranccsal, csak gépeljük be a cat parancs után az első betűt, majd nyomjunk tabulátort. cat k A billentyű kiegészíti a fájlnevet. Most hozzunk létre egy másik fájlt: touch kartel_tanacs_jegyzet.txt Ha most újra szeretnénk megnézni az első fájl tartalmát: cat k Nem történik semmi. Ha újra megnyomjuk a billentyűt kiírja a két fájl, mutatva, hogy nem tudja melyiket kell megjeleníteni. cat k kedvenc_hosszu_fajlnev.txt kartel_tanacs_jegyzet.txt Be kell írnunk a további karakterekből 1-t, majd újból megnyomni a billentyűt. cat ke Most hozzunk létre egy kedvenc_rovid_fajlnev.txt nevű fájlt: touch kedvenc_rovid_fajlnev.txt Ha szeretnénk újra megnézni a kedvenc_hosszu_fajlnev.txt állományt, akkor, begépeljük: cat ke A fájlnév csak kedvenc_ részig lesz kiegészítve, mivel eddig egyezik a két ke kezdetű fájl. Ekkor nyomjunk újra billentyűt. cat kedvenc_ ==== Le, fel nyíl ==== A le és a fel billentyűvel lapozhatunk a kiadott parancsok között. A fel billentyűvel visszafele lapozunk, a le billentyűvel előre. ==== Ctrl+R ==== A Ctrl+R billentyűkombináció arra való, hogy az előző parancsokban keressünk. Nyomjuk meg a Ctrl+R billentyűkombinációt, majd írjuk be a keresett parancs részletét. + export A következő jelenik meg: (reverse-i-search)`': A gépelés közben máris megjelennek az egyezést mutató régebbi parancsok. Ha nem található a minta: (failed reverse-i-search)`ga': Alapértelmezetten csak egy találat jelenik meg. Több eredmény megjelenítéshez nyomjuk meg újra a Ctrl+R billentyűt. Tulajdonképpen lapozhatunk a parancsokban. A keresést a Ctrl+C billentyűkombinációval szakíthatjuk meg, egy Enter lenyomásával újra aktiválhatjuk. Kilépés a Ctrl+G billentyűkombinációval. ==== Ctrl+S ==== A Ctlr+S megállítja, megfagyasztja a terminált. Olyankor jöhet jól ha valamilyen parancs adatokat ír a képernyőre, ami nem fér el, ezért folyamatosan továbbítja azt, mi pedig szeretnénk beleolvasni, így megállítanánk. A képernyő továbbítása folytatható a Ctrl+Q billentyűkombinációval. A példa kedvéért kereshetünk a csomagok között, amit leállíthatunk: apt search a ==== Mozgás soron belül ==== A sor elejére a vagy a + billentyűvel mozoghatunk. * Home, Ctrl+a A sor végére az vagy a + billentyűvel mozoghatunk. * End, Ctrl+e Váltás az **aktuális kurzorpozíció** és a **sor eleje** között. * Ctrl+x, Ctrl+x ==== Az előző argumentum felhasználása ==== Egy parancs kiadása után ha megnyomjuk az +<.> billentyűkombinációt, az utoljára beírt argumentum a parancssorba íródik. ==== Ctrl+Z ==== Az aktuális folyamatot a háttérbe teszi. A háttérbe tett folyamat az fg és bg parancsokkal szabályozhatók. ==== Ctrl+C ==== Az aktuális folyamatot megszakítja. A folyamatnak SIGINT jelet küldönk. ==== Ctrl+L ==== A képernyő törlése. ==== Ctrl+U ==== A kurzor előtti részt egy speciális vágólapra helyezi. ==== Ctrl+K ==== A kurzor utáni részt egy speciális vágólapra helyezi. ==== Ctrl+Y ==== A speciális vágólapról beilleszti a tartalmat, amely a Ctrl+U vagy Ctrl+K billentyűparanccsal került oda. ==== Ctrl+W ==== A kurzortól balra kivágja a szót és speciális vágólapra teszi. ==== Ctrl+T ==== A kurzor alatti és kurzor előtti két karakter cseréje. ==== Ctrl+D ==== Kilép a terminálból. ==== SSH munkamenet ==== Ha beragadt egy SSH munkamenet, mert például lejárt a váratlanul eltölthető idő, szeretnénk kilépni: * Enter, ~, . ==== Szavak törlése ==== Kurzor előtt sor törlése Alt + Delete Kurzor utáni szó törlése: Alt + d ==== Szavanként lépés ==== Vissza: Alt + b Előre: Alt + f ==== Parancs szerkesztőben ==== Az aktuális parancs szerkesztése $EDITOR-ban: * Ctrl + x, Ctrl + e ==== Gyakorlat ==== - Mire jó a Tab billentyű? - Mi történik, ha parancskiegészítést kérek, de hasonló kezdetű állomány több is létezik? - Mire használható a Ctrl+D karakter? - Mire való a Ctrl+A billentyűkombinációt? - Mire való a Ctrl+E billentyűkombinációt? - Mire való a Ctrl+U billentyűkombinációt? - Mire való a Ctrl+K billentyűkombinációt? - Mi a különbség a Ctrl+U és a Ctrl+K billentyű között? - Mit csinál a Ctrl+T a Bashben? - Mit töröl a Ctrl+W a Bashben? - Mire jó a Ctrl+L a Bashben? - Mire jó a Ctrl+Z a Bashben? ===== Szűrők ===== ==== A szűrőkről általában ==== A szűrők a bemenetükre került adatokkal csinálnak valamit, majd a kimenetre küldik. ==== cat ==== A cat az egyetlen szűrő, amely a bemenetre érkező adatokkal semmit nem csinál. Változatlanul írja azokat a képernyőre. Mégis ez a parancs -- mint azt feljebb láttuk -- amellyel a legtöbb dolgot tehetjük. Ezek: * állomány tartalmának megjelenítése * állomány létrehozása * állományok összemásolása * állományok másolása * állományhoz fűzés Állomány létrehozása: cat > dolgozok.txt Állomány tartalma: cat dolgozok.txt Állományok összemásolása: cat fajl1 fajl2 fajl3 > egyfajl.txt Állományok másolása: cat < eredeti > masolat A fájl végéhez fűzünk: cat >> dolgozok.txt Szabó Gábor 830000 [Ctrl]+[D] A fájl végéhez fűzők: cat >> dolgozok.txt < === cat összefoglalva === == Állományok létrehozása == cat > filenev.txt tartalom ... + == Állomány tartalmának megtekintése == cat < filenev vagy cat filenev == Állományok másolása == cat < filenev > filenev2 == Állományok összemásolása == cat file1 file2 file3 > file4 ==== colrm ==== A bemenetre érkező sorokból bizonyos oszlopok törlése Szintaxis: colrm [startoszlop [ végoszlop ]] A példa kedvéért adott az alábbi tabulátorral tagolt állomány a következő tartalommal: 001 Alex Brown 85 5 002 Dan Igor 40 3 003 Barton Flex 56 3 004 Rock Brain 78 4 Szeretnénk a nevek oszlopait eltüntetni. Megoldás: cat tanulok | colrm 9 24 Eredmény: 001 85 5 002 40 3 003 56 3 004 78 4 Nagyobb példafájl: 001 Alex Brown 85 5 002 Dan Igor 40 3 003 Barton Flex 56 3 004 Rock Brain 78 4 005 Kis István 72 4 006 Nagy Béla 70 4 007 Fehér Tamás 28 1 008 Kékes Imre 45 4 009 Per Béla 78 4 010 Zöld Elek 78 4 011 Piros Gábor 23 1 012 Fék Lajos 28 4 013 Elmúlt Tibor 78 4 014 Leendő Tamás 28 4 015 Pék Gergő 78 4 016 Rob Sándor 18 1 017 Kékedi Imre 70 4 018 Nagy Lajos 85 4 Egyéb használat ifconfig eth0 | colrm 1 10 cat /var/log/syslog | colrm 1 16 | colrm 30 cat /var/log/auth.log.1 | colrm 70 Utóbbi példában ha szimplán az állomány tartalmát listázom, azok kilógnak a következő sorban. A célom, hogy átláthatóbb sorokat szeretnék, de jelenleg csaka sorok elejére vagyok kíváncsi. ==== cut ==== Csak bizonyos oszlopokat szeretnénk megjeleníteni. Szintaxis: cut [opció] … [fájl] ... === Szóközökkel tagolt sorok === Adott az alábbi szóközökkel tagolt állomány: 001 Alex Brown 85 5 002 Dan Igor 40 3 003 Barton Flex 56 3 004 Rock Brain 78 4 Megoldás: cat tanulok2.txt | cut -c4-22 Az eredmény: Alex Brown Dan Igor Barton Flex Rock Brain === Tabulátorral tagolt sorok === 001 Alex Brown 85 5 002 Dan Igor 40 3 003 Barton Flex 56 3 004 Rock Brain 78 4 Megoldás: cut -f2 < tanulok.txt A futtatás eredménye: cut -f2 < tanulok.txt Alex Brown Dan Igor Barton Flex Rock Brain === Kettősponttal tagolt === 001:Alex Brown:85:5 002:Dan Igor:40:3 003:Barton Flex:56:3 004:Rock Brain:78:4 Megoldás: cut -f2 -d : tanulok3.txt A -d kapcsoló után szóközzel vagy a nélkül megadjuk az elválasztójelet. A -d kapcsolóval szinte bármit megadhatunk szeparátornak. Eredmény: cut -f2 -d: tanulok3.txt Alex Brown Dan Igor Barton Flex Rock Brain === Egyszerre több oszlop megjelenítése === cut -f 2,3,7 -d : tanulok3.txt Eredmény: cut -f 2,3,4 -d: tanulok3.txt Alex Brown:85:5 Dan Igor:40:3 Barton Flex:56:3 Rock Brain:78:4 === Több szóköz szeparátorként === A tr paranccsal minden szóköz csak egyszer fog szerepelni: cat tanulok3 | tr -s ' ' | cut -f 1 -d' ' === Összetett feladat === Legyen egy összetett feladat: Le kell állítani a zombi folyamatokat. A ps paranccsal kiíratjuk az összes folyamatot. A grep paranccsal szűrök csak a zombi állapotban lévő folyamatokra. A tr paranccsal az egyes oszlopok közötti szóközöket 1 darabra csökkentem. A soreleji szóközöket törlöm az awk paranccsal. A cut paranccsal az első oszlopot megjelenítem, mivel ezek a szülőfolyamatok. Végül a kill paranccsal törlöm a zombikat. Szükség van egy xargs parancsra is, mert a kill parancs így kapja meg paraméterként a ppid értékeket. ps -o ppid,pid,stat | \ grep -w Z | \ tr -s ' ' | \ awk '{$1=$1};1' | \ cut -f1 -d' ' | \ xargs kill -9 ==== mcrypt ==== A következő parancsok használatához szükséges az mcrypt nevű csomag telepítése. A telepítéshez lásd a csomagkezelés részt a "Rendszer" fejezetben. === Titkosítás === Adott az alábbi állomány a következő tartalommal: Holnap este érkezem. Szeretnénk titkosítani az állományt. Titkosítás: mcrypt nyilt.txt A futtatás eredménye: mcrypt nyilt.txt Enter the passphrase (maximum of 512 characters) Please use a combination of upper and lower case letters and numbers. Enter passphrase: Enter passphrase: File nyilt.txt was encrypted. A parancs bekért egy jelszót kétszer, majd létrehozza a következő állományt: nyilt.txt.nc A nyilt.txt.nc szöveg tartalmát ha megnézzük olvashatatlan szöveg lesz. Így már elküldhetjük a titkos üzenetet. Ezek után az üzenet vevőjének vissza kell kódolni az üzenetet. === Dekódolás === A visszafejtés a következő paranccsal lehetséges: mdecrypt nyilt.txt.nc A futtatás eredménye: mdecrypt nyilt.txt.nc Enter passphrase: File nyilt.txt.nc was decrypted. A parancs bekéri a jelszót, majd elkészíti a nyilt.txt.nc állományt visszakódolva a nyilt.txt nevű fájlt. === crypt parancs === A crypt parancsot a mcrypt csomag valósítja meg. Régi unixból ismert parancs, amely a stdin-ről várja a bemenetet, és a stdout-ra ír. crypt < nyilt.txt > titkos.txt Unix crypt(1) emulation program using mcrypt(1). Use crypt -h for more help. Enter the passphrase (maximum of 512 characters) Please use a combination of upper and lower case letters and numbers. Enter passphrase: Enter passphrase: Stdin was encrypted. Persze ebben a formában is használahtó: crypt > titkos.nc Unix crypt(1) emulation program using mcrypt(1). Use crypt -h for more help. Enter the passphrase (maximum of 512 characters) Please use a combination of upper and lower case letters and numbers. Enter passphrase: Enter passphrase: Holnap este érkezem. Stdin was encrypted. Visszafele ugyanígy: crypt < titkos.nc Unix crypt(1) emulation program using mcrypt(1). Use crypt -h for more help. Enter the passphrase (maximum of 512 characters) Please use a combination of upper and lower case letters and numbers. Enter passphrase: Enter passphrase: Holnap este érkezem. Stdin was encrypted. ==== grep ==== Adott mintát tartalmazó sorok megjelenítése Szintaxisa: grep [ kapcsolók ] minta [ fájl ... ] Adott az alábbi belépési napló: 2005.10.25 18:30 alex 196.145.43.3 2005.10.26 18:30 joe 216.45.3.2 2005.10.26 18:44 richard 196.145.43.3 2005.10.28 22:31 joe 196.145.43.3 2005.10.29 18:00 alex 196.145.43.3 A futtatás eredménye: grep alex belepesinaplo.txt 2005.10.25 18:30 alex 196.145.43.3 2005.10.29 18:00 alex 196.145.43.3 A grep -v azokat jeleníti meg, amelyek nem tartalmazzák a sorokat. grep -v alex belepesinaplo.txt 2005.10.26 18:30 joe 216.45.3.2 2005.10.26 18:44 richard 196.145.43.3 2005.10.28 22:31 joe 196.145.43.3 Az alábbi naplóállomány a következő mezőket tartalmazza: | dátum | idő | felhasználónév | ipcím | letöltött adatmennyiség | 2005.12.25 18:30 alex 196.145.43.3 1960 bytes 2005.12.26 18:30 joe 216.45.3.2 1512 bytes 2005.12.26 18:44 richard 196.145.43.3 2005 bytes 2005.12.28 22:31 joe 196.145.43.3 2006 bytes 2005.12.29 18:00 alex 196.145.43.3 2050 bytes 2006.01.02 08:25 joe 195.166.29.5 2008 bytes 2006.01.02 12:20 alex 195.165.1.1 2005 bytes Feladatunk, hogy listázzuk a 2006-os eseményeket. Ha most a fentebb tárgyalt módon csak ennyit írunk: grep 2006 naplo.log úgy azok a sorok is megjelennek, ahol a letöltött byte-ok száma 2006. Nekünk nem jó. Jeleznünk kell, hogy csak azokat a sorokat szeretnénk megjeleníteni, ahol a 2006 a sor elején szerepel. Ehhez a ^ karaktert használjuk: grep ^2006 naplo.log Csak a fájlnevek megjelenítése tartalom alapján: Például keressük az aktuális könyvtárban, az összes fájl között, azokat a fájlokat, amelyek tartalmazzák a VGA szót, megjeleníteni azonban csak a fájlneveket szeretnénk: Készítsünk egy fájlt: echo "Egy VGA felbontásra van szükség" > adat.txt grep VGA * Ha csak a fájl nevét szeretném: grep -l VGA * === A karakterosztályok használata === 2005.12.25 18:30 alex 196.145.43.3 1960 bytes 2005.12.26 18:30 joe 216.45.3.2 1512 bytes 2005.12.26 18:44 richard 196.145.43.3 2005 bytes 2005.12.28 22:31 joe 196.145.43.3 2006 bytes 2005.12.29 18:00 alex 196.145.43.3 2050 bytes 2006.01.02 08:25 joe 195.166.29.5 2008 bytes 2006.01.02 12:20 alex 195.165.1.1 2005 bytes 2006.01.03 07:02 mari 195.165.2.45 2007 bytes A fenti állományban azokat a sorokat keressük, ahol a letöltés 2005, 2006, 2007 vagy 2008 van. grep "200[5678] bytes" naplo.log A negyedik karakter csak a szögletes zárójelben "[ ]" megadott négy karakter egyikére illeszkedik. Az 5,6,7 vagy 8-as karakterek valamelyikére. A szám után kötelezően egy szóköznek, majd utána bytes karakterek megköveteltek. A szögletes zárójel lehetővé teszi intervallumok megadását [5-8]: grep "200[5-8] bytes" naplo.log Az intervallumok megadására használhatók betűk is: [a-z] Az előbbi minta például az angol ábécé összes kisbetűjére illeszkedik. A nagybetűk: [A-Z] Természetesen megadhatók kisebb intervallumok is: [c-k] === Üres sorok törlése === grep -v "^$" filename grep . filename grep -v '^[[:space:]]*$' filename === Hashmark jeles sorok kihagyása === grep -v '#' filename grep -v '\#' filename === Fájlok rekurzívan === A rekurzív keresés bekapcsolja a fájl megjelenítést. Keressük például a "Rewrite" szót az apache2 konfigurációs állományaiban: grep -r "Rewrite" /etc/apache2/ === grep gyakorlat === Adott az alábbi naplóállomány részlet (/var/log/syslog): Feb 21 18:32:12 server postfix: Connection, Feb 21 18:32:12 server postfix: LOGIN, user=test@server.hu, Feb 21 18:32:46 server postix: LOGOUT, user=test@server.hu Feb 21 18:32:12 server pop3d: Connection, Feb 21 18:32:12 server pop3d: LOGIN, user=test@server.hu, Feb 21 18:32:46 server pop3d: LOGOUT, user=test@server.hu Csak a pop3d-t tartalmazó sorokat szeretnék megjeleníteni. grep pop3d /var/log/syslog Adott egy konfigurációs állomány (dspam.conf) ami tele van megjegyzésekkel. Szeretném kiszűrni a megjegyzés sorokat és csak a beállításokat szeretném: # # DSPAM Home: Specifies the base directory to be used for DSPAM storage # Home /var/spool/dspam Ekkor: grep '^[^#]' dspam.conf === Fájl keresése tartalom alapján === grep -lir "keresett szöveg" /utvonal/konyvtar ==== egrep ==== Nem egyezik meg a grep -E használatával, mert annál több reguláris kifejezést ismer ha ezt használjuk. Ehhez hasonló reguláris kifejezések is használhatók: +,?, | és () ==== fgrep ==== Fix vagy fast grep rövidítése. Megegyezik a grep -F használatával Normál szövegként értelmezzük a mintát szabályos kifejezések helyett. A szabályos kifejezések területén, például a (.) pont speciális jelentéssel bír. fgrep stdio.h /usr/include/* ==== paste ==== Adatoszlopok összemásolása Állományok oszlopainak összemásolása egy fájlba, egymás mellé Szintaxis: paste [ kapcsolók ... ] [ fájl ... ] Van 4 darab fájl: * sroszam * nev * szuletesnap * telefonszam 001 002 003 Alex Brown Joe 1985.07.11 1987.01.12 1999.12.22 (1) 335-3345 (37) 332-328 (48) 183-981 Szeretnénk egyetlen fájlban egymás mellé összemásolni. Megoldás: paste sorszam nev szuletesnap telefon > info.txt Eredmény: 001 Alex 1987.07.11 (1)335-3345 002 Brown 1987.01.12 (37) 332-328 003 Joe 1999.12.22 (48) 143-981 === Tagolás szóközökkel === Megoldása paste -d ' ' sorszam nev szuletesnap telefon > info Eredmény: 001 Alex 1987.07.11 (1)335-3345 002 Brown 1987.01.12 (37) 332-328 003 Joe 1999.12.22 (48) 143-981 Tagoláshoz persze bármit megadhatunk pl.: -d ':' === Táblázat oszlopainak cseréje === Adott egy dolgozok nevű állomány, amiben oszlopokban szeretnénk megcserélni. Név Fizetés Beosztás Alex 130000 festő Brown 150000 asztalos Joe 170000 villanyszerelő Megoldás: cut -f1 dolgozok > nev cut -f2 dolgozok > fizetes cut -f3 dolgozok > beosztas paste nev beosztas fizetes > dolgozok2 more dolgozok2 rm nev beosztas fizetes ==== sort ==== A bemenetre érkező adatokat rendezi. A sort parancsot Adatok rendezése és összemásolása Ha a bemenet egy másik programtól jön csővezetéken: cat filenev.txt | sort Ha a program bemenete egy állomány: sort < filenev.txt === Fordított rendezés === sort -r nevek.txt sort --reverse nevek.txt === Kimeneti fájl megadása === sort -o ujfajl.txt nevek.txt Átirányítással: sort nevek.txt > ujfajl.txt Ha így használjuk: sort nevek.txt > nevek.txt A nevek.txt tartalma elveszett, mert a kimeneti fájl előkészítése megtörténik annak olvasása előtt. Itt lehet ugyanaz a név: sort -o nevek.txt nevek.txt === Egy fájlba === sort nevek1 nevek2 nevek3 > osszes Egy fájlba rendezi a 3 fájl tartalmát A gyümölcs fájl tartalma: korte alma szilva barack Eredmény: sort gyumolcs.txt alma barack korte szilva === Rendezés adott mező szerint === 1 körte 2 alma 3 szilva Második oszlop szerint szeretnénk rendezni: sort -k +2 < gy.txt -k oszlopszám === Rendezési nyelv === Magyar nyelvű környezetben a magyar helyesírásnak megfelelően rendez a sort. Ezen lehet változtatni, péládul: LC_COLLATE=en_US.UTF-8 sort gy.txt vagy csak LC_COLLATE=C sort gy.txt === Számok alapján === Ha számok vannak egy oszlopban, akkor is betűrendet néz a sort. A szám alapján rendezést a -n kapcsolóval érhetjük el. 90 700 5 sort -n szamok.txt sort --numeric-sort szamok.txt ==== rev ==== Egy sort megfordít A rev parancsot karakterek sorrendjének megfordítása használjuk. Szintaxis: rev [fájl …] A bemenet lehet a STDIN is. Legszemléletesebben egy egyszerű állományon láthatjuk a működését. Az adat.txt állomány tartalma legyen a következő: 12345 abcde AxAxA Futtatás: rev adat.txt 54321 edcba AxAxA ==== spell ==== A spell egy helyesírás ellenőrző program. A unixos rendszerekből származik. A spell csomag telepítése után használható. A spell a paraméterként megadott állományból kiírja azokat a szavakat amiket helytelennek tart. Magyar helyesírásh ell.-hez: ihungarian csomag kell telepítve legyen. (magyar környezeteben ékezet gondok) ^ helyesen ^ helytelenül ^ | barack | barck | | szilva | szilve | | körte | körite | | alma | alme | ^ helyes ^ helytelen ^ | peach | peac | | plum | plem | | pear | peare | | apple | aple | === Gyakorlás === Adott a következő fájl: barcak szilve eper körte alme A harmadik szó helyes, a többit helytelen. Végrehajtás: spell gy.txt A parancs az eper szó kivételével kiír minden sort. === ispell használata === A hunspell csomag használata esetén rávehetjük annak használatára is: spell -i /usr/bin/ispell gy.txt === hunspell használata === A hunspell csomag használata esetén rávehetjük annak használatára is: spell -i /usr/bin/hunspell gy.txt ==== ispell ==== Ez egy interaktív helyesírás ellenőrző program. Indítás: ispell gy.txt Az indítás után a program kiírja a hibás szót, majd lehetőségeket kínál a változtatásra. Számokkal adhatjuk meg, mire szeretnénk javítani. Ha ez nem egyezik az általunk kívánt lehetőséggel, akkor az r lenyomása után mást is beírhatunk. A program minden lehetőséget kiír a képernyő alján. barcak File: gy.txt barcak 0: barack 1: barnak 2: bar�ak [SP] R)epl A)ccept I)nsert L)ookup U)ncap Q)uit e(X)it or ? for help Hátránya, hogy nem ismeri az UTF-8 kódolásul ékezeteseket. * http://magyarispell.sourceforge.net/magyarispell.pdf ==== aspell ==== Interaktív helyesírás ellenőrző program. UTF-8-as környezetben kezeli az ékezetes karaktereket. Felülete hasonlít az ispell programhoz. Használatához telepíteni kell az **aspell** csomagot, a magyar helyesírás ellenőrzéshez pedig a **aspell-hu** csomagot. Adott a következő állomány: Szeretem a gyümölcsöket. Kedvenceim az alme, körti, szilve és a barakc. aspell check gy.txt barck szilva körite alme 1) barack 4) barik 2) Barcs 5) barok 3) Barok 6) barék i) Ignore I) Ignore all r) Replace R) Replace all a) Add l) Add Lower b) Abort x) Exit ? A módok lekérdezése: aspell dump modes Nem kérünk backup fájlt és Markdown fájlt ellenőrzünk aspell check --dont-backup --mode=markdown valami.md ==== hunspell ==== Adott a következő állomány: Szeretem a gyümölcsöket. Kedvenceim az alme, körti, szilve és a barakc. Ellenőrzés: hunspell gy.txt Felülete: barck File: gy.txt barck 0: barack 1: barok 2: barik 3: barék 4: barcsik 5: Barcs 6: barcsi 7: barchesz [SPACE] R)epl A)ccept I)nsert U)ncap S)tem Q)uit e(X)it or ? for help Előnyök: * http://manpages.ubuntu.com/manpages/hardy/hu/man1/hunspell.1.html ==== tr ==== Kiválasztott karakterek cseréje. tr [kapcsolók] … készlet1 [készlet2] Adatokat olvas a stdin-ről készlet1-beli előfordulását keresi, ha talál lecseréli a készlet2-beli párjával. Kis a nagy A lesz: tr a A < regifajl > ujfajl Kis a,b,c nagy A,B,C lesz: tr abc ABC < regifajl > ujfajl Minden nagybetű kicsi lesz: tr A-Z a-z < regifajl > ujfajl === Ékezetlenítés === tr éáóö eaoo < ekezetes > ekezetlen Az ékezetlenítés UTF-8-as környezetben nem jól működik. Helyette ajánlott a sed parancs használata. ==== uniq ==== Az ismétlődő sorokat csak egyszer jeleníti meg. Rendezett, Ismétlődő sorok törlése uniq [kapcsoló] ... [bemenet [kimenet]] === Így nem működik! === alma körte alma barack szilva körte uniq adat alma körte alma barack szilva körte === Így helyes! === alma körte alma barack szilva körte sort adat | uniq alma barack körte szilva ==== wc ==== Sorok megszámolása Sorok, szavak és karakterek számolása Szintaxis: wc [kapcsoló] ... [fájl] ... Adott egy állomány: alma körte barack szilva Végrehajtás: wc adat 4 4 25 Amit kaptunk: * 4 sor * 4 szó * 25 byte Gyakori használat. wc -l Csak sorok számolása ==== nl ==== Sorszámozás * A sorokat sorszámozza. * A számok a sor elé kerülnek. Példa a használatra: nl -n rz -w3 -s: * (-n rz) jobbra zárt, előnullázva * (-w 3) számjegyek száma * (-s :) szeparátor Eredmény: 001:adat1:adat2 ==== tac ==== A bemenetet megfordítja, az utolsó sortól írja ki. alma 40 db körte 53 db barack 25 db szilva 27 db szilva 27 db barack 25 db körte 53 db alma 40 db ==== expand ==== tabulátorok szóközökre cserélése 001 Alex Brown 85 5 002 Dan Igor 40 3 003 Barton Flex 56 3 004 Rock Brain 78 4 Végrehajtás: expand tanulok_tab.txt > tanulok_szokoz.txt ==== unexpand ==== Szóközök tabulátorra cserélése. Adott a következő állomány szóközökkel tagolva: 001 Alex Brown 85 5 002 Dan Igor 40 3 003 Barton Flex 56 3 004 Rock Brain 78 4 Végrehajtás: unexpand -a tanulok_szokoz.txt > tanulok_tab.txt * (-a) Ne csak a bevezető szóközöket és tabulátorokat, hanem az összeset alakítsa át tab karakterekké. ==== join ==== Összefűzés Minden egyes azonos összekapcsolási mezővel rendelkező bementi sorpárhoz kiír egy sort a szabványos kimenetre. 1 János 2 Ferenc 3 István 4 Kati 1 1981 4 1934 2 1945 3 1967 Végrehajtás: join nev szul 1 János 1981 2 Ferenc 1934 3 István 1945 4 Kati 1967 Az állományok tartalmazhatnak üres sorokat. De ha nincs rendezve, akkor nem mindig jó az eredmény. ==== fold ==== Sorok tördelése a megadott mezőszámmal: fold -w 70 file.txt Tegyük fel, hogy kaptam egy e-mailt, amelyben egy szöveges fájl van, de a levelet úgy írták, hogy nem törtek sort a képernyő jobb szélre érve, ezért a mi olvasó programunkban kilóg a képernyőről. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam condimentum blandit sapien non volutpat. Vivamus posuere massa euismod libero varius et mollis velit aliquam. Donec ultrices placerat consequat. Phasellus sit amet est non lorem vestibulum placerat iaculis vitae justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus bibendum feugiat eleifend. Duis tincidunt tempus eros, ac laoreet magna suscipit eu. Praesent quis facilisis lacus. Quisque imperdiet egestas lectus dapibus iaculis. Morbi egestas nulla eu magna sagittis vitae eleifend lacus sodales. Nullam vel nunc nisl. Vestibulum eget sapien eros. Donec ac pellentesque odio. In hac habitasse platea dictumst. (Ezt az állományt letöltheted így is:) curl http://szit.hu/wiki/download/level.txt > level.txt Ekkor tördelhetjük az állományt a fenti mint alapján: fold -w 70 level.txt ==== expr ==== Kifejezés kiértékelése expr 1 + 2 3 expr 1 ”<” 2 1 expr 1 ”>” 2 0 expr length "alma a" 6 expr 3 "*" 2 6 expr 1 = 2 0 ==== tsort ==== Topológikus rendezést hajt végre egy fájlon. Szintaxis: tsort [fájl] Ha nincs fájl megadva, akkor STDIN-ről olvas. === Példa === Átadunk a tsort-nak egy "X történt Y előtt" típusú, párokból álló listát, és megvizsgáljuk, hogyan rendezi azt. Megjegyezzük, hogy adott részleges rendezés esetén nem mindig létezik egyértelműen teljes rendezés is. Adott a következő állomány: Éva János Erika János Péter Éva Zoltán Erika Alkalmazás tsort < szul.txt Péter Zoltán Éva Erika János ==== diff ==== A diff két fájl összehasonlítása való, sorról sorra. A használat során, listázza a két összehasonlított állomány eltérő részeit. alma körte barack szilva alma körte szilva diff gy1.txt gy2.txt 3d2 < barack Két könyvtár összehasonlítása: diff elso masodik Csak elso -ben: egy.txt Csak masodik -ben: ketto.txt A program kiírja, ha egy fájl csak az egyik könyvtárban van. Csak a különbséget mutató fájlok mutatása: diff -qr elsoKonyvtar masodikKonyvtar === A diff kimenete fájlok esetén === $ cat gy1.txt gy2.txt alma korte barack szilva malna alma korte szilva $ diff gy2.txt gy1.txt 2a3 > barack 3a5 > malna A kimenet általában olyan sorokból áll, amely egy számmal (vagy tartománnyal) kezdődik, majd azt követi az ábécé a, d vagy c betűje, és újra egy szám (vagy tartomány) következik. Például: 2a3. Taromány esetén két szám jelenik, meg vesszővel tagolva. Az első szám az első fájl (eredeti fájl) sorát (vagy tartományát) mutatja, az utolsó szám (vagy tartomány) a második (új fájl) sorát mutatja. A betűk a következőket jelentik: * a - append- hozzáfűzés * d - delete - törlés * c - change - megváltozott A fenti 2a3, azt jelenti, hogy az első fájl 2-dik sora után kell fűzni a második fájl 3-dik sorát, annak érdekében, hogy a fájlok azonosak legyenek. A > karakter a második fájl 3-dik sorát jelenti. Ha < karakter látunk, akkor az első sor megadott állományát látjuk. A --- csak szeparátor. Példa: # cat gy1.txt gy2.txt alma korte barack meggy szilva malna alma korte szilva banan # diff gy2.txt gy1.txt 2a3,4 > barack > meggy 4c6,7 < banan --- > malna > == 2c2 == Az első fájl, 2-dik sorát cserélni kell a másik fájl 2-dik sorával, annak érdekében, hogy azonos fájlt kapjunk. == Unified fomátum == A -u vagy --unified kapcsoló szükséges. diff gy2.txt gy1.txt -u --- gy2.txt 2021-03-05 07:27:14.588727794 +0000 +++ gy1.txt 2021-03-05 07:26:29.708436467 +0000 @@ -1,4 +1,7 @@ alma korte +barack +meggy szilva -banan +malna + ==== patch ==== A patch program foltozásra való. A foltot a diff programmal készítjük, majd patch paranccsal fűzzük a régi állományhoz. Például adott a következő állomány: alma barack körte szilva Lemásoljuk az állományt: cp gy1.txt gy2.txt A gy2.txt állományban változásokat viszünk véghez. Az állomány ezek után így néz ki: alma banán barack citrom körte szilva A folt elkészítése: diff -cBN gy1.txt gy2.txt > gy2.patch Végrehajtás során: diff -cBN gy1.txt gy2.txt > gy2.patch *** gy1.txt 2011-11-20 00:12:50.000000000 +0100 --- gy2.txt 2011-11-20 00:45:58.000000000 +0100 *************** *** 1,4 **** --- 1,6 ---- alma + banán barack + citrom körte szilva Ha ezek után valakinek meg van gy1.txt állomány, a javítások alkalmazásához a foltot kell megszerezni. Akinek csak a gy1.txt állomány van, megszerzi a foltot, majd alkalmazza a gy1.txt állományon. A gy2.patch állományt a gy1.txt állománnyal azonos könyvtárba másolom. A patch alkalmazása ez után: A folt alkalmazása: patch < gy2.patch Akkor hasznos ez a folthasználat alkalmazása ha az eredeti állomány nagyon nagy, nagyon komplex és szeretnénk egy apróbb vagy nagyobb változtatást alkalmazni az eredeti állományon. A programozók gyakran használják a foltozást. Ha belejavítanak egy állományba, akkor csak elkészítik a régi és új állomány különbségét (folt), majd ezt visszaküldik az eredeti fejlesztőnek. Az eredeti fejlesztőnek csak foltot kell letöltenie, amelyet alkalmaz az eredeti állományon. ==== diff3 ==== Három fájl összehasonlítása sorról sorra. ==== sdiff ==== Két állomány összehasonlítása, tartalmuk interaktív egyesítése. A két állomány tartalmát két oszlopban jeleníti meg, nagyon szemléletesen a különbségeket. ==== cmp ==== Két fájl összehasonlítása Alapértelmezés szerint azonos állományok esetén nem ír ki semmit, eltérés esetén jelzi az eltérés sor- és bájtszámát. ==== comm ==== Sorról-sorra összehasonlít két rendezett fájlt. A comm három oszlopban írja ki két állomány összehasonlításának eredményét. Az első oszlopban csak azok a sorok szerepelnek, amelyek csak az első, a másodikban azok amelyek csak a második, végül a harmadikban azok amelyek mindkét állományban előfordulnak. ==== tail ==== Egy állomány végét írja ki. Például: tail /var/log/syslog A tail a -f kapcsolóval folyamatosan a képernyőre írja az állomány változásait. Beállítható hány sor jelenjen meg. 100 sor megjelenítése: tail -100 /var/log/syslog ==== head ==== Egy állomány elejét írja ki. Alapértelmezetten az első 10 sort jeleníti meg. head /var/log/syslog Beállítható hány sor jelenjen meg: head -100 /var/log/syslog | less ==== dos2unix ==== A fájlvége jeleket cserélhetjük az egyes operációs rendszerek számára. A fájl végét valamelyik rendszerben 1 bájt jelzi, valamelyikben kettő. Két bájt van használatban: * CR - ^M * LF - ^J A fájlvége jelek az egyes rendszereken: * Windows: CR LF * Linux, Mac OS X: LF * Apple: CR Telepítés: apt install dos2unix Telepítés a következő parancsokat kapjuk: * dos2unix * unix2dos * mac2unix * unix2mac A unix2dos szintaxisa: unix2dos [options] [-c convmode] [-o file ...] [-n infile outfile ...] Kapcsolók: [-fhkLlqV] [--force] [--help] [--keepdate] [--license] [--newline] [--quiet] [--version] Legyen egy vmi.txt nevű fájl, amely Unix rendszeren (Linux vagy Mac OS X) készült, így a sortörés LF bájt lett. Windowsos sortörést szeretnénk: * unix2dos vmi.txt Ha fel van telepítve a Midnight Commander, a szerkesztőjével nyissuk meg az elkészült fájlt: mcedit vmi.txt Az eredmény látható. Mivel az mcedit nem ismeri CR LF közül az CR bájtot, ^M karaktereket jelenít meg helyette. A -n kapcsolóval beállítható a kimeneti fájl is: unix2dos -n vmi.txt uj.txt Bináris és nem szabályos fájlokat, mint a linkeket automatikusan átlép a program, ha csak nem használjuk a --force kapcsolót. A -c kapcsoló: -c --convmode konverziósmód Módok a következők lehetnek: * ascii * mac * 7bit * iso További példák: unix2dos a.txt -c 7bit b.txt unix2dos -c ascii a.txt -c 7bit b.txt unix2dos < in.txt | iconv -f ISO-8859-1 -t CP850 > out.txt Több információért: man dos2unix ==== strings ==== ASCII karaktersorozatok keresése. Tipikusan bináris fájlokban szoktunk keresni olvasható szöveget. Például egy futtatható .exe vagy elf binárisban szeretnénk látni ki írta, hátha szerepel benne. strings /usr/bin/ls ==== tee ==== A tee parancs a bemenetét fájlba és az alapértelmezett kimenetre irányítja egyszerre. Akkor lehet hasznos, ha a fájlba írás mellett szeretnék a képernyőre is írni vagy a kimenetet egy másik programnak csővezetéken továbbadni. Fájlba és képernyőre: cat fajl.txt | tee kimenet.txt Fájlba és másik programnak: cat fajl.txt | tee kimenet.txt | sort Esetleg: cat fajl.txt | tee kimenet.txt | sort | rendezettkimenet.txt ==== dd ==== A dd parancs fájlok másolására használható. Legy például egy gy.txt állomány: cat > gy.txt szilva körte alma barack Készítsünk róla másolatot: dd if=gy.txt of=masolat.txt Nagybetűssé alakítás: dd if=gy.txt of=masolat conv=ucase Sajnos ez utóbbi csak az angol ábécé betűivel működik. Kisbetűssé: dd if=gy.txt of=masolat conv=lcase Az adatok kiírása fizikailag később történhet, mivel az operációs rendszer átmeneti tárolójába kerülnek. Ha szeretnénk az adatok fizikai kiírását azonnal, akkor adjuk meg a fdatasync jelölőt: dd if=gy.txt of=masolat conv=fdatasync Ha fájlokhoz tartozó metaadatok azonnali kiírását is szeretnénk, akkor: dd if=gy.txt of=masolat conv=fsync További részletek: dd --help ===== Egyéb parancsok ===== ==== zdump ==== Az aktuális időt írja ki az adott időzónában. Grinwicsi középidő például: zdump UTC Észak-amerikai idő lekérdezése: zdump EST Közép-európai idő lekérdezése: zdump CET Japán idő lekérdezése: zdump Japan Eredmény: Japan Sun Nov 20 20:32:16 2011 JST A használható paraméterek listája: ls /usr/share/zoneinfo ==== time ==== Megmérhetjük mennyi idő alatt hajtódik végre egy parancs Valósidő és folyamatidő. Statisztika mennyi ideig tartott a parancs végrehajtása. Például: time ls /usr/bin Eredményhalmaz: real 0m1.232s user 0m0.028s sys 0m0.048s Vagy time sleep 60 real 1m0.009s user 0m0.000s sys 0m0.004s ==== times ==== Statisztika a programfutásról times ls -l / Eredmény: 0m3.948s 0m1.392s 0m24.246s 0m3.240s ==== sleep ==== Várakozás meghatározott ideig. Alapértelmezett mértékegység a másodperc: sleep 5 5 másodpercig vár ==== hwclock ==== A hardveróra lekérdezése és beállítása. Ez a parancs csak root felhasználóként használható. ==== rdate ==== Az rdate csomag egy távoli gépről kérdezi le az időt. rdate -p -n time.kfki.hu Alapértelmezetten be is állítja az operációs rendszer idejét. Ez azonban csak root felhasználóként tehető meg. A -n kapcsoló az RFC 2030 SNTP protokoll használatára utasít. Eredeti időprotokoll az RFC 868. De ezt a példában szereplő kifki.hu intézet már régen nem szolgáltatja. ==== FIFO ==== === FIFO fogalma === Mi a FIFO? * Elnevezett csövek * Elnevezett pipe-ok * Egy különleges fájltípus Mire jó? Független folyamatok közötti adatcserét tesz lehetővé. === A FIFO használata === mkfifo pipeneve echo "Információ" > pipeneve & cat pipeneve Az első sorral elkészítjük a FIFO-t. A második sorral teszünk bele információt, amely háttérbe kerül a végére tett & jel segítségével. A cat pipeneve paranccsal olvassuk ki a FIFO tartalmát. A FIFO tartalma csak egyszer olvasható ki. A kiolvasással a háttérbe tett folyamat leáll. ==== ulimit ==== Az ulimit felhasználói limitek lekérdezésére és beállítására való. Pl.: ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 95 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited Ehhez hasonló eredményt kaphatunk. Az egyes tulajdonságoknak megfelelő kapcsoló a kimenetben látható. Például, ha csak a verem (stack) méretét akarom lekérdezni: ulimit -s Vagy felhasználóként mennyi folyamatot és szálat indíthatok. Lásd bővebben: [[oktatas:linux:rendszergazdai_parancsok#ulimit]] ==== lsof ==== A nyitott fájlokat mutatja COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd unknown /proc/1/cwd (readlink: Permission denied) init 1 root rtd unknown /proc/1/ ==== date ==== A dátum kiíratására és beállítására való. Szimplán, paraméterek nélkül kiírj a dátumot: date Eredmény: 2012. jan. 15., vasárnap, 11.07.34 CET Ha csak az aktuális évszámot szeretném: date +%Y Az év, hó és nap, kötőjelekkel tagolva: date +%Y-%m-%d Az év, hó és nap, tagolás nélkü: date +%Y%m%d Az idő lekérdezése, kettősponttal tagolva: date +%H:%M A kötőjeles forma megint: date +%F A kettőspontos forma újra: date +%R Vegyesen szóközzel tagolva: date "+%F %R" A következő paranccsal beállíthatom az időt (Ehhez rendszergazdai jogok kellenek): date 01151114 A mintában Január 15-öt állítok be, 11 óra és 14 percre. Ez persze csak rendszergazdaként fog működni. Így is lehet: date --set 1998-11-02 date --set 21:08:0 Néha előfordul, hogy egy időbélyeg számként van eltárolva, és szeretnénk olvashatóbb formában látni: date -d @1344444444 BSD rendszeren ugyanez: date -r 1344444444 ==== nice ==== A Linux operációs rendszerben meghatározhatók a folyatok prioritása. Egy nagyobb prioritású folyamat több processzoridőt kap. Nagyobb terhelés esetén ez lényeges lehet. Linux alatt fordított prioritás van. Minél kisebb számot adunk meg a prioritás annál nagyobb. A prioritás a következő intervallumban állítható: -20 ..19 A folyamat akkor kapja a legtöbb processzoridőt, ha -20 a prioritása. A ps kimenetében is megnézhetjük egy folyamat prioritását, ha használjuk a -l kapcsolót. Az oszlopok közül a nyolcadikban látjuk a prioritásokat, "NI" fejléccel. Prioritás beállítása indításkor. nice -n 5 nano ==== renice ==== Prioritás állítása futás közben. renice 2 -p 28488 28488: régi prioritás: 0, új prioritás: 2 ==== logger ==== A logger programmal felhasználóként is írhatunk egy /var/log/syslog könyvtárba. logger Ami a naplóba megy A naplóba dátummal, felhasználónévvel bekerül amit írtunk. ==== alias ==== Az alias parancs segítségével a parancsoknak megadhatunk alapértelmezett kapcsolókat. Az alias szintaktikája: alias [-p] [név=['parancs']] A szintaktikából kiderül, hogy önmagában is kiadható az utasítás, de a név után a parancs sem kötelező elem. Az alias parancs önmagában kiírja az aliaszokat: alias Ha például szeretnénk a -l kapcsolót folyamatosan megadni, akkor a következő parancsot adjuk ki: alias ls="ls -l" Másik példa: alias p="pwd" Harmadik példa: alias dir='ls -la' Negyedik példa: alias df="df -h" Ötödik példa: alias rm="rm -i" alias cp="cp -i" Az összes definiált alias megjelenítése: alias -p A -p kapcsoló valójában olyan, mint amikor kapcsolók nélkül adjuk ki az alias parancsot. A beállított aliasok újabb munkamenet esetén elvesznek. Ezért írjuk őket ~/.bashrc fájlba. Ugyanakkor nézünk szét ebben a fájlban az alias parancs után kutatva. A Debian GNU/Linux 6.x rendszerekben itt van néhány előre definiált alias, és egy lehetőség, mely szerint ~/.bash_aliases fájlban is meghatározhatunk újabb aliasokat. Ha ideiglenesen szeretnénk kikapcsolni az aliast tegyünk az adott parancs elé egy "\" jel karakteret: \ls A parancsokat egyszerűsíthetjük is: alias l='ls -al' A parancs részben megadható több parancs is: alias pl='ls; pwd' Más aliasokra is hivatkozhatunk: alias pl='l; p' Egyszerre több alias is létrehozható: alias l="ls -l"; p="pwd"; Csővezetékkel és grep párossal megoldható, hogy csak az alkönyvtárakat listázzuk: alias dir="ls -al | grep ^d" Tegyük fel, hogy van egy ilyen aliasunk: alias l="ls -a" Az l ezek után használható paraméterrel is: l /bin De kapcsolók is megadhatók: l -l /bin Olyankor is hasznos lehet, az alias, ha sokszor akarunk szerkeszteni egy állományt, ami alkönyvtárakban van nagyobb mélységben: alias e="nano /etc/network/interfaces" Ha Windowsos parancsokat szeretnénk: alias md="mkdir" alias dir="ls" alias del="rm -i" alias copy="cp" alias rd="rmdir" alias rename="mv" Az aliasnak van egy párja az unalias. Ezzel a paranccsal törölhetők az aliasok. Szintaktikája: unalias [-a] név [név ...] Példák: unalias ls unalias l ==== Keresés ==== === Szimpla keresés === Például keresem a main.c fájlt, amely az aktuális könyvtár valamelyik alkönyvtárban van: find -name main.c Lehetséges eredmény: ./c/main.c === Keresés helye === find /usr -name abook === A megtalált fájl becsomagolása === find -name main.c | xargs tar -cf valami.tar === Keresés időbélyeg alapján === A fájlok statisztikájánál már volt szó arról, hogy egy Linux háromféle időbélyeget tárol egy fájlról. * mtime -- modify time -- A fájl módosítása * atime -- access time -- A fájl olvasása * ctime -- change time -- Az inode módosítása Az emberek ezekből általában az atime-ot ismerik, ami megmondja számunkra, a fájlt mikor olvasták utoljára. Három napnál régebben olvasott fájlok: find . -atime +3 Esetleg, ha a gyökérből értelmezve akarom futtatni: find . -atime +3 -exec ls \; Az utolsó három napban módosított fájl: find . -mtime -3 Az utolsó 3 napban módosított txt fájlok: find . -name '*.txt' -mtime -3 A 10000 kbytenál nagyobb fájlok: find . -size +10000k === Fájl keresése tartalom alapján === find /utvonal/konyvtar -type f -exec grep -l "Amit keresek" {} + === Törlés === find . -name "*.py" -exec rm '{}' \; ==== Szabad hely ==== === Háttértár === df A df parancs paraméter nélkül, megmutatja hány darab 1 kilóbájtos blokk van az adott lemezen. Ebből mennyi foglalt és mennyi szabad. df -h A df lehetséges kimenete: Fájlrendszer 1K-blokk Fogl. Szabad Fo.% Csatol. pont /dev/sda1 95989516 20279928 70810468 23% / udev 10240 0 10240 0% /dev tmpfs 1196760 9572 1187188 1% /run tmpfs 2991900 31884 2960016 2% /dev/shm tmpfs 5120 4 5116 1% /run/lock tmpfs 2991900 0 2991900 0% /sys/fs/cgroup /dev/sda7 576615976 487657136 59645356 90% /home tmpfs 598380 4 598376 1% /run/user/118 tmpfs 598380 20 598360 1% /run/user/1000 Az udev partíció egy virtuális partíció, az eszközök számára. Az udev minden eszközt a /dev könyvtárban képez le eszközcsomóponttá, egy fájl formájában. A tmpfs partíciók virtuális partíciók a fizikai memóriában, ami gyorsítást szolgálja. Humánus kimenet, a tmpfs-ek kizárása, fájlrendszerek típusa: df -hT -x tmpfs -x devtmpfs === Memória === free Lehetséges kimenet: total used free shared buffers cached Mem: 5983800 4464320 1519480 97496 1050080 1560168 -/+ buffers/cache: 1854072 4129728 Swap: 2929660 0 2929660 ==== Információk a rendszerről ==== A terjesztéssel kapcsolatos információk megjelenítése: lsb_release -a Lehetséges kimenet: No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 6.0.5 (squeeze) Release: 6.0.5 Codename: squeeze #/bin/bash MHZ=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq` echo CPU Sebesség: $(($MHZ/1000)) MHz A processzor adatai: cat /proc/cpuinfo vagy: lscpu Hány bites a processzorod: grep flags /proc/cpuinfo Ha fenti kimenetben látod az lm szót, akkor 64-bites. ==== Terminál beállítása ==== A setterm parancs segítségével megváltoztathatjuk a terminálunk színeit. setterm -background white -foreground blue -store Virtuális terminálon nem működik. man setterm ==== Hexedit ==== Hexaszerkesztésre több csomagot is találunk parancssorban, nekem eddig a hexedit jött be a legjobban. hexedit Telepítés: apt-get install hexedit mkdir ~/munka/hex cp /bin/ls ~/munka/hex/ls hexedit ~/munka/hex/ls ==== A bc számológép ==== === Alap === Indítás: bc Kilépés: quit Segítség: man bc === Alapműveletek === Összeadás: 3+2 Kivonás: 3-2 Osztás: 14/3 Szorzás: 3*5 Hatványozás: 2^8 Gyökvonás: sqrt(9) === Számrendszerek közötti váltás === 10 -> 2 ibase=10 obase=2 5 101 10 -> 16 ibase=10 obase=16 12 C Bemeneti számrendszer kiíratása: print ibase,"\n" 2 -> 10 ibase=2 ibase=10 100 4 === Programírás === #!/usr/bin/bc print "Első szám: " a = read() print "Második szám: " b = read() c = a + b print "Összeg: ", c, "\n" quit #!/usr/bin/bc print "Első szám: " szam1 = read() print "Második szám: " szam2 = read() if (szam1>szam2) print "Az első szám nagyobb\n" if(szam1 === A stdin használata === A bc képes dolgozni az alapértelemzett bemenetről. Vagyis csővezetékből is képes adatokat venni: echo 3 + 5 | bc vagy: echo 8 "*" 512 | bc Váltás kettes számrendszerbe (10 -> 2): janos@iskolazo:~$ echo "obase=2; 5" | bc 101 Váltás kettes számrendszerből tízes számrendszerbe (2 -> 10): janos@iskolazo:~$ echo "ibase=2; 101; obase=10;" | bc 5 === Matematikai könyvtárak === A -l kapcsolóval betöltődik néhány függvény: * s(x) -- x szinusza; x-t radiánban várja * c(x) -- x koszinusza; x-t radiánban várja * a(x) -- x arkusz tangense; radiánnal tér vissza * l(x) -- természetes alapú logaritmus * e(x) -- e^x értéke * j(n,x) -- n-nedik Bessel függvénye A PI értéke nincs tárolva, de könnyen megkapjuk: pi=4*a(1) 3.14159265358979323844 A fokot ezek után így számolhatjuk radiánba, majd annak vehetjük szinuszát: fok=1 pi=4*a(1) rad=fok*pi/180 print s(rad) Alapértelmezett bemenetről szögfüggvények: janos@iskolazo:~$ echo "pi=4*a(1); fok=1; rad=fok*pi/180 ;s(rad )" | bc -l .01745240643728351281 ==== iconv ==== Az iconv parancs, állományokat konvertál más karakterkódolásra. A használható karakterkódolások a -l kapcsolóval kérdezhetők le: iconv -l Milyen ANSI kódolások támogatottak: iconv -l | grep -i ansi Az eredmény ilyen lehet: ANSI_X3.4-1968// ANSI_X3.4-1986// ANSI_X3.4// ANSI_X3.110-1983// ANSI_X3.110// MS-ANSI// Használatra példa: iconv -f ISO8859-2 -t UTF8 -o kimenet.txt bemenet.txt Vagy: iconv -f MS-ANSI -t UTF8 -o kimenet.txt bemenet.txt Ha nem tudjuk milyen kódolású amit szeretnénk átkódolni, használhatjuk a file parancsot: file szoveg.txt szoveg.txt: UTF-8 Unicode text, with CRLF line terminators ==== file ==== A file utasítással információt kérhetünk állományokról. Milyen kódolású egy fájl: file -i /etc/apache2/apache2.conf file /bin/ls ==== arch ==== A számítógép architektúrájának kiíratása. Az eredmény például i686. Megegyezik az uname -m paranccsal. arch uname -m ==== uptime ==== A gép mennyi ideje megy, mekkora az rendszerterhelés. Az uptime parancs lehetséges kimenete: 10:37:00 up 1:06, 3 users, load average: 0,79, 0,82, 0,71 A load average értéke például 0.01 0.01 1.00, a processzorok átlagos elérési ideje. * első szám: rövid távon * második szám: közép távon * harmadik szám: hosszú távon Ha 1.00-nál a szám kisebb akkor a processzor mindent azonnal kiszolgál. Ha nagyobb mint 1.00, akkor a proceszeknek várakoznia kell. ==== Ellenőrző összeg ==== CRC összeg számítás: cksum fájlnév Ellenőrző összeg számítása, BSD és System V algoritmusai: sum fájlnév MD5 ellenőrző összeg készítése: md5sum fájlnév.kit > md5szam.txt MD5 ellenőrzése: md5sum -v -c md5szam.txt A -v hatására kiírja ha az állomány rendben: OK Ha nem ok, akkor: FAILED ==== Minimális személyes kalendárium ==== A when nevű parancs egy minimális személyi kalendáriumot valósít meg. Letölthető a [[http://www.lightandmatter.com/when/when.html|weboldaláról]], [[https://github.com/bcrowell/when|git tárolóból]]. Debian alapú rendszereken csomagból telepíthetjük: apt-get install when Telepítés után kapunk egy "when" parancsot. Első indításkor a következő üzenetet kapjuk: You can now set up your calendar. This involves creating a directory ~/.when, and making a couple of files in it. If you want to do this, type y and hit return. Az üzenet szerint beállíthatjuk a kalendáriumunkat, amihez létre kell hozni egy ~/.when könyvtárat. Ha ezt az üzenet megértettük, akkor várja, hogy "y" leütésével nyugtázzuk, majd közli mi az alapértelmezett szövegszerkesztő. y You can edit your calendar file using your favorite editor. Please enter the command you want to use to run your editor, or hit return to accept this default: emacs -nw Én beírtam az "mcedit" parancsot, mivel ezt a szövegszerkesztőt szeretem. mcedit You can now add items to your calendar file. Do ``when --help'' for more information. Szo 2015 szept 26 4:50 A kalendárium szerkesztése ezek után: when e Ha az előbb a mcedit szövegszerkesztőt beírtuk, akkor azonnal el is indul, amely szerkeszti számunkra a ~/.when/calendar állományt. Írjunk be egy teszteseményt: * szept 26 Tesztesemény A csillag azt jelenti az év minden napján. A szeptembert magyarul beírva is értelmezi a program. A napot 26-ra állítottam a példában. Mentés után lépjünk ki a szerkesztőből és futtassuk a "when" parancsot. $ when Szo 2015 szept 26 4:52 today 2015 szept 26 Tesztesemény A program kiírja az aktuális napot, és az aktuális eseményt, ha van ilyen bejegyezve, a fenti példához hasonlóan. ==== truncate ==== Csökkenti vagy növeli egy fájl méretét a megadott méretre. **//Figyelem: a csökkentés vagy növelés után egyes parancsok nem a fájl valós méretet mutatják. Ha más eszközzel írjuk a fájlt, a helyzet rendeződik.//** A fájl méretét a -s, illetve a --size=MÉRET kapcsolóval adjuk meg. trunate -s 0 egy.txt Ha nulla értéket adunk meg, akkor a fájl tartalmát töröljük. Ha megadott méret nagyobb mint a fájl aktuális mérete, akkor az üres részek 0 bájttal töltődnek fel. A kísérlethez hozzunk létre egy fájl: echo vmi1 > egy.txt Nézzük meg méretét: $ ls -l összesen 4 -rw-r--r-- 1 janos janos 5 szept 19 19:20 egy.txt Állítsuk be új fájlméretet: truncate -s 3 egy.txt Nézzük meg újra a fájl méretét: $ ls -l összesen 4 -rw-r--r-- 1 janos janos 3 szept 19 19:20 egy.txt Ha a megadott méret kisebb mint az eredeti fájlméret, akkor a fájl tartalmát egyszerűen levágja. truncate -s 15 egy.txt ===== SMB megosztás elérése ===== Az SMB megosztások eléréséhez itt az **smbclient** parnacsot használjuk. Ehhez telepítve kell legyen egy ilyen nevű csomag. Egy állomány feltöltése: smbclient --user kati -c "put vmi.txt" //192.168.1.4/homes A kati felhasználó könyvtárába töltjük fel a vmi.txt fájlt. Ha az aktuális felhasználó (ahol kiadjuk a smbclient parancsot) megegyezik a megosztás felhasználónevével, akkor nem kötelező a --user kapcsoló: smbclient -c "put vmi.txt" //192.168.1.4/homes Elérés interaktív módon: smbclient //192.168.1.4/homes Vagy van amikor a szerveren a megosztás csak "home": smbclient //172.16.0.1/home Esetleg így: smbclient --user joska //server/home ^ Általános kapcsolók ^^^ ^ kapcsoló ^^ Leírás ^ | -U | --user=felhasználónév | Felhasználónév megadása | | -L | --list | A távoli gép szolgáltatásait mutatja | | -W | --workgroup=tartománynév | SMB csoport megadása | | -D | --directory kezdőkönyvtár | Kezdő könyvtár megadása | | -c | --command parancsszöveg | Parancs végrehajtása a távoli szerveren. \\ Kapcsolat nélkül szoktuk használni | Általánosan használt parancsok ^ Parancs ^ Leírás ^ | help [parancs] vagy ? [parancs] | Az összes parancs megjelenítése, \\ vagy egy adott parancs elírása | | history | Parancstörténet megjelenítése | | cd [könyvtár] | az aktuális könyvtár cseréje; argumentum nélkül az aktuális könyvtárat adja | | lcd | a helyi könyvtár cseréje | | put [távoli név] | fájl feltöltése | | get [helyi név] | fájl letöltése | | ls [maszk] | az aktuális könyvtár tartalma | | mget | minden maszkra illeszkedő fájl letöltése | | mput | minden maszkra illeszkedő fájl feltöltése | | recurse | a rekurzív fel és letöltés engedélyezése az mget/mput parancsok esetén | | prompt | Várakozás minden egyes fájl vagy könyvtár esetén, \\ amikor mget/mput parancsot használjuk. \\ Alapértelmezetten engedélyezve van. | | ! | helyi parancs futtatása és a kimenet elkapása | | listconnect | Az aktuális kapcsolatról ad információt | | more | Távoli fájl lekérése és tartalmának megmutatása \\ a PAGER környezetei változóban beállított lapozóval | | rename <új fájlnév> | Fájlok átnevezése az aktuális \\ könyvtárban, a távoli gépen | | rm | Az összes maszkkal egyező fájl törlése a távoli szerveren | | rmdir | Adott könyvtár törlése | | showconnect | Aktuális kapcsolat megjelenítése | | lowercase | Távoli fájlnevek kisbetűssé alakítása a get és mget parancsok számára. | Az smb megosztások elérhetők az smbnetfs csomag smbnetfs parancsával, de jelenleg bugos. ===== Függelék ===== ==== A yes parancs ==== A yes parancs mint láttuk, folyamatosan a "yes" szót írja a képernyőre. A folyamatkezelés fejezetben a folyamatok bemutatására használtam. A yes parancs használható arra is, hogy olyan parancsok és scriptek számára, amely bemenetként ezt a szót várja, átadjuk számára csővezetéken keresztül: yes | script.sh ==== watch ==== Ha van egy parancs ami ad egy kimenetet, utána kilép, a watch jól jöhet. Folyamatosan figyeli, hogy változott-e a kimenet: watch ip r ===== Utószó ===== Ezt az írást (most erre az egy lapra gondolok: Linux parancssor) még 2009-ben itt kezdtem el írni: * http://hu.wikibooks.org/wiki/Linux/Parancssor Itt azonban kötekedett az ottani "vezető", hogy hogyan alakítsam a tartalmat, mit írjak még, ne csak a parancssort tartalmazza a leírásom. Én azonban csak a parancssorról akartam írni, mert arról is lehet több könyvnyi anyagot írni. Na meg legyen hasonló a "Win" leíráshoz. Ezt megelégeltem. Tulajdonképpen akkor gondoltam, hogy szükség lenne egy saját wikire. Íme a SzitWiki (http://szit.hu). Remélem másnak is hasznára válik. ===== Források ===== ==== Külső linkek ==== * http://www.gnu.org/software/bash/manual/html_node/ (2018) * http://hu.opensuse.org/Dokument%C3%A1ci%C3%B3/SL9.3/Rendszer/A_Linux_f%C3%A1jlrendszerei (2018) * http://www.thegeekstuff.com/2012/02/linux-fuser-command/ (2018) * http://thesmithfam.org/blog/2006/05/23/bash-socket-programming-with-devtcp-2/ (2018) * http://linux.about.com/od/commands/a/blcmdl1_findx.htm (2018) * https://linuxbox.hu/find (2018) * http://www.comptechdoc.org/os/linux/programming/linux_pgsignals.html (2018; Jelzések) * http://www.nano-editor.org (2018; Nano) * http://www.linfo.org/alias.html (2018) ==== Helpek ==== * grep --help * man grep