HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Biztonságos SCP az SSH kínjai nélkül

2009.02.13. 13:53 bagoj ur

 

Múltkoriban írtam az SSH és az SCP biztonságosságáról, illetve lehetőségeiről. Kaptam jópár választ itt kommentben is, illetve email-ként is, de egyikben sem volt benne az a dolog, amiről ma szeretnék írni. Ez pedig a "nem minden szarka farka tarka" alapon működő SCPonly alkalmazás.

A név magáért beszél: szeretnénk biztonságos fájl hozzáférést adni, de az SSH minden (előző írásomban felsorolt) nyűgje nélkül. Úgy tűnik, ezek a bizonyos nyűgök már másnak is feltűntek, és ezek az emberek nagy szerencsénkre szorgos fejlesztésbe kezdtek. Mi is élvezhetjük munkájuk gyümölcsét, ha telepítünk egy scponly shellt, és hozzárendeljük az adott felhasználóhoz.

Az scponly képes chroot kalitkába zárni a delikvenst, logolja a belépéseket és a le/feltöltéseket. A külvilág számára természetesen továbbra is csak egy SSH-szerver látszik, az azonosítást az OpenSSH végzi el, és csak ezután kerül a vezérlés az scponly shellhez, amely nem engedi az interaktív parancssor elérését. Természetesen SFTP, Winscp2, gftp és rsync-kompatíbilis.

Mielőtt telepítjük, gondolkodjunk: Ha szeretnénk elérni, hogy a felhasználó ne kolbászolhasson a megadott könyvtárnál feljebb, és más scponly felhasználók fájljait se lássa, akkor természetesen meg kell terveznünk a jogosultságokat (ssh-s helyzetben ez természetesen még inkább fontos lenne!). Az scponly felhasználókat egyesével létre kell hozni a rendszerben (legyenek bár lokális, vagy pl. LDAP-azonosításúak), elvenni minden nem saját csoporttagságot (értsd: bagoj usert szedjük ki az összes csoportból, kivéve a külön neki létrehozott bagoj nevű csoportot), és a saját könyvtáruk jogait is csak saját magukra kell beállítani (értsd: bagoj:bagoj, 0700-s jogok, 077-es umask).

Jól jöhet a chroot, ha ki akarjuk zárni a program hibából adódó kitörési lehetőséget. Ebben az esetben viszont figyelni kell, hogy ilyenkor setuid-esként kell futnia a shellnek, azaz root jogokat vesz magára. Én ebbe belegondoltam és úgy érzem, nem is kell annyira az a chroot...

Telepítés

Nem fogjátok elhinni, de Ubuntun ez már megint csak ennyi:

sudo apt-get install scponlyMajd ezután, ha újonnan hozunk létre scponly felhasználót, akkor

adduser --home /var/sftp -s /bin/scponly scpuserHa már létezik a felhasználó, akkor a /etc/passwd fájlban írjuk át a shellt (pl. /bin/bash) /bin/scponly-ra. A --home paraméter után megadott elérési út természetesen az scp könyvtárat jelenti a rendszerben; és ismét: ha nem újonnan hozzuk létre a felhasználót, akkor ezt is át kell írnunk a passwd fájlban.

Mivel alapértelmezésben egy rakás csoportba bekerül a felhasználó (és ennek szabályozására úgy tudom, nincs adduser kapcsoló), kénytelenek vagyunk utólag kigyomlálni a /etc/group fájlból. (Aki erre tud szebb megoldást, szóljon!)

Lényegében készen is vagyunk.

Jó scponly-zást! :)

Szólj hozzá!

Ubuntu minimal visszavág - Crunchbang! :-)

2009.02.01. 14:46 bagoj ur

Figyelem! A Crunchbang újabb változatát tesztelem itt.

Először is köszönöm, hogy annyian megnéztétek az eredeti Ubuntu minimal-os postot. Mivel az még Hardy-n készült, ezért úgy gondoltam, hogy kicsit aktualizálni kellene:

  • szerettem volna egyszerűbbé tenni a telepítést

  • kicsit próbáltam adni a Mini Linux külsejére is

  • Ezek miatt egy szkriptet akartam rendszeresíteni a készítéshez, amelynek a működését el is magyarázom.

  • A harmadik dolog, amin már régóta gondolkodom, egy szkript a kernel fordítás elvégzéséhez.

Jó, ha "bolondbiztos", hogy ne lehessen félrenyomni, de a legjobb nyilván az, ha emellett tudjuk is, mit csinálunk.

Hogy hogyan lett ebből a postból mégis egy disztribúció teszt? Csak úgy, hogy az eredeti célok ezek voltak:

  1. Ubuntu karakteres felület telepítése
  2. Csomagtelepítés, amely a minimalista de nagyon jól használható LXDE grafikus környezetet rakja össze
  3. Tetszőleges csomagtelepítés, amely kedvenc alkalmazásainkat rakja fel

Nem régóta létezik egy Ubuntu-származék, amely ugyanilyen célkitűzésekkel indult el. Mindig az aktuális Ubuntu verzióból építkezik, és néhány csomagból elkészítik a saját változatukat annak érdekében, hogy egységes és szép legyen a kinézet. Ugyan természetesen itt is arról van szó, hogy helyettünk a készítők válogatják ki a programokat, de kárpótolhat az, hogy bőséges és elég normális a kínálat. Ezt a postot éppen Crunchbang! Linux alól írom.

Ami tetszett

A készítők semmi olyat nem tettek, amelyet én vagy a blogot olvasók közül bárki ne tudna megtenni: készítettek egy pár csomagot, például a cruncbang-desktop névre hallgatót, amely függ egy nagy rakás programtól, amit amúgy Ubuntu alá is le tudnánk húzni. Ha felrakjuk ezt a crunchbang-desktop csomagot az összes függőségeivel, akkor már meg is úsztuk, hogy nekünk egyesével kelljen összevadászni, mire is van szükségünk. Ezzel sokak válláról épp a "telepítés-próbálgatás-letörlés" részét veszik le. A Crunchbang Linuxban lévő programok már elég kiforrottan működnek, mégis "lájtosak", és mégis Ubuntu alapú az egész, tehát a tényleges kód a Canonicaltól jön, még ha a cég a Crunchbang! linuxot nem is támogatja.

A letöltés a szokásos, háromféle lehetőségünk van: Egy sztenderd, egy light (ami még a lightnál is lightabb), és egy eeePC-re optimalizált változat. A sztenderd egy darab cd-n elfér, és ami a vicces, hogy sok olyan belefért, ami a sima Ubuntuba nem fér bele, mivel a desktop könyezet annyival többet foglal a telepítő médián. Hogy példákat említsek:

  • Alapból van Skype - van, akinek ez fontos
  • Fel vannak telepítve az msttcore betűkészletek (Arial, Times New Roman stb.)
  • Öööö... más nem jut eszembe.... :-)

