Potoki, spójniki, skierowanie wejścia/wyjścia, znaki specjalne shella, skrypty, argumenty wywołania, zmienne, polecenia zagnieżdżone, wyrażenia warunkowe, pętle, testowanie warunków, operacje na stringach, cut, sed, wyrażenia regularne. Mechanizmy kontrolne Bourne shella: flagi -x i -v, polecenie puste :, mechanizm #!, sprawdzanie ustawienia wartości zmiennych ${zm?}
Przygotowanie: opis Bourne shella, programy test, expr, cut, grep, wyrażenia regularne, here document.
Sprawdź stan swojego konta na diablo, inyo i panamincie. W tym ćwiczeniu będzie potrzebny dostęp do wszystkich trzech systemów. Sprawdź jaki jest Twój przypisany interpreter poleceń na tych systemach, jaka jest jego dokładna lokalizacja.
Jeśli pracujesz w systemie okienkowym, to otwórz okna xterma (lub innego emulatora terminala) z połączeniem do wszystkich tych systemów. Otwórz sesję Emacs'a. Będziesz w niej tworzył/a testowe skrypty do uruchamiania w oknach terminala, jak również rejestrował/a wyniki uzyskane w kolejnych krokach.
Sprawdź środowisko zdefiniowane po włączeniu się do systemu (ustawienia zmiennych środowiskowych, polecenie env). Zorientuj się jaki jest Twój przypisany interpreter poleceń (zmienna SHELL). Sprawdź jaka zmienna wskazuje nazwę (Twojego) użytkownika systemu. Sprawdź jaka zmienna wskazuje nazwę Twojego katalogu domowego.
Utwórz skrypt, który wyświetli te informacje: nazwę użytkownika, nazwę katalogu domowego, nazwę przypisanego interpretera poleceń. Skrypt powinien być tak napisany, by system sam wybrał interpreter poleceń, którym go wykona. Sprawdź czy interpreter poleceń, którym system wykonuje Twój skrypt jest tym samym co Twój przypisany interpreter poleceń. Porównaj wynik dla wszystkich trzech systemów. Opisz te wyniki krótko w sprawozdaniu z wykonania ćwiczenia.
Wykorzystując program grep dopasowania wyrażeń regularnych wyświetl wiersz Twojego konta z pliku /etc/passwd (jeśli informacje o kontach użytkowników i hasła są zapisane w bazie LDAP a nie w pliku /etc/passwd to użyj polecenia getent passwd co jest równoważne odczytaniu pełnego pliku haseł).
Popróbuj różnych wyrażeń regularnych, aby wybrać poprawny wiersz (wyobraź sobie, że istnieje w systemie osoba o tym samym imieniu i nazwisku). Następnie użyj polecenia cut aby z wybranego wiersza wyselekcjonować samo imię, i skonstruuj polecenie wyświetlenia komunikatu powitalnego, które system mógłby wyświetlać użytkownikowi. Wklej opracowane polecenie do sprawozdania.
Zadanie dodatkowe dla specgrupy:
Znajdź stronę internetową, na której umieszczone są
informacje o bieżących imieninach (skonsultuj się w tej
kwestii z kolegami w grupie), ściągnij tę stronę
programem wget i przy pomocy dopasowania wyrażeń
regularnych stwierdź czy przypadkiem nie masz właśnie
imienin. Uzupełnij odpowiednio komunikat powitalny. Czy
jesteś w stanie zapewnić, że życzenia imieninowe będą
składane użytkownikowi tylko raz, w chwili pierwszego
włączenia się do systemu? Dowolnego z trzech systemów?
Bez tworzenia żadnych plików na dysku?
Wpisz wywołanie skryptu napisanego w poprzednim punkcie do pliku startowego interpretera poleceń: .login lub .cshrc. Do którego z tych plików należy wpisać wywołanie, aby wykonywało się tylko w momencie wejścia do systemu, ale nie w momencie wywoływania dodatkowego interpretera poleceń, spróbuj wywołać jawnie tcsh. Porównaj działanie dla wszystkich trzech systemów.
Napisz skrypt, który sprawdzi aktualny dzień i godzinę i jeśli wypada on w czasie Twoich zajęć laboratoryjnych z Informatyki, wyświetli komunikat:
"Witaj na zajeciach."a jeśli nie jest to czas zajęć to wyświetli:
"Witaj w czasie wolnym od pracy."Użyj konstrukcji ":" albo "#!/bin/sh" na samym początku pliku aby wymusić wykonywanie skryptu Bourne shellem. Od tego czasu wszystkie skrypty powinny mieć taką postać, chyba że będą pisane konkretnie dla innego interpretera poleceń.
Wklej opracowany skrypt do sprawozdania.
Przypomnienie: do wybrania odpowiednich elementów bieżącej daty najlepiej użyć konstrukcji set przedstawionej na wykładzie. Czasy wyrażone w godzinach i minutach można porównywać jako napisy znakowe poleceniem expr
Na początek wymyśl co najmniej trzy różne powitania (lepiej więcej), jakie mógłby wyświetlać system włączającemu się użytkownikowi. Powitania mogą być napisami stałymi, bądź zawierać elementy interpretowane przez interpreter poleceń. Wpisz wszystkie powitania, po jednym w wierszu, do pliku .witaj w katalogu domowym.
Następnie obmyśl jak można byłoby generować przypadkowo liczbę, inną za każdym razem, która pozwoliłaby w sposób niby-losowy wybierać powitanie z pliku. Napisz polecenie, które wybierze przypadkowe powitanie z pliku i wyświetli je użytkownikowi.
Wskazówki: do wybierania konkretnego wiersza z pliku przydatne będą programy head i tail, przykłady:
head -12 plik # wyswietla zawartosc pliku do 12-ego wiersza tail +10 plik # wyswietla zawartosc pliku od 10-ego wierszaPrzy generacji przypadkowego numeru wiersza może się przydać operacja modulo (%) programu expr. Jeśli powitanie zawiera treść do interpretacji, to konieczne będzie wymuszenie tej interpretacji poleceniem zagnieżdżonym echo albo eval.
Wklej opracowane wywołanie do pliku startowego. Sprawdź działanie na wszystkich trzech systemach. Wklej ostateczne rozwiązanie do sprawozdania.
Zadanie dodatkowe dla specgrupy:
Wykonaj wariant ćwiczenia z pełną interpretacją powitania,
umożliwiającą wykonywanie poleceń zagnieżdżonych.
Następnie obmyśl sposób włamania się na czyjeś konto
wykorzystując chwilowy dostęp do jego pliku .witaj.
Opracuj odpowiednie wyrażenie. Współpracując z kolegą,
sprawdź skuteczność swojego rozwiązania. Następnie
zabezpiecz swój plik .witaj, i sprawdź zabezpieczenia
innych plików startowych. Wklej rozwiązanie do sprawozdania.
Wskazówka: w wykonaniu tej części ćwiczenia przydatny może być atrybut set-uid i polecenie chmod.
Uwaga: włamywanie się na cudze konta komputerowe jest niezgodne z regulaminem i może być niezgodne z prawem.
Utwórz plik .witaj_nr zawierający pojedynczy wiersz z liczbą 1. Wykorzystując plik .witaj z poprzedniego punktu napisz wyrażenia, które będą wybierać powitania w sposób sekwencyjny zamiast przypadkowego, tzn. w kolejnych wywołaniach wyświetlane będą kolejne komunikaty. Twoje wyrażenia powinny przeczytać liczbę z pliku .witaj_nr, zwiększyć ją o 1 modulo liczba wierszy w pliku .witaj, wpisać nową liczbę do pliku .witaj_nr w miejsce poprzedniej, i wyświetlić z pliku .witaj wiersz o tym numerze. Modyfikacji zawartości pliku dokonaj edytorem ed z wykorzystaniem mechanizmu here document. Wklej rozwiązanie do sprawozdania.
Uruchom na diablo polecenie:
/usr/sbin/prtdiag -v
Znajdź wyświetlone temperatury panujące wewnątrz obudowy
komputera i w poszczególnych procesorach. Wykorzystując
operator : dopasowania wyrażeń regularnych programu
expr i wyrażenia Bourne shella napisz skrypt, który
sprawdzi czy temperatura któregoś procesora nie przekracza 55
stopni, i jeśli tak, to wyświetli komunikat ostrzegawczy.
Zadbaj by wyświetlał się najwyżej jeden komunikat.
Wklej rozwiązanie do sprawozdania.
Napisz skrypt Bourne shella, który dla dowolnego zestawu argumentów wywołania, interpretowanych jako nazwy plików, wypisze na wyjściu te same nazwy plików, po jednej w wierszu, w postaci ścieżek bezwzględnych. Podane jako argumenty, nazwy plików mogą być:
Wskazówki: pamiętaj o wbudowanym poleceniu shift. Przydatny może się również okazać program basename
Zadanie dodatkowe dla specgrupy:
1. wyświetlane na wyjściu nazwy plików muszą być
w najprostszej postaci, nawet jeśli użytkownik poda nazwę
pliku w postaci np. ../wspolna/../moja/plik.txt
2. jeśli użytkownik poda nazwę pliku ze znakami *, ?,
lub [...] i normalna interpretacja wiersza przez
Bourne shell spowodowałaby rozwinięcie tej nazwy do kilku
nazw plików, to skrypt nie może dopuścić do rozwinięcia
nazwy, tylko musi wyświetlić je w postaci skróconej
3. jeśli któryś z argumentów nie da się rozwinąć do nazwy
pliku/ów, to należy wyświetlić komunikat na wyjściu
błędów, nic na wyjściu standardowym, i kontynuować
przetwarzanie dalszych argumentów.
Krótko mówiąc, nazwy powinny być wyświetlane w porządnej i
minimalnej postaci. Przydatna będzie opcja -f Bourne shella, i
jej dynamiczne włączanie i wyłączanie poleceniem set -f