====== Filtry i Skrypty powłoki Sh ====== W związku z narastającą liczbą osób, które zwą informatykę "czarną magią" przedstawiam listę różnic między informatykiem a czarnoksiężnikiem: Czarnoksiężnik krzyczy "hokus-pokus" i "abra-kadabra". Informatyk: "bash" "grep" czy "sed" Czarnoksiężnik odeśle cię do diabła. Informatyk wyśle cię do /dev/null Czarnoksiężnik przenosi przedmioty wzrokiem. Informatyk obsługuje komputer bez myszki. Czarnoksiężnicy porozumiewają się telepatycznie. Informatycy używają komunikatorów. W domu czarnoksiężnika są tajemna komnaty. W komputerze informatyka są ukryte foldery. Aby coś było niewidzialne, czarnoksiężnik używa różdżki. Informatyk dodaje tylko kropkę przed nazwą. Ogólnie nasi czytelnicy oskarżali się na fakt, że obie grupy społeczne używają niezrozumiałych słów (zaklęć, poleceń), noszą dziwne ubrania (szaty, koszulki z napisami), otaczają się nietypowymi przedmiotami (różdżki w parasolach, pen-drive'y w pluszakach) a co najważniejsze - posiadają dziwną i niepojętą dla zwykłego śmiertelnika wiedzę tajemną, pozwalającą im rozwiązywać problemy (o których zasadniczo nikt nie wie) w sposób, którego nikt nie rozumie. /* nadesłał: Grzegorz Mucha, IS 2012 */ ===== DO PRZYGOTOWANIA ===== Samodzielnie należy przed tym laboratorium przygotować: * podstawy pracy z wybranym edytorem vi, Emacs, nano, pico * przeczytać artykuł pt.: {{:pl:dydaktyka:unix:gjn-sh.pdf|Podstawy programowania skryptów Sh}} * przeczytać artykuł pt.: {{:pl:dydaktyka:unix:gjn-bash.pdf|GNU Bash więcej niż Sh}} Dodatkowo przeglądnąć (w celu ew. skorzystania w czasie zajęć): * zapoznać się z //[[http://www.tldp.org/guides.html#abs|Advanced Bash-Scripting Guide]]// * przegląnąć artykuł (3 części) //Bash by example// [[http://www.ibm.com/developerworks/linux/library/l-bash/|część 1]], [[http://www.ibm.com/developerworks/library/l-bash2/|Część 2]], [[http://www.ibm.com/developerworks/library/l-bash3/|Część 3]] * ew. przeglądnąć [[http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html|BASH Programming - Introduction]] ===== WPROWADZENIE ===== ==== Rola skryptów w administrowaniu ==== * pozwalają na łatwe zautomatyzowanie często wykonywanych zadań, * upraszczają administrowanie systemem, * umożliwiają dostosowanie narzędzi administracyjnych do swoich celów, * jak również stworzenie swoich własnych narzędzi. ==== Czym są skrypty ==== * skrypty są plikami zawierającymi programy w języku skryptowym. * ten język jest najczęściej interpretowany, * w pewnym stopniu spowalnia to jego pracę, * ale ułatwia pisanie i uruchamianie. * dostarcza wielu narzędzi "wysokopoziomowych" ==== Języki i narzędzia do pisania skryptów ==== Istnieje wiele różnorodnych języków i narzędzi do pisania skryptów. Najpopularniejsze to: * Sh, * Csh/Ksh, * AWK, * Perl, * Tcl, * Python. ==== Skrypty powłoki Sh ==== Skrypt sh jest to: * plik tekstowy zawierający dowolne polecenia wykonywalne oraz wyrażenia języka sh, * nawet prosta sekwencja poleceń, normalnie wydawanych w powłoce sh, zapisana w pliku staje się skryptem. ==== Uruchamianie pliku skryptu ==== * Aby skrypt można było wykonywać bezpośrednio poprzez podanie nazwy, należy nadać mu atrybut wykonywalności (+x). * Wykonywalny plik tekstowy zawierający polecenia jest uruchamiany najczęściej przy pomocy powłoki logowania użytkownika. * Aby mieć pewność, że skrypt zostanie uruchomiony przy pomocy odpowiedniego interpretera, trzeba to w nim zapisać. * Pierwsza linia skryptu powinna mieć postać: #!/pelnasciezka/interpreter opcje * Co w przypadku skryptów sh wygląda tak: #!/bin/sh * Od znaku hash (#) zaczyna się komentarze, sekwencja ''#!'' na początku pliku jest traktowana jako podanie interpretera. ==== Przydatne narzędzia ==== Pisząc skyrpty korzysta się z dowolnych poleceń Unixa. Tym niemniej największą rolę odgrywają zestawy podstawowych narzędzi GNU. Proszę przeczytać manual do: * //textutils// * //fileutils// * //sh-utils// Dodatkowo przydatne narzędzia to: * **find** * **xargs** * **sed** * **awk** ==== Podstawianie wyników pracy poleceń ==== Podstawianie wyników poleceń w linii poleceń jest realizowane przez odwrotny apostrof (klawisz tyldy, nad tabulatorem), na przykład: $ echo "To jest system" `uname` "na maszynie "`hostname` ==== Find ==== Program **find** służy do wyszukiwania plików w systemie plików. Podstawowe użycie to: find sciezka -name nazwapliku -print Pozwala na zadawanie wielu kryteriów wyszukiwania, łączonych operatorami boolowskimi. ==== Język Sh ==== * Zmienne - podstawy * Dowolne polecenia dostępne w systemie * Zmienne i polecenia zewnętrzne - odwrócony apostrof, * Instrukcje warunkowe: **if**, **test** i **case**, * Funkcje * Parsing opcji z linii poleceń (przykład parser.sh) * Inne... Szczegóły w artykule {{:pl:dydaktyka:unix:gjn-sh.pdf|Podstawy programowania skryptów Sh}} ===== ĆWICZENIA ===== ==== - Przydatne narzędzia ==== === Find === Znaleźć przy pomocy find: * w katalogu ///usr/bin// wszystkie pliki o nazwie zaczynającej się na ''au'', * w katalogu ///tmp// wszystkie pliki należące do użytkownika ''root'', * w katalogu ///tmp// wszystkie pliki modyfikowane w ciągu ostatnich 24 godzin, * w katalogu ///tmp// wszystkie pliki zwykłe o uprawnieniach 700. === Podstawianie wyników pracy poleceń === Przy pomocy odwróconego apostrofu (obok Tabulatora!) napisać polecenie przypisujące do zmiennej WYNIK: * aktualną datę, * napis o treści System pracuje od A, jest zalogowanych B uzytkownikow, gdzie za A i B mają być wstawione odpowiednie informacje z polecenia **uptime** Przykład: WYNIK="To jest system `uname` na maszynie `hostname`"; echo $WYNIK To jest system Linux na maszynie deathstar ==== - Zaawansowane filtry ==== Napisać filtr, który: * wyświetli 7 pierwszych, posortowanych alfabetycznie, nazw plików o nazwie kończącej się na p znajdujących się w katalogu ///usr/bin//. * poda liczbę wszystkich plików zawierających w nazwie słowo ''ubuntu'', znajdujących sie w katalogu ///usr/bin//. * zapisze do pliku spis posortowaną alfabetycznie listę użytkowników aktualnie zalogowanych z komputerów mających początek adresu IP: 192.168.0 (inna opcja to w przypadku wyświetlania nazw domen: w domenie ''.agh.edu.pl''). * wybierze z 6 ostatnich linii pliku spis te, które zawierają słowo cos i poda ilość występujących w nich znaków. (plik testowy należy stworzyć). ==== - Proste skrypty ==== === Edytory === Oglądnąć jak przebiega edycja w edytorze mcedit i GNU Emacs (w razie potrzeby włączyć: ''M-x sh-mode'' i ''M-x font-lock-mode'') === Tworzenie skryptów === Napisać poprawny skrypt, który wyświetli: * aktualną datę, nazwę i czas pracy systemu, * spis zalogowanych użytkowników i spis sesji osoby uruchamiającej skrypt, * wyświetli prawa dostępu do pliku podanego jako parametr z linii poleceń: ''skrypt plik'' i poda typ/opis tego pliku * do powyższego skryptu dopisać (najlepiej w postaci funkcji) kod sprawdzający czy właściciel pliku jest zalogowany, a jeżeli tak to wyświetli informacje o nim i jego otwarte sesje. * napisać skrypt (np. do użycia jako CGI) generujący dynamicznie stronę WWW (plik HTML) o tytule: ''To jest spis plikow w katalogu KATALOG'' zawierającą spis i opis plików w podanym z lini poleceń katalogu, na każda pozycja spisu jest hiperpołączniem do odpowiedniego pliku. ==== - Złożone skrypty ==== Przeanalizować działanie skryptów podanych na [[http://home.agh.edu.pl/~gjn/wiki/dydaktyka:materialy#skrypty|starej stronie]] ===== Jeśli chcesz wiedzieć więcej ===== * Napisz skrypt, który dla każdego z plików podanych jako argumenty wywołania wyświetli w kolejnych liniach 3 najczęściej powtarzające się w nim słowa. * Napisz skrypt, który dla każdego z plików podanych jako argumenty sprawdzi (np. za pomocą polecenia ''file'') zastosowany na nim typ kompresji, a następnie zastosuje odpowiedni program do rozpakowania go. Jeżeli plik wejściowy nie jest spakowany, skrypt powinien wyswietlić ostrzeżenie i nie podejmować żadnej akcji względem tego pliku. * Napisz skrypt, który zarchiwizuje wszystkie pliki z Twojego katalogu domowego zmodyfikowane w przeciągu ostatnich 24 godzin (można użyć polecenia ''find''). * Napisz skrypt, który wyświetli po jednym wszystkie pliki z katalogu domowego większe niż 100kB. Dla każdego wyświetlonego pliku skrypt ma zapytać, czy uzytkownik chce skompresować czy usunąć plik, postapić zgodnie z jego wyborem, i przejść do nastepnego pliku. Skrypt ma zapisać do pliku nazwy i czas usunięcia usuniętych plików. * Napisz skrypt "bezpiecznego usuwania" ''srm.sh'', który podane jako argumenty pliki skompresuje (o ile już nie są skompresowane - należy to sprawdzić, np. przy pomocy polecenia ''file'') a następnie przeniesie je do folderu ''/home/user/trash''. Przy wywołaniu skrypt powinien sprawdzić folder ''trash'' i usunąć z niego pliku starsze niż 48 godzin. * Napisz skrypt, który rozwiązuje równanie kwadratowe (przyjmując jako argumenty parametry równania), użyj polecenia ''bc''. * Lista mailingowa. Napisz skrypt, uzywając polecenia ''mail'', który zarządza prostą listą mailingową. Skrypt ma za zadanie co miesiąc odczytywać treść zadanego pliku (podanego jako 1.argument) i rozsyłać go adresatom umieszczonym na liście w pliku podanym jako 2. argument. * Więcej ciekawych zadań: [[http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/writingscripts.html|tu]] * //[[http://www.gnu.org/software/sed/|Sed]]//: seria artykułów na [[http://www.ibm.com/developerworks|dW]]: [[http://www.ibm.com/developerworks/linux/library/l-sed1.html|część 1]], [[http://www.ibm.com/developerworks/linux/library/l-sed2.html|część 2]], [[http://www.ibm.com/developerworks/linux/library/l-sed3.html|część 3]], * //[[http://www.gnu.org/software/awk/|Awk]]//: seria artykułów na [[http://www.ibm.com/developerworks|dW]]: [[http://www.ibm.com/developerworks/linux/library/l-awk1.html|część 1]], [[http://www.ibm.com/developerworks/linux/library/l-awk2.html|część 2]], [[http://www.ibm.com/developerworks/linux/library/l-awk3.html|część 3]], * Cykl przykładów narzędzi: [[http://www.ibm.com/developerworks/linux/library/l-tiptex1.html|Tip 1]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex2.html|Tip 2]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex3.html|Tip 3]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex4.html|Tip 4]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex5.html|Tip 5]] [[http://www.ibm.com/developerworks/linux/library/l-tiptex6.html|Tip 6]]