A "lájtos fíling"-re szerintem az is rájátszik, hogy először is a desktop alap kinézete spártai, illetve a szokásos, tálcán helyet foglaló menü helyett az Openbox ablakkezelő menüjét alkalmazza (természetesen a tálcára is rá lehet "varázsolni" a menü gombot, mindössze jobb gomb és "Add remove panel items", majd "Add" gomb és kiválasztjuk a "Menu"-t). Nagyon zseniális húzásnak tartom, hogy a gyakrabban használt alkalmazásokat billentyűkombinációkkal is elő lehet hívni, és ezeket a kombinációkat fel is sorolja a háttéren (pl. Super + W = böngésző, a "Super" billentyű az ugyebár a "Windows gomb"). Ugyancsak a háttéren olvashatunk rendszerünk főbb paraméteréről valós időben adatokat a conky nevű programocska segítségével. Hogy lezárjam a bekezdés elején megkezdett gondolatot, a billentyűről indítás, a nagyon unixos "desktopon jobbklikk" menü és a sima fekete-fehér alapszínek ugyanúgy rájátszanak a sebességélményre, mint rácsingolós-tuningverdás embereknél a fejre fordítva feltett bézbólsapka és az autó alján a neonok. :)

Egyebet nem tudok elmondani, kérem kapcsojja ki. Az LXDE-n és 1-2 apróságon kívül lényegében minden az Ubuntuból van: megtalálhatjuk a jól ismert Network Managert, Firefoxot, Pidgint, GIMP-et... inkább arról beszélnék, ami eltér:

  • Levelezésre a Sylpheed-claws, újabb nevén csak simán Claws levelező használható alapértelmezetten. Sok éve fejlesztik, én régen használtam is, de a fejlesztői kicsit hadilábon álltak a HTML-alapú levelekkel; és ez nem abban nyilvánult meg, hogy nem tudták leprogramozni, hanem hogy nem akarták, mert ellene voltak. A világ azonban nem a plaintext levelek felé halad... mindenesetre levelet írni még mindig nem lehet html formátumban.
  • Hogy most éppen a Deluge vagy a Transmission torrent kliens van-e fent (itt az előbbi), nekem tökmindegy. Viszont megismerkedtem az Agave nevű paletta-generáló programmal, ami nagyon megtetszett: megadok egy színt, és azzal harmonizáló színeket képes generálni. Grafikai munkákhoz nagy könnyebbség!
  • A multimédiás rész nekem elsőre nem nyerte meg a tetszésem: A VLC-t nem szeretem, mert egyszerűen nem tetszik. Videovágóból kettő is felkerült, nem tudom hogy mennyire népszerű a PiTiVi és a Kino azok között, akik mini linuxra vágynak, de mindegy. Zenerippelőből, -lejátszóból, -konvertálóból jutott bőven: Serpentine, Sound Juicer, Audacity, Rhythmbox, Gnome Sound Converter és persze a VLC.
  • Még nem ismertem az xfburn nevű kis cd/dvd író programfelületet - ugyan még igen béta, de máris sok mindent tud. Eredetileg az XFCE része, ezért vonz is magával pár függőséget. Félig ismertem az Osmo nevű naptár és tennivaló-nyilvántartót; nekem bőven megfelelne, csak sajnos nem találtam megoldást a Google Calendarral való szinkronizációhoz. Office alkalmazásként az Abiword és Gnumeric programok állnak rendelkezésre - nekem van egy teljesen szimpla .doc fájlom, azzal szoktam tesztelni és meg kell mondjam, az Abiword 2.6.4 nagyon jól vizsgázott; jobban mint Ubuntun az Openoffice. A megnyitás ideje itt 48 másodperc volt, és a megfelelő fontkészletek miatt majdnem hibátlanul jelent meg az 1.3Mb-os, 318 oldalas duplahasábos Word fájl; az OOO sajnos 10 percig küzd rajta, mire sikerül konvertálnia. Még József Attila összesét is szépen megnyitotta 20 másodperc alatt. Komolyan, megelpően jó.
  • Ami nagyon tetszett még, hogy egy szép csokor konzolos alkalmazást is becsempésztek: MoC zenelejátszó, eLinks böngésző, rtorrent bittorrent-alkalmazás, newsbeauter RSS-olvasó stb. Ráadásul a Terminator nevű terminál program is megvan, ami azért nagyon jó, mert nem csak tab-okat tud létrehozni, hanem a tabokon belül vízszintesen és függőlegesen fel tudjuk osztani a képernyőt még további részekre. Így kell elképzelni:

 

Egy Terminal-on belül fut a zenelejátszó, mixer és RSS-olvasó - a Terminator segítségével

Mi nem tetszett?

Nincs disztribúció hiba nélkül, következzenek most ezek:

  • Bár sokat foglalkoztak a fejlesztők az egységes kinézettel, a programok nem egységesen működnek. Nem is csoda, hiszen úgy lettek összevadászva különféle desktop környezetekből. Így a Gnome-ból származó programok követik a GTK beállításokat (pl. a "csak szövegek" beállítást a programok fejlécében (a File Edit stb. menü alatti toolbarról beszélek) az XFCE-s programok nemkövették. Ugyanígy, ha egy program nem válaszol és ki akarnánk lépni, a Gnome-osok felajánlják, hogy kilövik a processzt. Ugyanezt a Claws-nál az xkill nevű népszerű kis programmal kellett megoldanom, alt+f2 és onnan indítottam el).
  • Bosszantó apróság, hogy a "Munkaasztal"-nak nem csináltak könyvtárat. Így mondjuk a PCManFM fájlmenedzserben ott van a könyvjelző az "Asztal"-ra, de mégsem működik. Cserébe nincs ott az összes többi (tudjátok, "Képek", "Videó" stb.)
  • Az előzőhöz hasonló dolog, hogy van "images" mappa, de a képnézegetőnek és a Gimpnek nem az van beállítva alapértelmezett mappának. Apróság, és emiatt valószínűleg saját csomagot kellene gyártaniuk, de szerintem az összerakottság-érzés miatt megérné.
  • Annak ellenére, hogy megvan a könnyed, "light" hangulat és a programok is kicsik, azért memóriát igencsak tudnak zabálni. Egy igen öregecske PIII-as gépen próbálkoztam ugyan 256Mb RAM-mal, de 512Mb-ra mindenképp szükség van.
  • Nyilván a "programcsokor" összeállításában mindig van kivetnivaló, én a VLC-t nem szeretem, de helyette felpakolhatok bármit, ami az Ubuntu repókban benne van. Nem szeretem a Claws-t sem, de ott a Thunderbird, ami 30 másodpercen belül telepíthető. Ugyanez érvényes a magyar nyelvi támogatásra - alapértelmezésben nincs ilyen a telepítő cd-n és nem is ajánlja fel a telepítést első indításkor, mint az Ubuntu. Nincs mese, kézzel kell feltenni a language-hu fájlokat.
  • Az Ubuntu kernelhez és az indított szolgáltatásokhoz nemigen nyúltak hozzá a készítők. Emiatt az initrd-s várakozás, illetve ezután a sok elinduló folyamat miatti viszonylag lassú boot ugyanúgy megvan, mint az Ubuntuban. Ha már bejött a bejelentkező képernyő, onnantól viszont egy mai modern gépen igencsak lobog a hajunk... :-)
  • Nem találtam közvetlen megoldást távoli SMB/CiFS megosztások felcsatolására.

