19:00 | Temat wykladu: | |
Bash: Praktyczne zastosowania basha w administracji systemem (by DJ_cool_, 08.04.2006) @ wyklady.net | ||
19:00 | DJ_cool_ | No to jedziemy. |
DJ_cool_ | Witam was na wykładzie "Praktyczne zastosowania bash'a w administracji systemem.". | |
DJ_cool_ | Ja jestem DJ_cool_, i będę wam nawijał. | |
19:01 | DJ_cool_ | Mam nadzieję że podstawy basha znacie, |
DJ_cool_ | Przygotujcie sobie konsole z uruchomioną waszą ulubioną powłoką ;p | |
DJ_cool_ | Jak gotowi to pisać. | |
damian | tak | |
prawn | daj mi shella ;d | |
no_name | tak | |
19:02 | damian | mam aż 5 |
meal | Ready to go | |
skal|off | lol | |
lux_ | mam konsole | |
lux_ | :D | |
DJ_cool_ | Ok | |
DJ_cool_ | Zaczniemy od | |
DJ_cool_ | Pipe'a, czasem zwanego potokiem. | |
19:03 | DJ_cool_ | (czyli znaczek |, shift+\ jak ktoś nie widzi). |
DJ_cool_ | Otóż przekierowuje on stdout pierwszego polecenia, do stdin drugiego | |
DJ_cool_ | stdout=Standardowe wyjście | |
DJ_cool_ | stdin=standardowe wejście | |
DJ_cool_ | Przykładowo | |
19:04 | DJ_cool_ | cat /etc/passwd | less |
DJ_cool_ | Polecenie to wypisze zawartość pliku /etc/passwd i przekieruje do polecenia less, które chyba wiadomo jak działa. | |
DJ_cool_ | Nie gadać mi tu nawet nickami, | |
19:05 | DJ_cool_ | Wszystko jasne jeśli chodzi o | ? |
phoenix__ | re | znaki pl dobre zmiencie sobie kodowani | sry za wtracenie | |
damian | okej | |
damian | pipe | |
DJ_cool_ | Cześć phoenix__. | |
lux- | BEZ PL ZNAKOW | |
damian | piszesz w PIPE :D | |
jaro3000 | 18:03 <@DJ_cool_> Mam nadzieję że podstawy basha znacie (...) 18:05 <@DJ_cool_> Pipe'a, czasem zwanego potokiem. | |
prawn | bez azs ;d | |
phoenix__ | lux-: zmioen se kodowanie | |
jaro3000 | WTF ? | |
damian | u mnie w irssi dziala | |
DJ_cool_ | jaro3000: Mówiąc podstawy miałem na myśli totalne podstawy. | |
phoenix__ | jaro3000: ? | |
jaro3000 | aha. | |
DJ_cool_ | Możemy przechodzić dalej ? | |
lux- | u mnie w irssi nie:D | |
jaro3000 | spoko | |
19:06 | siano | tak |
skalniak | jaro3000: pewnie chodzilo mu o cd .. :) | |
phoenix__ | ;] | |
DJ_cool_ | ;d | |
DJ_cool_ | Mam nadzieję że wiecie także co to jest > i <. | |
DJ_cool_ | Teraz trochę praktyki. | |
19:07 | DJ_cool_ | Ale najpierw opiszę kilka poleceń które wykorzystam. |
DJ_cool_ | ps - wyświetla listę procesów. | |
DJ_cool_ | grep - wyświetla linie pasujące do danego wzorca | |
DJ_cool_ | no_name: Domyślna powłoka w systemach linuksowych. | |
DJ_cool_ | A teraz cicho | |
19:08 | DJ_cool_ | Kontynuuję |
DJ_cool_ | Chcąć wyświetlić wszystkie procesy `irssi' w naszym systemie | |
DJ_cool_ | Zastosujemy polecenie | |
DJ_cool_ | ps uaxf | grep irssi | |
19:09 | DJ_cool_ | zaksztusil_sie_slina_ze_: Nie gadać! |
DJ_cool_ | Przejdźmy dalej. | |
DJ_cool_ | Omówię podstawianie poleceń, czyli `` | |
19:10 | DJ_cool_ | ... |
DJ_cool_ | ;p | |
DJ_cool_ | ić | |
DJ_cool_ | Ok, kontynuując | |
DJ_cool_ | ` ` wykorzystujemy gdy chcemy wstawić wynik jednego polecenia w drugie, np: | |
19:11 | DJ_cool_ | cat /etc/pa`echo ss`wd |
DJ_cool_ | Mam nadzieję że to jasne | |
DJ_cool_ | Oczywiście zamiast prostego echo | |
DJ_cool_ | Możemy używać doowolnie długich poleceń, | |
DJ_cool_ | Przykładowo: | |
19:12 | DJ_cool_ | kill -9 `ps uaxf | grep ekg | grep -v djcool | awk '{print $2}'` |
DJ_cool_ | (cześć Anni ;p) | |
DJ_cool_ | Czy wszystko w tym przykładzie jest jasne? | |
skalniak | mozna pytanie z sali ? | |
no_ciekawe_ciekawe | Co to jest grep, co to jest awk | |
meal | Drugi grep odnosi sie do ekg? | |
no_ciekawe_ciekawe | co to za opcje auxf w ps | |
no_ciekawe_ciekawe | i co to jest kill? | |
no_ciekawe_ciekawe | :P | |
skalniak | no_ciekawe_ciekawe: grep bylo omawiane | |
DJ_cool_ | O grepie mówiłem, | |
19:13 | meal | DJ_cool_: Drugi grep odnosi sie do ekg? |
phoenix__ | no_ciekawe_ciekawe: kill to zabicie | |
no_name | aux*** pokazywanie procesow | |
mts | prosto zauwazyc ten styl :) | |
skalniak | DJ_cool_: czym zatem rozni sie ` od potokow skoro potokami tez moge wynik jednego programu skierowac do drugiego? | |
no_name | kill zabijanie ich | |
DJ_cool_ | meal: Drugi grep, usuwa z wyniku linie zawierające djcool | |
Annihilator | No dobra. | |
hawk | DJ mozna inaczej jeszcze | |
Annihilator | Ale ja wciąż nie wiem co to jest powłoka. | |
meal | Aha | |
Annihilator | :P | |
meal | :P | |
DJ_cool_ | awk - za manem 'pattern scanning and processing language' | |
meal | DJ_cool_: przetłumacz ;] | |
KosiarZ | Ludzie, apel, nie robcie burdelu chociaz > | |
19:14 | phoenix__ | Annihilator: jest to konsola linuxowa |
DJ_cool_ | W skrócie - awk '{print $2}' wyświetla tylko 2 wyraz z danej linii. | |
Annihilator | phoenix__, też źle | |
meal | phoenix__: źle | |
DJ_cool_ | Przejdźmy dalej, | |
Annihilator | phoenix__, będzie tu jakiś n00b | |
hawk | np killall -9 kadu | |
DJ_cool_ | Mów. | |
cholera_nie_skonczylem | I nie będzie wiedział o co kaman | |
phoenix__ | Annihilator: powloka to tytul mojego okna co z niego pisze | |
cholera_nie_skonczylem | Bardziej plebsowate slownictwo | |
cholera_nie_skonczylem | Ja tak mysle | |
cholera_nie_skonczylem | :P | |
19:15 | phoenix__ | no mam :} |
DJ_cool_ | Dobra, kończta. | |
DJ_cool_ | Do podstawiania poleceń można także wykorzystać $( ) | |
DJ_cool_ | Zamiast ` ` | |
DJ_cool_ | ALe ja wolę ` `, i tej wersji się będziem trzymać. | |
19:16 | DJ_cool_ | Ok, dalej |
DJ_cool_ | Zmienne znacie? | |
mts | ta | |
phoenix__ | EJ | |
KosiarZ | tak sobie. Wiem ze sa | |
DJ_cool_ | Nie gadać nickami, od tego jest -m. | |
KosiarZ | opowiedz cos. | |
phoenix__ | ZMIANA NICKOW == KICK | |
skal|off | nom | |
skal|off | powinno tak byc | |
DJ_cool_ | OK to opowiem pokrótce. | |
19:17 | phoenix__ | JESLI KILKA RAZY ZMIENISZ NICK TO KB!!!!!!! |
DJ_cool_ | Zmienne w bashu nie mają typów | |
DJ_cool_ | Ich deklaracja wygląda następująco: | |
DJ_cool_ | ZMIENNA=wartość | |
DJ_cool_ | Można używać dowolnej wielkości liter ale ja przyzwyczaiłem się do dużych ;p | |
19:18 | DJ_cool_ | Aby za zmienną podstawić wynik jakiegoś polecenia, robimy po prostu tak: |
DJ_cool_ | A=`cat plik | grep cośtam` | |
DJ_cool_ | Aby wykorzystać zmienną w poleceniu, używamy $ZMIENNA lub ${ZMIENNA} | |
DJ_cool_ | Dlaczego ten drugi sposób? O tym zaraz. | |
19:19 | DJ_cool_ | W bashu istnieje zmienna $SHELL oznaczająca aktualną powłokę (/bin/bash oczywiście) |
DJ_cool_ | I teraz mamy takie polecenie: | |
DJ_cool_ | echo Moja powłoka to $SHELL | |
19:20 | DJ_cool_ | A jeśli chcemy dopisać coś po $SHELL *bez spacji* to używamy wówczas tego drugiego zapisu. |
DJ_cool_ | Napiszemy teraz krótki skrypt w bashu, który będzie wykorzystywał to co do tej pory poznaliśmy. | |
DJ_cool_ | #!/bin/bash | |
19:22 | DJ_cool_ | A=`cat /var/log/messages | grep sshd | grep djcool | awk '{print $11}'` |
19:23 | DJ_cool_ | B=`echo $A | tail -1` |
DJ_cool_ | echo Użytkownik djcool logował się łącznie `echo $A | wc -l` razy, a ostatnio z IP ${B}. | |
damian_klimek | ;p | |
DJ_cool_ | Coś jest niejasne ? | |
19:24 | damian_klimek | odbanuj mnie na # |
TeMPOraL | DJ_cool_: ja rozumiem ;) | |
jaro3000 | powiedz o usuwaniu suffixa ( for file in *.in; do sth < %{file} >%{file%.in}.out; done; ) | |
hawk | ja tez a jeszcze mozesz dac jakies cwiczenie do zrobienia przez nas ;] | |
jaro3000 | i o ${zmienna:2:5} | |
19:25 | DJ_cool_ | jaro3000: Ja tu wykładam ;p |
KosiarZ | XD | |
KosiarZ | ale jaro3000 sie zna | |
amethis | ;] | |
DJ_cool_ | Ok skoro rozumiecie to,, przechodzimy dalej | |
DJ_cool_ | Każdy skrypt basha, można zapisać w 1 linii. | |
DJ_cool_ | Można do tego wykorzystać ; albo && | |
19:26 | DJ_cool_ | Różnica: |
phoenix__ | ;] | |
DJ_cool_ | && Uruchamia następne polecenie tylko gdy poprzednie zwróciło kod wyjścia 0. | |
DJ_cool_ | Czyli zakończyło się poprawnie. | |
19:27 | DJ_cool_ | Istnieje także ||, które jest jakby przeciwieństwem && (tylko gdy kod wyjścia nie jest równy 0). |
DJ_cool_ | Teraz pokrótce o pętli for. | |
DJ_cool_ | Składnia: | |
19:28 | DJ_cool_ | for zmienna in cośtam; do polecenia; done |
DJ_cool_ | Czyli przykładowo | |
19:30 | DJ_cool_ | for i in `ls /home | sed -e 's/\///'`; do echo User $i wykorzystuje `du -sm /home/${i}/ | awk '{print $1}'` MB.; done |
19:31 | DJ_cool_ | Tutaj wprowadziłem polecenie sed, które służy do filtowania i zamiany tekstu, w tym przykładzie bło to wyrażenie regularne s/\//// które usuwa wszystkie slashe. |
DJ_cool_ | Z kolei du -sm plik wyświetla ile zajmuje plik (w megabajtach) | |
19:32 | DJ_cool_ | Wsyztsko jasne jak do tej pory? |
ConSi | mhm | |
jaro3000 | da | |
KosiarZ | polecenie jest wykonywane dla i rownego kolejnym liniom tego co po in ta? | |
Stasiektoja | taaaaaaaaak | |
DJ_cool_ | KosiarZ: Zasadniczo to słowom. | |
19:33 | KosiarZ | Słowom, ok. |
DJ_cool_ | Np for i in "słowo1 słowo2"; do cośtam; done wykona się dla i=słowo1 i i=słowo2 | |
ConSi | [; | |
KosiarZ | for i in "słowo1\ słowo2"; do cośtam; done - tutaj się tylko raz wykona, right? | |
19:34 | DJ_cool_ | tak. |
DJ_cool_ | hm, czekajta. POkręciłem coś. | |
19:35 | DJ_cool_ | for i in słowo1 słowo2; do cośtam;done wykona się dwa razy. |
DJ_cool_ | Jak chcemy aby pętla wykonała się ileśtam razy, możemy użyć seq | |
19:36 | DJ_cool_ | Przykładowo for i in `seq 1 10`; do echo Wykonuję się $i raz;done |
DJ_cool_ | Oczywiście między do i done może być więcej niż 1 polecenie | |
19:37 | amethis | ;] |
DJ_cool_ | Proszę. | |
ConSi | no | |
Stasiektoja | ;] | |
ConSi | a czy trzeba je jakos oddzielac | |
ConSi | ? | |
ConSi | bo zielony z basha jestem :P | |
DJ_cool_ | Jeśli piszesz w 1 linii to ; | |
ConSi | acha | |
19:38 | ConSi | tyle :) |
DJ_cool_ | Można oczywiście zapisać wszystko tak | |
DJ_cool_ | for i in `seq 1 10`; do | |
amethis | a jak nie w 1 | |
DJ_cool_ | polecenie 1 | |
DJ_cool_ | polecenie 2 | |
amethis | :P | |
DJ_cool_ | done | |
ConSi | acha | |
ConSi | nie tzreba zakanczac linii | |
ConSi | ? | |
DJ_cool_ | Nie | |
ConSi | mhm | |
ConSi | next please :P | |
amethis | ;] | |
DJ_cool_ | Pokażę kilka przykładów z życia. | |
19:39 | DJ_cool_ | Oczywiście nie tylko dotyczących for. |
DJ_cool_ | kill -9 `ps uaxf | grep fork | awk '{print $2}'` | |
DJ_cool_ | Tutaj chyba wiadomo o co chodzi. | |
19:41 | DJ_cool_ | A=`cat /etc/passwd | grep djcool | awk -F: '{print $7}'`;echo User djcool używa shella $A |
DJ_cool_ | Być może jest dla was niejasne co znaczy -F: | |
DJ_cool_ | Otóż patrząc na strukturę pliku /etc/passwd | |
DJ_cool_ | djcool:x:1000:100:,,,:/home/djcool:/bin/bash | |
DJ_cool_ | Widzimy że pola są rozdzielone dwukropkami | |
19:42 | DJ_cool_ | Co umiemożliwia użycie po prostu awk '{print $7}' |
DJ_cool_ | -F ustala znak który rozdziela pola. | |
19:43 | DJ_cool_ | Bo piszę kolejny przykład. |
DJ_cool_ | netstat -ep | grep ircd | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq | |
19:44 | DJ_cool_ | Rozumiecie ten przykład? |
KosiarZ | nie ;q | |
siano | nie | |
ConSi | y niebardzo | |
siano | ;) | |
amethis | :D | |
prophet | uniq? | |
meal | meal@gandalf:~$ netstat -ep | grep kadu | awk '{print $5}' | awk -F: '{print $> | |
meal | (Not all processes could be identified, non-owned process info | |
meal | will not be shown, you would have to be root to see it all.) | |
meal | STREAM | |
meal | unused-21701704514 | |
DJ_cool_ | uniq usuwa powtarzające się linie | |
meal | meal@gandalf:~$ | |
siano | o dokladnie to mam ;P | |
prophet | aha | |
19:45 | DJ_cool_ | Jeśli odpalicie to z roota, otrzymacie mniej więcej coś takiego |
Papa_Smerf | DJ_cool_: mozna prosic bez polskich znakow ? :) | |
amethis | wlasnie | |
B1tL4n | :) | |
phoenix__ | nie | |
ConSi | be | |
DJ_cool_ | fanthom.math.put.p | |
DJ_cool_ | gateway.php.pl | |
DJ_cool_ | gw.becomo.com | |
DJ_cool_ | hc178.internetdsl. | |
DJ_cool_ | host-217-172-242-1 | |
DJ_cool_ | ip-83-238-121-130. | |
DJ_cool_ | irc.lublin.pl | |
DJ_cool_ | ircnet.pl | |
amethis | krzaki sie robia | |
ConSi | iso nie maja | |
B1tL4n | bo same fiflaki :P | |
ConSi | :] | |
phoenix__ | amethis: to zmien kodowanie | |
amethis | tylko tu tak mam :D | |
19:46 | DJ_cool_ | Rozumiecie już ten przykład ? |
meal | ;] | |
DJ_cool_ | netstat wypisuje nawiązane połączenia | |
ConSi | zara sprawdze | |
DJ_cool_ | grep ircd - tylko połączenia z portem ircds | |
DJ_cool_ | ircd* | |
DJ_cool_ | pierwszy awk wypisuje 7 wyraz | |
19:47 | DJ_cool_ | Czyli np |
DJ_cool_ | open.pl.ircnet.net:ircd | |
DJ_cool_ | Drugi awk wyciąga z niego samą nazwę serwera | |
DJ_cool_ | sort sortuje, a uniq usuwa powtarzające się nazwy | |
ConSi | no teraz jarze | |
ConSi | :P | |
DJ_cool_ | Ok | |
DJ_cool_ | To teraz | |
19:48 | ConSi | dlugo jeszcze |
DJ_cool_ | POkażę wam taki skrypcik co osobom mającym sshd z pewnością się przyda | |
prophet | :D | |
ConSi | mam czas do 20 :/ | |
DJ_cool_ | #!/bin/bash | |
DJ_cool_ | MESS=/var/log/messages | |
DJ_cool_ | SEARCHSTRING="Did not receive identification string from" | |
DJ_cool_ | while [ 1 ]; do | |
DJ_cool_ | BLOCK=`cat $MESS | grep "$SEARCHSTRING" | grep -v "10.0." | awk '{print $12}' | tr ' | |
DJ_cool_ | ' ' '` | |
DJ_cool_ | for ip in $BLOCK; do | |
DJ_cool_ | if ! grep -q "$ip" /etc/hosts.deny | |
DJ_cool_ | then | |
DJ_cool_ | echo "ALL: $ip" >> /etc/hosts.deny | |
DJ_cool_ | echo "Zablokowalem IP: $ip" | |
DJ_cool_ | fi | |
DJ_cool_ | done; | |
DJ_cool_ | sleep 20 | |
DJ_cool_ | done; | |
19:49 | DJ_cool_ | Teraz na bieżąco jego omówienie i pytania. |
meal | I co to robi? | |
ConSi | kumam | |
ConSi | o dziwo | |
ConSi | :D | |
meal | Blokuje IP | |
DJ_cool_ | tak | |
meal | Ale po jakiej czynności | |
ConSi | ta | |
ConSi | jak sie nie zidentyfikuje chyba | |
ConSi | :P | |
meal | Co ten koles musi zrobić żeby go zablokowało? | |
19:50 | DJ_cool_ | Blokuje IP które nie wysyłają do sshd identification stringa. |
meal | Aha | |
ConSi | ha dobrze myslalem | |
ConSi | :D | |
meal | A no..czytać trzeba | |
meal | Głupi mealek ;[[ | |
DJ_cool_ | Czyli 95% skanowań bruteforce, | |
DJ_cool_ | Wiadomo jak to denerwuje. | |
ConSi | [; | |
TeMPOraL | DJ_cool_ | |
TeMPOraL | i jak sie domyslam | |
TeMPOraL | wszystkie niedokonczone logowania w SSH | |
19:51 | DJ_cool_ | Ten skrypt jest przystosowny do uruchamiania go na screenie, |
TeMPOraL | czyli np. jak sie domyslam | |
TeMPOraL | tak mnie zablokowales raz | |
DJ_cool_ | TeMPOraL: Możliwe, nic nie jest doskonałe | |
TeMPOraL | i dopiero po tygodniu odblokowales [na kewlu] :D | |
DJ_cool_ | Jeśli chcemy np. uruchamiać go z crona to pozbywamy się pętli while [ 1 ]. | |
19:52 | DJ_cool_ | Oczywiście można go przerabiać na swoje potrzeby itp. |
DJ_cool_ | Jakieś pytania ? | |
19:53 | DJ_cool_ | Ok, brak pytań, No to w takim razie dziękuję za uwagę. |
DJ_cool_ | Mam nadzieję ze moj wykład chociaż trochę się wam przydał. |