370 likes | 482 Views
Intelligens rendszerfelügyelet. Scriptelés alapok. Tóth Dániel Micskei Zoltán. Tartalom. Műveletek automatizálása, scriptelés Eltérések az általános programozási nyelvekhez képest Linux alatt Bash Windows PowerShell. Shell scriptelés. Általában a script nyelvek jellegzetességei
E N D
Intelligens rendszerfelügyelet Scriptelés alapok Tóth Dániel Micskei Zoltán
Tartalom • Műveletek automatizálása, scriptelés • Eltérések az általános programozási nyelvekhez képest • Linux alatt Bash • Windows PowerShell
Shell scriptelés • Általában a script nyelvek jellegzetességei • Típustalan változókezelés • Interpreter futtatja • Akár soronként is értelmezhető • Minden futási időben értékelődik ki • String paramétert is képes értelmezni parancsként • Erősen eltér az eddig látott programnyelvektől (C, C++, Java, C#)
Bash • Bash (Bourne Again Shell) • 1987-óta fejlesztik • Elődje az alap UNIX-osBourneshell (sh) 1978-ból • Nem mai programozási szemléletmódot követ • Működési elv (nagyvonalakban): • Soronként elemzi a bemenetet • Azonosítja a saját fenntartott szintaxis elemeit • Stringként mindent behelyettesít, amíg csak lehet • Ami utána marad, azt megpróbálja végrehajtani
Hello world példa • Kedvenc editorba írjuk be (joe, mcedit, vi, emacs, kwrite…) #!/bin/bash #ez egy komment echo ”Hello world” • A fájl végén egy újsort szokás tenni. • Az első sor kommentje a „shebang”. Egy hint, a file nevű programnak jelzi, hogy ez milyen fájl is valójában. • Adjunk neki futtatási jogot: chmod +x helloworld.sh • Futtassuk (a ./ azért kell, mert az aktuális könyvtár nincs a path-ban) ./helloworld.sh
Változókezelés • Környezeti változók • Lehetnek beállított/beállítatlan állapotban • Értékadással beállítható, akár üres stringre is • set-tel megnézhetők az éppen beállított változók • unset-tel visszatér beállítatlan állapotba • Típusok • Minden változó stringként tárolódik • A behelyettesítés helye alapján derül ki, hogy hogyan értelmeződik • Magában illetve ” ” és ` ` környezetben stringként értelmeződik • $(( )) környezetben egész számként értelmeződik
Változókezelés #!/bin/bash VAR1=Ertek#Értékadások VAR2=4 var3=8 echo”$VAR1 $VAR2 $var3”; # behelyettesít echo’$VAR1 $VAR2 $var3’; # nem helyettesít be echo ${VAR1} ${VAR2}${var3}; #behelyettesít, ez 2 paraméter az echo-nak echo ${HELLO}; #deklarálatlan változó, üres stringgel helyettesíti, hacsak a #környezetből nem kapott értéket HELLO=`./helloworld.sh`; #parancsot futtat, az eredményt behelyettesíti HELLO=$(./helloworld.sh); #ugyanaz, mint fent echo ${HELLO}; #már van értéke. #vigyázat a Hello World! string 2 paraméterré válik, ha nem ”${HELLO}”-t írunk! unset HELLO; #már nincs értéke
Környezeti változók láthatósága • A környezeti változók alapból nem adódnak tovább a gyerek folyamatnak. • Sima script futtatás új „gyerek” bash folyamatot indít! • export – kilistázza az öröklődő környezeti változókat • exportVALTOZONEV – öröklődővé teszi a változót • Gyerek folyamatban beállított változók nem adódnak „főlfele” a hívónak • sourcescript_file – úgy futtatja a megadott fájl tartalmát, hogy nem indít gyerek folyamatot.Gyorsabban fut, a változók beállítva maradnak.
Tömbök Használhatunk tömböket ARRAYVAR=(ERTEK1 Ertek2 ”Ertek3”); #értékadás #felsorolással OTHERARRAY[5]= ”Ertek4”; #értékadás konkrét indexre, ritka tömb echo ”elemszám: ${#ARRAYVAR[@]}”; echo ”első elem $ARRAYVAR”; #for ciklus az összes elemre, figyeljünk a ;-k helyére! #Ritka tömbnél így nem működik! for ((i=0;i<${#ARRAYVAR[@]};i++)); do echo”${ARRAYVAR[$i]}”; done;
„Mágikus” változók • Néhány változónak speciális jelentése van • Bemenő paraméterek • $1, $2 … - script indításakor bemenő paraméterek • $# - paraméterek száma • $@ - az összes paraméter egy tömbben • Előző parancs • $? – legutóbbi futtatott parancs visszatérési értéke • $! – legutóbbi háttérben indított folyamat PID-je • $$ - éppen futó shellPID-je • Mezőelválasztó karakter • $IFS – ennek az értéke alapján automatikusan darabolja a stringeket külön paraméterekké • Alapból az IFS értéke minden whitespace” ” ”\n” ”\t”
Fájlnév kiegészítés • Szokásos fájlnév-minta kiegészítő karakterek • * - tetszőleges string • ? – egy karakter • Egyik megoldás:SHFILES=*.sh; # behelyettesítődik fájlnevekreecho$SHFILES; # egy stringben összes fájl nevefor a in$SHFILES; do# vigyázat, ha fájlnévben $IFS karakter van, # akkor ott elválasztja!echo ”$a”;done; • Másik megoldás (újsor karakternél vág, nem pedig $IFS-nél):ls *.sh | whileread line; doecho ”$line”;done;
String darabolás VAR=’foo:bar:cuc:mak’# darabolás IFS-selOLDIFS=$IFS; #sosem árt elmenteniIFS=’:’;for a in$VAR; doecho ”$a”; doneIFS=$OLDIFS # ne felejtsük el visszaállítani# darabolás mintaillesztéssel# levágja amire illeszkedik a mintaecho${VAR#*:}; # legkisebb prefixet vág foo:echo${VAR##*:}; # legnagyobb prefixet vág foo:bar:cuc:echo${VAR%:*}; # legkisebb postfixet vág :makecho${VAR%%:*}; # legnagyobb postfixet vág :bar:cuc:mak Bonyolultabb esetekre: cut, awk, sed
Elágazás • Példa:NUM1=$1;NUM2=$2;if [ $NUM1 –eq $NUM2 ]; thenecho”$NUM1 egyenlő $NUM2”;elif [ $NUM1 –gt $NUM2 ]; thenecho”$NUM1 nagyobb, mint $NUM2”;elseecho”$NUM1 kisebb, mint $NUM2”;fi • A [a test program neve (igen ez egy program neve ) • Lásd: man testa lehetséges paraméterezésre • Figyeljünk a space-ek megfelelő helyére! • Visszatérési érték: 0 - igaz, egyébként hamis, ez a shell scripteknél pont fordítva van, mint a „rendes” programnyelveknél
Átirányítások • Standard I/O, minden programnak • 0 – stdin • 1 – stdout • 2 – stderr • Átirányítás • cat fájlnév #fájl→stdout • cat fájlnév 2>&1 #stderr→stdout • cat fájlnév > másikfájl #fájl→stdout→másikfájl • cat fájlnév 2> másikfájl #fájl→stdout, stderr→másikfájl • cat fájlnév &> másikfájl #minden a fájlba ömlesztve
Csővezetékek • cat fájl | grep ’x’ #catstdout-ját a grepstdin-jába • Láncolhatóak az alkalmazások… DE… • Formázatlan bináris adatátadás történik • Gyors, de strukturált adatot nem kezel • Strukturált adatot szöveges formába kell alakítani (valamilyen módon), majd a fogadó oldalon sorokra, majd azon belül mezőkre bontva feldolgozni • Erre használható programok: cut, awk, sed (tokenizálás, reguláris kifejezések stb.) • Erre jó a bash is, pl a pipecmd | whileread$VARvagy for$VARin$(pipecmd) konstrukciókkal • Egyszerű adatszerkezeteknél még elmegy… • Az emberek itt szokták értékelni a Powershellt
Trükkök Ha a bemenet eleve így van megadva:BEALLITAS=ertek1OPCIO=ertek2LISTA=(elem1 elem2 elem3) A bash maga parse-olja nekünk, és utána mint változókat használhatjuk:source ./inputfileecho$BEALLITAS; #ertek1 lesz a kimenet De vigyázat, mindent végrehajt, ami a bemenő fájlban van! Nagy biztonsági kockázat.
Reguláris kifejezések • Sok helyen használhatjuk őket • Pl. sed, awk, grep • (Perl, Java, C#...) • Egyszerű string manipulációt nagyon megkönnyíti • Példa kinek a nevét írtuk rosszul
Reguláris kifejezések • Megoldás: • Exportáljuk CSV-be a táblázatot, így fog kinézni: "Személy","Kedvenc étel","mennyiség„ "Don Mascarpone","Tiramisu torta","3 szelet" "VitoMascarpone","Bolognai spagetti","2 tányér" "Kicsi Angelo","Gelato fagylalt","5 gombóc" "Nagy Luzio","Gelato fagylalt","2 gombóc" "Federico mortellini","mogyoró","nagy zsák"
Reguláris kifejezések Egy lehetséges megoldás:cat temp/csvdemo.csv | cut --delimiter=’,’ -f 1 | grep -v ’”[A-Z][a-z]* [A-Z][a-z]*”’ Eredmény:"Személy" "Federico mortellini"
Tanácsok, hibakeresés • Legyen komment a script elején • Ki írta, mire való, hogy kell paraméterezni • A bemenő paramétereket ellenőrizzük • Dobjunk hibaüzenetet, ha helytelen a paraméterezés • A script NE töröljön vagy írjon felül olyan fájlokat, amire nem kértük • • Ideiglenes fájlokhoz használjuk az mktemp-et • Hibakereséshez hasznos: bash –x • A behelyettesítések utáni parancsot kiírja • Script futása közben követhető minden művelet, értékadás stb. • Változónév elírások ellen: set –u • Ne helyettesítsen be üres stringgel olyan változókat, amik nincsenek definiálva, helyette dobjon hibát
További info http://www.linuxconfig.org/Bash_scripting_Tutorial http://tldp.org/LDP/abs/html http://www.hit.bme.hu/~szandi/unix/index.html man bash, mansed, mancut, man sort, man grep…
Tartalom • Műveletek automatizálása, scriptelés • Eltérések az általános programozási nyelvekhez képest • Linux alatt Bash • Windows PowerShell
PowerShell Itt nem string ment át a csővezetéken, hanem egy System.Diagnostics.Process objektumokból álló gyűjtemény! Új szkript környezet a Windowsban bash/Perl/stb. tapasztalatok alapján Újdonság: teljesen objektumorientált, .NET alapon
Powershell – elindulás • Powershell2.0 letöltése • Windows Management Framework kiegészítés része • Elérhető XP-re is • PowerGUI • GUI szerkesztő, debugger
PowerShell alapok • cmdlet • Általában Ige-Tárgy forma • Alap parancsokhoz megszokott aliasok • Pl. cp, copy -> Copy-Item • Legfontosabb billentyű: TAB • Automatikus kiegészítés: cmdlet, paraméter, változók… • Legfontosabb cmdlet-ek: • Get-Command: parancsok listázása • Szűrés pl.:Get-Command-Nouncsv • Get-Help: súgó, paraméter leírás, példák
Powershell változók • Változó: $nev • Nem érzékeny a kis/nagybetűkre • Típuskonverzió automatikus • Pl.: $a = "Hello" # System.String • De: [int] $ev# explicit megadás • Lehet bármilyen .NET objektumot létrehozni: • $list = New-ObjectSystem.Collections.ArrayList • Mit csinálhatok egy változóval? • Get-Member –InputObject$list • Escape szekvenciák: `t, `n …
Változó behelyettesítések • Hasonló a Bash-hez $s = "world" "Hello $s"# behelyettesít 'Hello $s'# nem helyettesít be • Kiértékelés kikényszerítése $a = 1 Write-Output" $a + 1 "# 1 + 1 Write-Output" $($a + 1) "# 2
Tömb, hash tábla • Tömb létrehozása: • $numbers1 = @() # üres tömb • $numbers2 = 1, 2, 5 • Elemre hivatkozás: • $numbers2[0] # 0-tól indexelődik • Hash tábla: $p = @{"MZ" = 3; "TD" = 4} $p["MZ"]
Pipe kezelése • Pipeline: legfontosabb művelet (jele: |) Get-Service | Format-List • Rendezés és kiválasztás: Get-Service | Select-Object name, status -first 10 | Sort-Object Status • Művelet elvégzése minden elemen: Get-Process | Foreach-Object {Write-Output $_.Name} $_: aktuális elem • Szűrés: Get-Process | Where-object {$_.Id –eq 4}
PowerShell parancsok • Get-Command • man Get-ChildItem • Get-ChildItem | Get-Member • Szűrés, rendezés • Get-ChildItem | selectName, CreationTime • Get-ChildItem | where {$_.Name -like "D*"}
Vezérlési szerkezetek • C#-ból ismerős szerkezetek: • if, switch, foreach, while… • Sokszor kiváltható pipe segítségével • Összehasonlítás: • -eq: egyenlő (equal) • -lt: kisebb mint (less than) • … • Logikai operátorok: • -and, -or, -not
Egyszerű szkript sablon Fejkomment Paraméter megadás # Name: script.ps1 # Author: Micskei Zoltán # Date: 2010.02.17. # Desc: Exampletemplateforpowershell script # Param: $hello - stringtowrite out param( [string] $hello = $(throw "Supplythestring!") ) Write-Output$hello
Fontosabb cmdlet-ek • Import-Csv CSV fájl importálása • Get-Content Fájl tartalmát beolvasni • Get-ChildItem Gyerekelemek lekérése • New-Item Új elem (fájl, registry kulcs…) • Write-Output Szöveg kiírása • Select-String Szöveg keresése • Valamint a teljes .NET Framework ! • Pl. szöveg manipuláció -> System.String metódusai
PowerShell scriptek • Használjunk PowerGUI-t • Írjunk egy scriptet, ami lekérdezi, hogy hány svchost.exe fut, és hogy a legtöbb memóriát foglaló az 10 MB-nál többet használ-e! • Írjunk egy scriptet, ami egy CSV fájlban tárolt neveket és HF pontokat kiolvasva kiírja az adott emberek átlagát.
További tippek • & parancs – parancs végrehajtása • &? – sikeres volt-e az előző utasítás • Sortörés: ` (HU billentyűzeten: AltGr + 7) • Számított tulajdonságok: Get-process | select-property @{n="nev"; e={$_.name}}, @{n="nap"; e={$_.StartTime.Day}}
Miért fontos a PowerShell? Adminisztrációs felület, MMC Admin UI Szkript Szkript PowerShell COM felület .NET Framework Szerver-funkcionalitás Múlt Szerver-funkcionalitás Jelen, jövő • Új rendszeradminisztrációs motor a Windows és a szervertermékek adminisztrálásához • Parancssori környezet, új nyelvvel
További információ • Scripting / PowerShell témaközpont • PowerShell – Ismerkedés a környezettel (videó) • PowerShellTutorial (10 részben az alapok) • PowerShell könyv (ingyenes, magyarul) • PowerShellcheatsheet