Összegzésül: Jó utat választottak, ha lenne időm hogy teljes erőbedobással foglalkozzak egy mini linuxszal, én is hasonlóan csinálnám. Annyira nem voltak bátrak, hogy az Ubuntu rendkívül széleskörű hardvertámogatását megnyirbálják egy újrafordított, netán saját kernellel, ezért lassabb boot idővel kell fizetnünk. Sok apró, hasznos programot tettek fel, melyeket részben vagy egészben nem ismertem eddig. Alapból indul a Parcellite nevű vágólap-manager amit nem is értem, miért nem használtam eddig. :-) Igen jól vannak belőve a billentyűkombinációk (már persze csak akkor, ha van Windows-billentyűnk), és ez egy tipikusan olyan dolog ami nagyon egyszerű, mégis hatékony és amit a nagyobb grafikus környezeteknél elfelejtenek vagy beállítani, vagy erről információkat terjeszteni, hogy pl. Gnome-ban is működik a ctrl+alt+L, ctrl+alt+d stb.

Ajánlom ezt a terjesztést mindenkinek, aki hozzászokott az Ubuntuhoz és valami hasonlót, csak kicsit mégis mást keres. Hogy ez pluszban még gyorsabb is, az külön bónusz. Arra viszont ne számítson senki, hogy RAM-ot vagy diszket nem fog kérni bőven (a telepítés után 2,2Gb-ot foglalt, és 512Mb memória mindenképp kell).

Ahogyan a vacsoracsatákban szokták mondani, a külalakra, a gyorsaságra és az egész estére ...... dobpergés ..... a következő pontszámot adom:

78%

(Utólag levettem 3%-ot a Windows share támogatás hiánya miatt)

2 komment

Címkék: linux teszt ubuntu 8.10 crunchbang

Ronda, de hatékony - awk

2009.01.21. 23:32 bagoj ur

Ma a kissé szerencsétlen nevű awk parancsról szeretnék írni (és arról is fogok), azaz folytatnám az "Elfelejtett világ" sorozat első részét. Hogy miért szerencsétlen a név? Az awkward ugyebár ügyetlent, szerencsétlent jelent angolul. Ráadásul az awk-t vezérló kód nagyban hasonlít egy véletlenszerű karaktersorozatra, aki rátekint annak biztosan citrommá szűkül a feje. Mégis, az awk-t minimális tudással is lehet kezelni és egész sok apró-cseprő napi teendőben képes másodpercek alatt segíteni.

Kis keretes bekezdésemben néhány alapvető dolog: Az awk a neki megadott fájlokon soronként halad végig, és az általunk most használt kis egysoros parancsokat minden egyes sorra érvényesíti. Minden egyes parancsblokkot kapcsos zárójelek közé kell tenni (ez C programozóknak nyilván ismerős), és ha csak egy print parancsot adunk ki, az is egy blokk, tehát { print } -et kell írnunk.

Az első okosság, hogy az awk feldarabolja, pontosabban fel tudja darabolni az adott sort szakaszokra. Egy olyan szövegben tehát, amire valamilyen szabály érvényes (pl. Excel/CSV fájl tartalma, ahol az oszlopszám ugyanaz minden sorban), nagyszerűen tudunk manipulálni. A feldarabolt szakaszokat a $1, $2, $3 ... stb változókba pakolja, a $0 pedig a teljes sort jelenti. Azt, hogy mi mentén darabolja a sort, mi adjuk meg neki; tehát például a /etc/passwd fájlban kettőspontokkal vannak elválasztva a felhasználói adatok. (Ha valaki nem tudja, hogy néz ez ki, egy cat /etc/passwd paranccsal mindenekelőtt nézze meg!) Ha szeretnénk listázni a felhasználók login id-jét és hozzá a nevét, akkor tudjuk ezt tenni:

$ awk -F ":" '{print $1 $5}' /etc/passwd
rootroot
daemondaemon
...
(A sor elején lévő dollárjelet nehogy begépelje valaki!!! Azzal csak egy új sort jelzek a terminálban. Ha esetleg valakinek ez új lenne.) A -F paramétere természetesen az elválasztójelet jelenti, alapban a szóközt veszi annak. Fel lehet egymás mögé sorolni többet is. Nade ez csúnya, egybeírja, meg minden...

$ awk -F ":" '{print $1 "," $5}' /etc/passwd
root,root
daemon,daemon
...
bagoj,Bagoj úr
Mindjárt jobb. Még szebb lenne, ha tudnánk feltételeket írni és ahol megegyezik a két mező (tehát pl. mindkettő "root"), azt a sort nem írjuk ki.

$ awk -F ":" '( $1 != $5 ) {print $1 "," $5}' /etc/passwd
list,Mailing List Manager
irc,ircd
...
bagoj,Bagoj úr
Hoppá, ez ilyen egyszerű? Mi lenne, ha csak azokat a sorokat írnánk ki, amelyek nem technikai felhasználók, hanem valódi userek? Megtehetjük, hiszen az Ubuntu a technikai felhasználók uid-ját, azaz számszerű egyedi azonosítóját 0-999-ig osztja ki, az emberi felhasználóké pedig 1000 vagy afeletti. A uid a harmadik oszlop a /etc/passwd fájlban. Akkor ezt most próbáljuk is ki:

$ awk -F ":" '( $3 >= 1000 ) {print $1 "," $5}' /etc/passwd
nobody,nobody
bagoj,Bagoj úr
Nocsak, máris megdőlt az állításom: hiszen a nobody user azonosítója 65534! De az biztos, hogy remekül működik a parancs. :) A játék lényege, hogy ha mondjuk abbahagyjuk szerencsétlen passwd fájl abajgatását és mondjuk egy CSV-t kezdünk bántani, máris látszik hogy alapvető szűréseket milyen egyszerű elvégezni. Elkészítettem a következő fájlt, proba.csv néven:

Fizetés,2009.01.12,+,71500
Benzin,2009.01.12,-,7255
Kaja a boltbol,2009.01.15,-,8290
Ebedpenz,2009.01.16,-,3500
Béla megadta a kölcsönt,2009.01.20,+,20000
Kocsma,2009.01.20,-,12500
Asszem elég egyértelmű: A kiadások mínusszal, a bevételek plusszal számítanak.

$ awk -F "," '( $3 == "+" ) {print $1}' proba.txt
Fizetés
Béla megadta a kölcsönt
$ awk -F "," '( $3 == "+" ) && ( $4 > 50000 ) {print $1}' proba.txt
Fizetés
$ awk -F "," '( $4 >= 5000 ) {print $3 $4 "\t" $1}' proba.txt
+71500    Fizetés
-7255    Benzin
-8290    Kaja a boltbol
+20000    Béla megadta a kölcsönt
-12500    Kocsma

Azt hiszem, eddig érthető a játék. Ezek mellett az awk képes regexp, azaz reguláris kifejezésre is illeszteni; magyarul csak azokkal a sorokkal fog foglalkozni, amelyek illeszkednek. Ha Béla viselt dolgaira vagyunk kiváncsiak:

$ awk -F "," '/Béla/ {print $3 $4 "\t" $1}' proba.txt
+20000    Béla megadta a kölcsönt
Az awk remekül tud számolni is:

$ awk -F "," '{print $3 ($4+300) "\t" $1}' proba.txt
+71800    Fizetés
-7555    Benzin
-8590    Kaja a boltbol
-3800    Ebédpénz
+20300    Béla megadta a kölcsönt
-12800    Kocsma
Hozzáadott minden összeghez 300 Ft-ot. Persze ha négyzetre akarjuk emelni, az is megy, akkor $4^2-t kellene írnunk. Mielőtt teljesen bedurvulnánk, elmagyarázom, hogy a fő kódblokk (ami most a kapcsos zárójelek között van) mellett az awk tud kezelni egy úgynevezett BEGIN és egy END blokkot. Ezek arra szolgálnak, hogy a fő blokk előtt és után inicializálásokat, illetve végső kalkulációkat tudjunk végrehajtani. Ennek demonstrálására készítünk egy görgetett összeget, azaz kimutatjuk, hogy hány forint volt a zsebünkben az adott kiadás vagy bevétel után. Ehhez már kell egy inicializálás blokk, ahol nullára állítjuk az összegző változónk értékét. Mivel így már nem tudom szépen és átláthatóan megírni egy sorba, ezért elárulom, hogy az awk parancsok szöveges fájlba is írhatók, és -f paraméterrel végrehajtathatók az awk-val, pl. így: awk -f szumma.awk proba.txt. A következő kódblokkot a szumma.awk fájlba írom:

BEGIN {
        szumma=0
        FS = ","
}
{
if ($3 == "+") { szumma=szumma+$4 }
else           { szumma=szumma-$4 }
        print $3 $4 "\t" szumma "\t" $1
}

Aki picit is tanult programozni, annak egyértelmű: Az elején a szumma nevű változót nullázzuk, és mivel itt is lehet, beállítottam a mezőhatárolót vesszőre (hiszen vesszővel elválasztott értékeink vannak). Így szükségtelen lesz a -F paraméter futtatáskor. Ezután, ha az előjel negatív, akkor kivonunk, ha pozitív, akkor hozzáadunk, majd kiírjuk a sort.

Aki házi feladatként egy END nevű blokkot is szeretne a végére rakni, az összesítse az összes kiadást és bevételt, ez alapján mennie kell a dolognak. :-) A futtatás így néz ki:$ awk -f szumma.awk proba.txt
+71500 71500 Fizetés
-7255 64245 Benzin
-8290 55955 Kaja a boltbol
-3500 52455 Ebédpénz
+20000 72455 Béla megadta a kölcsönt
-12500 59955 Kocsma

Ennél jobban nem szeretnék durvulni, pedig az awk ennél sokkal keményebb. :-) Mindössze annyit még, hogy igen hasznos változó a NF, amiben a mezők száma található; illetve a NR, amiben a rekordok száma van - mivel alapértelmezetten egy rekord egy sor a fájlban, ez tartalmazza, hogy hány sorból áll a fájl. Erre a két paraméterre építve szeretnék két példát még elsütni, mert mindkettő iszonyat hasznos tud lenni. De előtte egy kicsit lazítsunk:

1. Feladat

Van egy nagy rakás mp3-unk egy könyvtárban, mindegyik fájl elnevezése következetes, mégpedig "Sorszám.Szám címe-Előadó.mp3", azaz egy példa: "003.This is the sound-Feel Good Production.mp3". Mi szeretnénk, ha az előadó és a szám címe helyet cserélne. Valószínűleg erre még ne mírtak grafikus programot, de nem esünk kétségbe, csak használjuk eddigi tudásunkat:

  1. A fájlokat egyesével átadjuk az awk-nak
  2. Az awk megcseréli a kettes és hármas oszlopot, mező szeparátor a pont és a kötőjel
  3. Ha a szám címében vagy az előadó nevében van pont vagy kötőjel, azzal most nem foglalkozunk, de gondolunk rá - a mezőszám alapján tudjuk ezt megállapítani. Ha háromnál négynél nagyobb, nem próbáljuk átnevezni a fájlt, mert jelenlegi képességeinket meghaladja.
  4. Ne felejtsük el, hogy a végén a .mp3 is egy új mezőnek számít, hiszen a pont szeparátor!

Még egy kis magyarázat a -F paraméter után következőkhöz: A pont (.) mindenre illeszkedik a reguláris kifejezésekben. Ha ténylegesen a pontra akarunk illeszteni, akkor "\."-t kell írni. Az utána jövő pipe az itt a vagylagosságot jelenti, azaz a "\.|-" jelentése: egy darab pont vagy egy darab kötőjel. Itt a kis egysoros, amely csak kiírja a megfordított neveket:

for i in *; do echo $i | awk -F "\.|-" '(NF == 4) {print $1 "." $3 "-" $2 "." $4}'; done

Magától értetődő, hogy a szeparátort (azaz a pontot és kötőjelet) nekünk kell a print esetén pótolni, hiszen az elválasztójel nem része egyik mezőnek sem. Lássuk ugyanezt, átnevezéssel:

for i in *; do UJFILENEV=$(echo $i | awk -F "\.|-" '(NF == 4) {print $1 "." $3 "-" $2 "." $4}'); mv "$i" "$UJFILENEV"; done

Ezt az UJFILENEV változót azért kellett bevezetnem, hogy idézőjelek közé tudjam írni, hiszen ha szóközök is vannak a fájlnévben, azt az mv parancs több fájlként próbálná meg értelmezni. Hát, remélem, érthető. Az UJFILENEV-be betöltjük, amit kiír az awk, és ezután az eredeti fájlnév (ami a $i-ben van) és az új név segítségével megcsináljuk az átnevezést az mv paranccsal. Feltételeztem, hogy az mp3-akon kívül semmi nincs az aktuális könyvtárban - ellenkező esetben a "for i in *" helyére mehet mondjuk "for i in *.mp3"

2. Feladat

Van egy CSV fájlunk, előre nem tudjuk, hogy hány oszlopot (mezőt) tartalmaz. Feladatunk, hogy megfordítsuk az oszlopok sorrendjét. Szinte adódik ez a megoldás (visszatértem megint a proba.txt fájlhoz):

awk -F "," '{for ( x = NF; x > 0; x-- ) { print $x"," } }' proba.txt
71500,
+,
2009.01.12,
Fizetés,
7255,
...

Látszik, hogy jó az igyekezet, de sajnos külön sorba írja a mezőket, azaz valami miatt mindegyikből külön rekordot csinál. Viszont van nekünk egy ORS (Output Record Separator) nevű változónk is, a BEGIN részben adjunk neki üres sztringet és kész! Persze, hogy egy-egy rekord végén eztán ténylegesen legyen is sorvége jel, erről nekünk magunknak kell gondoskodnunk, de ez nem probléma:

awk -F "," 'BEGIN { ORS="" } {for ( x = NF; x > 0; x-- ) { print $x"," } print "\n" }' proba.txt
71500,+,2009.01.12,Fizetés,
7255,-,2009.01.12,Benzin,
8290,-,2009.01.15,Kaja a boltbol,
3500,-,2009.01.16,Ebédpénz,
20000,+,2009.01.20,Béla megadta a kölcsönt,
12500,-,2009.01.20,Kocsma,
Bocs az egysorosért, ez szépen így nézne ki:

BEGIN {
             ORS=""
}
{
             for ( x = NF; x > 0; x-- ) {
                       print $x"," } print "\n"
             }

Ez a misszió könnyedén teljesítve. :-)

3. Feladat

Van egy fájlunk, amelyben 3 sor alkot egyetlen adatot. Ezekből kellene egy CSV fájlt alakítani. Sőt, mondok egy jobb példát, van egy .VCF, azaz kontakt lista fájlunk, abból szeretnénk kiszedni a nevet és az email címet, és egy CSV fájlt csinálunk belőle. Ez ugyebár mindenféle programnak elég nehéz feladat, hiszen a fájlok struktúrája teljesen más: Az egyikben több sor írja le azt, amit nekünk egy sor több oszlopába kell rendeznünk.

Az a jó, hogy a bemeneti oldalon is meg tudjuk adni azt a bizonyos record separator-t. A VCF felépítése tehát ez:

BEGIN:VCARD
VERSION:3.0
EMAIL:elso@domain.hu
FN:Első név
....
END:VCARD

BEGIN:VCARD
VERSION:3.0
....
END:VCARD
(A kipontozott részek helyén egy rakás egyéb mező van. Aki nem hiszi, gyártson magának valami levelező programból.)

vcf.awk:

 BEGIN {
        FS=":"
        ORS=""
}

        /^EMAIL/ {sub(/\r$/,"");print $2 ", "}
        /^FN/ {print $2 "\n"}
Bocs, nem szokásom váratlanul új függvényeket bevezetni, de az a sub() függvény, ami egyszerű cserét csinál, muszáj volt. Ugyanis az Evolution olyan .vcf-et ment, ami DOS-os formátumú, és ezen úrrá kellett lenni. Ha a .vcf fájl UNIXos, akkor nincs szükség a sub()-ra. A lényeg tehát, hogy azokkal a sorokkal foglalkozunk, amelyekben szerepel a sor elején az EMAIL vagy a FN sztring. Az elválasztójel a fájlon belül a kettőspont, ezt a fájl elején az FS paraméterben megadtuk. Az ORS biztosítja, hogy ne legyen akadály, hogy együvé tartozó adatok külön sorban vannak. Még annyit, hogy ha egy rekordból hiányzik az EMAIL vagy az FN mező, illetve ezek sorrendje megváltozik, akkor az egész csúnyán fejreáll - így éjfél felé nincs esésem egy fullos példával előrukkolni. De azt hiszem, a lényeg, a hihetetlen rugalmasság valamint a teljesen elcseszett szintaxis érzete átjött nektek is! :-))

8 komment

Címkék: linux alkalmazások awk parancssor

Növeljük a laptop üzemidejét!

2009.01.17. 21:32 bagoj ur

Ha a Linux terjesztésünk készítői és mi is egyöntetűen akarjuk, jóllakott pingvinünk képes jó aszkéta módjára minél kevesebb elektront enni. Ennek hatása hosszabb akkumulátoros üzemidő, és/vagy kevesebb fogyasztás lehet. Az alábbiakban pár egyszerű példát mutatok be, amelynek segítségével tuningolhatjuk a Linuxot alacsonyabb fogyasztásra. Ennek hatására kevesebbet kell termelnie az erőműveknek, kisebb lesz a légszennyezettség, az ózonlyuk begyógyul és a sarkkörökre visszanőnek a jéghegyek (már amelyik elolvadt eddigre).

Figyelmeztetés: Már megint a parancssort fogjuk bökögetni (félelmetes, nem? :) ).

A lényeg tehát, hogy a számítógépünk hardverei már nagy valószínűséggel felkészültek, hogy kicsit zöldek legyenek. Jó esetben nekünk ezt csak be kell kapcsolni.

Merevlemezek

1. Diszkek lekapcsolása

root@tarantula:~# hdparm -i /dev/sda

/dev/sda:

 Model=FUJITSU MHV2040AH                       , FwRev=00000096, SerialNo=        NT04T6A2MHJ0
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
 BuffType=DualPortCache, BuffSize=8192kB, MaxMultSect=16, MultSect=?16?
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160
 IORDY=yes, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4
 DMA modes:  mdma0 mdma1 mdma2
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5
 AdvancedPM=yes: mode=0x80 (128) WriteCache=enabled
 Drive conforms to: ATA/ATAPI-6 T13 1410D revision 3a:  ATA/ATAPI-2,3,4,5,6

 * signifies the current active mode
Az UDMA-val kezdődő sor alatt láthatjuk, hogy hogyan áll merevlemezünk az energiagazdálkodással. Ha AdvancedPM=yes, akkor beállíthatjuk, hogy bizonyos tétlenség után kapcsoljon le a merevlemezünk. Jó tudni, hogy kb. 10-30 másodperc, mire feltápászkodik, tehát nem érdemes mondjuk 1 percet megadni... A bekapcsolás a "-B", az idő megadása a "-S" paraméterrel történik, utána nem percben vagy másodpercben kell megadni az értéket, hanem egy igen elborult algoritmus szerint, akit érdekel, keresse ki a man-ban. Mivel nekem a teljes üzemidő másfél óra akksin, de túl korán sem állítanám le, ezért húsz percet adtam meg:

hdparm -B 1 -S 240 /dev/sdaA fél óra 241, egy óra 242. Ha véglegesen is be szeretnénk állítani, akkor a /etc/hdparm.conf-ban a "spindown_time" értéket keressük meg, kommentezzük ki és állítsuk be a megfelelő értéket.

2. Gyakori I/O csökkentése

Másik megoldás az, ha megmentjük a merevlemezünket a túl gyakori írástól. A POSIX szabvány alapján (amelyhez a Linux is igazodik) a fájloknak kell legyen egy ún. atime, azaz access time, elérési idő tulajdonsága, ami értelemszerűen az utolsó elérési időt jelzi. Ebből már lehet kapisgálni, hogy minden fájlnál, amelyet vagy írásra, olvasásra megnyitunk, ezt a kis paramétert mindig le kell generálni és kiírni a diszkre. Még viccesebb, hogy ha egy ls paranccsal listázzuk egy könyvtár tartalmát, akkor is megváltozik annak az atime-ja! Most ha hozzávesszük, hogy nem csak a felhasználók, hanem bármely program ugyanezeket okozza, akkor rájövünk hogy ez jelentős tétel is lehet.

Van egy olyan felcsatolási paraméter az ext3 fájlrendszeren, amely jó kompromisszumot ad: csak időről időre frissíti az atime-ot. Az Ubuntun szerencsére ez az alapértelmezett, de azért ellenőrizzük le:

root@tarantula:~# mount
/dev/sda3 on / type ext3 (rw,relatime,errors=remount-ro)
...
Ha nincs ott a relatime, akkor a /etc/fstab-ba beleírhatjuk. Ha úgy érezzük, egyáltalán nincs szükség az atime-ra, akkor cseréljük ki a relatime-ot noatime-ra. Figyeljünk, hogy milyen fájlrendszert írunk át, én ext3-at használok, azon tuti.

Beállítható ezen a furmányos Linuxon az is, hogy hány századmásodpercenként írjon a diszkre. (Ugye odáig világos, hogy nem azonnal kerül minden a lemezre, hanem egy pici késleltetéssel, addig egy átmeneti cache-ben csücsül). Alapértelmezetten ez 5 másodperc, lekérdezhetjük így:cat /proc/sys/vm/dirty_writeback_centisecs 499 Ha laptopon vagyunk, és jó az akksi, és nem számítunk túl sűrűn kernel panic-ra, akkor miért ne vennénk nagyobbra? Semmit nem veszthetünk vele. Írjuk hát be a /etc/sysctl.conf-ba:

sys.vm.dirty_writeback_centisecs 1000Ezzel nagy bátran duplájára emeltük az időt, azaz felére az írások számát. Juhé!

3. I/O csökkentése a syslog hangolásával

A syslog lényege az, hogy minden naplózott esemény a diszkre kerüljön, mivel onnan kevesebb valószínűséggel veszik el. Emiatt minden esemény diszkre írásakor meghívja a sync I/O-funkciót, amely a cache-ben lévő, kiírandó adatokat egyből kiírja (normál esetben éppen annyi időnként írja ki, mint amit az előbbi pontban állítottunk be). Van egyébként erre egy kézzel bármikor futtatható parancssori utasítás is, el nem hinnétek, hogy sync a neve... Ha éppen nem egy szuperbiztonságos szervert üzemeltetünk és nem épp egy kernel betérdelést debugolunk, akkor szerintem felesleges ennyire vergődni a logokon. Nyissuk meg a /etc/syslog.conf fájlt, és a target-ek (ez a jobb oldali oszlop) elé tegyünk végig szóközt. Elég soknál már ott is van! Lássuk, hogy néz ez ki előtte:

auth,authpriv.*                 /var/log/auth.log...és utána:

auth,authpriv.*                 -/var/log/auth.log4. Laptop-mód bekapcsolása

Ez a Linux kernel olyan fícsöre, hogy igyekszik optimalizálni az I/O műveleteket úgy, hogy a diszkek minél többet pihenjenek. A /etc/defaults/acpi-support fájlban láthatjuk is, hogy van egy ENABLE_LAPTOP_MODE paraméter, ami alapból false. Olvashatunk egy figyelmeztetést, hogy néhány gépen ez bizony fagyást okozhat - én nem kockáztattam, nem kapcsoltam be.

Spórolás hangkártyával

Ha az ac97 hangkódekkel rendelkező felhasználók népes táborába tartozunk, akkor beállíthatjuk azt is, hogy amikor nem szól a hangkártya, akkor egyúttal takarítson meg némi energiát önmaga lekapcsolásával. Győződjünk meg arról, hogy ilyen kártyánk van-e, és tudja-e a spórolást, valamint mindez be van-e állítva:

root@tarantula:~# cat /sys/module/snd_ac97_codec/parameters/power_save
0

Ha nem azt írja, hogy ilyen fájl nem létezik, akkor már jók vagyunk. 
Ha itt 1-et látunk, akkor minden rendben; ellenkező esetben írhatjuk a 
/etc/rc.local fájlba, az "exit" sor elé:# echo 1 > /sys/module/snd_ac97_codec/parameters/power_save

Megtakarítás a laptop-kijelzővel

Gondolom, nem kell hosszan ecsetelnem, hogy a kijelző háttérvilágítása a laptopon gyakran az áramfelvétel felét kiteszi; nem ritka a 4-5W fogyasztás, miközben a laptop 10-11W-ot fogyaszt. Gondoljunk a kijelző háttérvilágításának csökkentésére, valamint akkumulátoros üzemben a gyors kikapcsolásra. Ez utóbbit például ezzel tehetjük meg:

bagoj@tarantula:~$ xset dpms 0 0 60

(Figyeljünk, ezt sima felhasználóként csináltam! Mivel ez az apróbetűs rész amit senki se olvas el, ide írom, hogy ezentúl a root-ként végzendő dolgokat simán #-tel, a felhasználóként végzendőket $ jellel jelölöm, ahogyan általában szokás.)

Ez 60 másodperc inaktivitás után lekapcsolja a kijelzőt, a normál képernyővédő bekapcsolást pedig nem befolyásolja (maximum annyiban, hogy a vicces cicák képei nem látszanak, he-he). A visszakapcsolás meg azonnali. Vészhelyzetben a 15 másodpercet sem tartom hülyeségnek...

Az első dologra pedig az Ubuntu alapból tud megoldást, hiszen beállítható minden a Rendszer/Beállítások/Energiagazdálkodás alatt; másoknak pedig az xbacklight programocska segíthet - már amennyiben a laptopon nincs a háttérvilágítást állító billentyű.

Fukar processzorok

Ha netán több magos rendszerünk van, akksis üzemidőben letilthatjük a teljesítményre optimalizált működést. Ezzel is nyerhetünk valamit:

# echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
# echo 1 > /sys/devices/system/cpu/sched_smt_power_savings

Uniprocesszoros gépeken is alkalmazható a CPU órajel-gazdálkodásának beállítása; további fortélyként. Ennek lekérdezésére létezik a Gnome alatt egy panel-applet, "CPU órajel-változás figyelő" néven, beállítani azonban ott semmit sem lehet. Bezzeg itt:

# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors conservative ondemand userspace powersave performance

Ezek a lehetőségeink. Az "ondemand" olyan 50%-on tartja a processzor órajelét, és szükség esetén felemeli maximumra, csak amíg szükséges. Ubuntun ez az alapértelmezett. A "powersave" igyekszik a minimumon tartani, a "performance" pedig maximális teljesítményt ad le. Fogalmam sincs, a maradék kettő mit csinál. :-) A "userspace"-szel gondolom, lehetőséget adunk hogy felhasználói programokkal egy-egy konkrét értékre lőjük be az órajelet, de a conservative...?
Lekérdezni és beállítani így lehet:

# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ondemand
# echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Fösvény kommunikáció

Ha éppen nem szükséges használni a vezetékmentes hálózatunkat, vagy a Bluetooth kapcsolatot, és nincs a laptopon megfelelő gomb ezek leállítására / elindítására, akkor letilthatjuk ezeket a parancssorból. Történetesen ugyanis egyes wifi driverek több energiát használnak, ha nem vagyunk kapcsolódva, mint ha fent lennénk a wifi hálón (!). Ha nagyon kell az energia, akkor futtassuk ezt le:

for i in `find /sys -name "rf_kill"`; do echo 1 > $i ; done
hciconfig hci0 down
rmmod hci_usb
(Feltéve, ha a Bluetooth eszközünk neve hci0. Ellenőrizni a hciconfig paranccsal lehet.)

Visszakapcsolás:

for i in `find /sys -name "rf_kill"`; do echo 0 > $i ; done
modprobe hci_usb
hciconfig hci0 up
És természetesen a felsorolt beállításokra egy szkriptet is fabrikálhatunk, amely megtesz nekünk mindent, ha nagy szükség van az utolsó millivoltra is:

#!/bin/bash
if [ `id -u` != "0" ]; then
    echo "Csak root-kent futtathato!"
    exit 1
fi
/sbin/hdparm -B 1 -S 240 /dev/sda
/bin/mount -o remount,relatime /
/bin/echo 1000 > /proc/sys/vm/dirty_writeback_centisecs
/bin/echo 1 > /sys/module/snd_ac97_codec/parameters/power_save
/bin/echo 1 > /dev/dsp
/bin/echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
/bin/echo 1 > /sys/devices/system/cpu/sched_smt_power_savings
/bin/echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
/usr/bin/xset dpms 0 0 60
for i in `find /sys -name "rf_kill"`; do echo 1 > $i ; done
/usr/sbin/hciconfig hci0 down
/sbin/rmmod hci_usb
A visszakapcsoláshoz pedig:

#!/bin/bash
if [ `id -u` != "0" ]; then
    echo "Csak root-kent futtathato!"
    exit 1
fi
/sbin/hdparm -B 0 /dev/sda
/bin/echo 500 > /proc/sys/vm/dirty_writeback_centisecs
/bin/echo 0 > /sys/module/snd_ac97_codec/parameters/power_save
/bin/echo 0 > /sys/devices/system/cpu/sched_mc_power_savings
/bin/echo 0 > /sys/devices/system/cpu/sched_smt_power_savings
/bin/echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
for i in `find /sys -name "rf_kill"`; do echo 0 > $i ; done
/sbin/modprobe hci_usb
/usr/sbin/hciconfig hci0 up
Nevezzük el őket, készítsünk neki parancsikont az asztalunkra oszt máris jóidő. Felelősséget, szokás szerint, nem tudok vállalni a dologért. :-)

(Megjegyzés: már 1-2 napja megírtam ezt a postot, azóta szeretném kipróbálni, hogy ténylegesen van-e különbség a kisülés idejében, ha beállítom ezt a sok mindent. Azóta sem sikerült csalhatatlan bizonyítékot találnom. Szóval lehet, hogy ez olyasmi, mint a tuning autók hátsó ledes lámpái, amik a foton kibocsátással is "hozzájárulnak" az autó gyorsulásához... :-))

1 komment

Címkék: notebook ubuntu energiagazdálkodás üzemidő hdparm sysctl

Az elfelejtett világ - Linux parancssor és szkriptezés

2009.01.15. 12:14 bagoj ur

Máma má annyira fejlettek és oly grafikussak a Linugzok, hogy a felhasználói lassan el is felejtik, hogy létezik olyan, hogy parancssor. Sokan a Windowsról áttérők közül boldogan pörgetik a kockát, aztán ha esetleg át kell nevezniük 100 fájlt, akkor

a) Nekiállnak egyesével
b) Keresnek a neten valami grafikus programot
c) Fórumokon sírnak.

Még többen ezek közül, amikor egy veterántól azt hallják, hogy "usgyi parancssorba", akkor elborzadnak és inkább azt mondják, hogy "köszi de nem, jó lesz nekem ha egyesével átnevezgetem, majd csak végzek vele a héten". Pedig már a Windows 9x/2k/XP parancssorában is rengeteget meg lehetett tenni, a szabad OSS rendszerek parancssora pedig összehasonlíthatatlanul jobb. Van mostanában ez a Powershell, én nem foglalkoztam vele, mert az "objektumok kezelése parancssorból" gondolat nekem perverz. :)

A neten természetesen 1000 helyen lehet howto-kat meg example-ket találni, de úgy gondoltam, erről a témáról sem lehet eleget írni. Hiszen nagyban megkönnyíti az életünket pár szkript, aminek aztán készíthetünk egy parancsikont és futtathatjuk a grafikus felületről is; nem kell látni hogy a fogaskerekek mit csinálnak lent a mélyben.

Elhatároztam hát, hogy pár egyszerű példán keresztül én is indítok egy sorozatot. Ebben leírom, mi volt a feladat, hogyan oldottam meg és el is magyarázom, hogy mi miért működik. Ez talán több annál, mint amit szerete a neten megtalálhatunk. És persze tudjátok, a bagoj ragadozó, úgyhogy pizzáért bárkinek rittyentek szkripteket. :-)

Megjegyzés: Nem a nagyon kezdő szinttől indulok (bár onnan kellene), mert azt elvárom, hogy egy kézikönyvet vagy a Fullcircle magazint végig tudja böngészni a nyájas olvasóm. Ettől függetlenül próbálok mindent apróra elmagyarázni; aztán ha valakit érdekel a téma, úgy gondolom úgyis utánanéz. Ha nem jól sikerült a szintet belőnöm, írjatok egy kommentet.

Első példa

Tegyük fel, hogy egy ismerős meglátja csodálatos Linux rendszerünket, és mély meggyőződéssel közli, hogy ilyen kell neki is. Ez mint tudjuk, rengeteg munkával jár - az alaprendszer telepítése csak az első lépés. Utána le kell tölteni a csomagkezelővel minden alkalmazást, ami nincs az alaprendszerben, esetleg le kell tölteni skineket, a beállításokat úgy megrajzolni hogy jók legyenek stb. Most vegyük csak az első lépést; a plusz csomagok telepítésének fáradtságos munkáját. A példa kedvéért (és mert ez így történt meg a valóságban is) képzeljük el, hogy 250 km-re vagyunk saját gépünktől, de el tudjuk érni SSH-n keresztül.

Megfejtés

Mint az közismert, a Linux csomagokba szervezi az egyes programokat és az őket kiszolgáló lib-eket, azaz függvénykönyvtárakat. Ez lehetővé teszi, hogy ugyanabban a csomagban lévő kódot több másik csomag is használhassa. Az alaprendszer és a már szénné telepítgetett rendszer tehát csak a csomagnevek listájában különbözik. Szedjük le hát a telepített csomagok listáját! Először a távoli gépen (ez a miénk; ezen van az elérendő állapot):

dpkg-query -W -f='${Package}\n' > osszescsomag.txt

Illetve a frissen telepített gépen:

dpkg-query -W -f='${Package}\n' > alaprendszer.txt

A nevezett parancs a Debian-alapú rendszerek része. Alapértelmezésben kiírja mindegyik csomag nevét, verzióját és rövid leírását - ez minket perpillanat nem érdekel, ezért megkértük, hogy csak a csomagneveket írja ki, mindegyiket külön sorba (a ${Package} jelenti a csomagnevet, a \n a sortörést értelemszerűen, mindezt beleirányítjuk egy-egy fájlba a "kacsacsőr" nevű népszerű átirányító karakter segítségével. Vigyázzunk, hogy a kacsa balra néz, ha éppen szembe áll velünk! :-)

A távoli gépről a fájl eljuttatását a helyi gépre feladnám házi feladatnak... :-)

Az összehasonlításhoz van nekünk egy szép, diff nevű parancsunk. Futtassuk is:

diff -a --suppress-common-lines alaprendszer.txt osszescsomag.txt
0a1,4
> imagemagick
> inkscape
> language-pack-gnome-hu
> language-pack-gnome-hu-base
> language-support-translations-hu
> libfaac0
...

Tehát a diff nevű csoda két vagy több fájl tartalmát tudja összehasonlítani. Eredetileg forráskódok összehasonlítására szakosodott, a foltok (patch-ek) előállítását végzik vele. De természetesen mi is tudjuk alkalmazni saját céljainkra. Tehát jobbra kacsacsőrrel látjuk, ami az osszecsomag.txt (a másodiknak megadott fájl) pluszban tartalmaz. Először is vágjuk ki a minket nem érdeklő részeket (ez a "0a1,4" a fájlban elfoglalt helyet mutatja; de ez arra kell, ha patch-et gyártunk ahogy írtam; a patch nevű program majd ezek alapján tudja hogy a forráskódot hol kell patch-elni, de ez most nem tartozik ide), tartsuk meg csak a jobbra kacsacsőrös részeket:

diff -a --suppress-common-lines alaprendszer.txt osszescsomag.txt | grep "^>*"
> imagemagick
> inkscape
> language-pack-gnome-hu
> language-pack-gnome-hu-base
> language-support-translations-hu
> libfaac0
...
Hurrá, most már van egy rakás kacsacsőrös sorunk, de a kacsacsőr nekünk nem kell. Számos módszer lehetséges, ahogyan ki lehet vágni a "> " karaktersorozatot, szerintem a legegyszerűbb az awk használata; ami képes egy-egy sort szétvágni megadott karakterek mentén oszlopokra - figyeljük meg, hogy felfoghatjuk úgy is, mint egy táblázatot: Az első oszlop csak kacsacsőröket tartalmaz, a szóköz az elválasztójel, és a nekünk szükséges csomagnevek a második oszlop. Az awk - rengeteg más funkciója mellett - képes kiírni a megadott oszlopokat. Ráadásul alapértelmezetten a szóközt tartja elválasztónak. Irányítsuk át tehát az awk-ba az egészet és írassuk ki a második oszlopot:

diff -a --suppress-common-lines alaprendszer.txt osszescsomag.txt | grep "^>*"|awk '{print $2}'
imagemagick
inkscape
language-pack-gnome-hu
language-pack-gnome-hu-base
language-support-translations-hu
libfaac0
...
Akkor ezzel meg is volnánk, csak irányítsuk be az egészet egy harmadik fájlba:

diff -a --suppress-common-lines alaprendszer.txt osszescsomag.txt | grep "^>*"|awk '{print $2}' > kulonbseg.txtNagyon jó, most már van egy fájlunk, ami tartalmazza, hogy mit kell pluszban telepítenünk. Akkor zúzzuk:

sudo apt-get install `cat kulonbseg.txt`

Figyelem! Az aposztrófok valójában visszafelé mutató aposztrófok; magyar billentyűzeten "AltGr + 7"-tel lehet őket elérni! Azt jelenti, hogy az ezek között lévő parancsot futtassa le, majd az eredményt másolja oda.

Mit tanultunk ma?

  • A dpkg-query parancs tudja Debian rendszerek alatt lekérdezni a csomagokat.
  • A diff két vagy több fájlt hasonlít össze, eredetileg programfejlesztéshez fejlesztették ki
  • A grep parancs csak a paraméterben megadott szöveget tartalmazó sorokat tartja meg. Megadható neki regexp, azaz regular expression, a caret (^) a sor elejét jelzi, a mi példánkban azt fogalmaztuk meg: "Mi csak azokat a sorokat kérjük, ahol a sor eleje után következik egy kacsacsőr, majd tetszőleges karakterek a sor végéig."
  • Az awk egy programozható, bár nehéz szintaktikájú univerzális szövegfeldolgozó program. Mi a tudása töredékét használva kiírattuk a második oszlopot. Csak a példa kedvéért, több oszlopot is ki lehet íratni, a '{print $3 $2 $1}' segítségével például megcseréltük oszlopaink sorrendjét. Majd szerintem erről külön írok egy kisebb szösszenetet
  • A normál esetben konzolra kiírt üzeneteket a jobbra kacsacsőr ">" segítségével fájlba irányíthatjuk (megadandó a fájl neve, nyilván).
  • A cat parancs egy fájl teljes tartalmát írja ki a konzolra.
  • A feldolgozó parancsok kimenete egymásba átirányítható a pipe "|" segítségével.

Bónusz játék

Ha nem Ubuntunk van, és a csomagkezelő nem paraméterezhető az elmesélt módon, akkor is használhatjuk az awk-t hogy kinyerjük a szükséges infókat. Megint a dpkg-query-ből kiindulva, bemutatom az analógiát - ez alapján már menni fog bármilyen Linux alól.

 dpkg-query -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Név         Verzió         Leírás
+++-============-==============-================================
acl             2.2.47-2       Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com>
acpi         1.1-1ubuntu1       Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com>
acpi-support 0.114       Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com>
...

dpkg-query -l | awk '{print $2}'
Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
Err?=(none)/Hold/Reinst-required/X=both-problems
Név

acl
acpi
acpi-support
acpid
...

Na, értitek.

 

4 komment

Címkék: linux ubuntu cat awk parancssor grep dpkg diff

süti beállítások módosítása