1 1 Systemy operacyjne laboratorium 1.1 Sprawy organizacyjne Wykonanie większości zadań wymaga dostępu w trybie zwykłego użytkownika do serwera uniksowego/linuksowego. Najprościej jest uruchomic program Cygwin (XWIN) i po pojawieniu się okna ze znakiem zachęty użyć komendy ssh -X user@serwer, gdzie serwerem może być któryś z serwerów kont studenckich (ferm, nobel, tor lub uran). Niektóre zadania mogą wymagać posiadania uprawnień superużytkownika (administratora), czyli dostępu do konta root. Takie możliwości stwarzają maszyny wirtualne. Na potrzeby zajęć zostało utworzonych 16 wirtualnych maszyn linuksowych (CentOS 5.3), które pracują w wydzielonej sieci 10.0.0.0/8 realizowanej na osobnym przełączniku wirtualnym virbr0. Maszyny mają adresy od 10.1.i.1 do 10.1.16.1 i są NAT-ne (wyjście porzez bramę 10.0.0.254). Dostęp do nich jest możliwy z serwerów studenckich poprzez 1. połączenie via SSH na maszynę labul4b na port 4022+100*i. Np. połączenie na maszyne 10.1.5.1 realizowane jest przez komendę ssh -p 4522 root@labul4b.fizyka.umk.pl Hasło: centos 2. połączenie via VNC na maszynę labul4b na port 16000+i 10+2. Np. połączenie na maszynę 10.1.5.1 realizowane jest przez komendę vncviewer labul4b:16052. Żeby to było możliwe trzeba najpierw zarejestrować się na maszynie używając ssh i uruchomić na niej serwer vnc przy pomocy komendy /root/bin/vnc.sh start. Uwaga! Przy połączeniu realizowanym z komputerów w pracowni (sieć 158.75.100.0/24) należy łączyć się na serwer labul100b, a nie labul4b. Zadania (kolejne ich wersje) należy przechowywać w repozytorium svn (/misc/staff/svn/so10). Oto kilka niezbędnych komend do pracy z repozytorium SVN. Przypadek A. Należy zalogować się na któryś z serwerów: # Pobieranie aktualnej wersji repozytorium dla użytkownika nazwisko svn checkout file:///misc/staff/svn/so10/nazwisko # W bieżącym katalogu pojawia się podkatalog nazwisko.
2 # Jeśli w tym katalogu zostanie utworzony plik plik, to można go # umieścić w repozytorium wykonując komendy svn add plik svn commit -m"dodanie pliku plik" # Usunięcie pliku wymaga analogicznych komend svn del plik svn commit -m"usuwanie pliku plik" Przypadek B. Jesteśmy zalogowani na komputerze mającym połączenie ssh z serwerem ameryk.fizyka.umk.pl: # Pobranie zawartości repozytorium svn checkout svn+ssh://user@ameryk.fizyka.umk.pl/misc/staff/svn/so10/nazwisko Praca na kopii repozytorium odbywa się tak samo jak w przypadku bezpośredniej pracy na serwerze wydziałowym. Zaliczenie na podstawie terminowo oddawanych, samodzielnie wykonanych zadań, aktywności na zajęciach, zaliczonych sprawdzianów i kolokwium. Bez usprawiedliwienia nie można opuścić więcej niż 4h zajęć!
3 1.2 Forma zadań-skryptów Rozwiązanie każdego z zadań wymaga napisania skryptu lub skryptów w języku bash. Opis języka bash mozna znaleźć na stronach podręcznika systemowego (man bash) lub w wielu artykułach i książkach dostępnych w Internecie, np. Mendel Cooper, Advanced Bash-Scripting Guide. An in-depth exploration of the art of shell scripting, http://tldp.org/ldp/abs/html/index.html. Z tej książki zaczerpnięto szereg przykładów wykorzystanych w poniższych zadaniach. The shell is a command interpreter. More than just the insulating layer between the operating system kernel and the user, it s also a fairly powerful programming language. A shell program, called a script, is an easy-to-use tool for building applications by gluing together system calls, tools, utilities, and compiled binaries. Virtually the entire repertoire of UNIX commands, utilities, and tools is available for invocation by a shell script. If that were not enough, internal shell commands, such as testing and loop constructs, lend additional power and flexibility to scripts. Shell scripts are especially well suited for administrative system tasks and other routine repetitive tasks not requiring the bells and whistles of a full-blown tightly structured programming language. 1. Skrypty muszą być napisane w bashu i mieć atrybuty wykonywalności (jeśli stosowane są polskie znaki, to trzeba stosować kodowanie utf8). 2. Skrypty muszą mieć nazwy podane w zadaniu. Jeśli skrypt korzysta z innych plików, to powinny one mieć nazwy powiązane z nazwą skryptu, a rozszerzenie powinno informować o charakterze pliku. 3. Skrypty wywołane z opcję -h muszą zwracać stosowną informację o swoim działaniu w formacie właściwym dla stron podręcznika systemowego (w sekcji AUTOR imię, nazwisko oraz adres pocztowy <user@fizyka.umk.pl>). Załączony opis musi informować o przeznaczeniu skryptu oraz o znaczeniu jego ew. opcji. Opis musi być zrozumiały nie tylko dla autora! Tekst opisu musi być formatowany w taki sposób, aby mieścił się w typowym oknie, czyli wiersze powinny składać się z 65-75 znaków. Do zmiany formatu można użyć komendy fmt (fmt -c file), a aktualny rozmiar okna określić dzięki komendzie stty (stty size). Należy zadbać o poprawność językową opisu. Można to zrobić korzystając z odpowiednich funkcji emacsa lub bezpośrednio wywołując program aspell (aspell --lang=pl_pl -c file lub aspell --lang=en_en -c file). 1 1 Parametr lang można pominąć, jeśli zmienna środowiskowa LANG ma właściwą wartość.
4 4. Skrypt wywołany bez podania argumentów powinien działać, gdyż powinny one przyjmować odpowiednie wartości domyślne. Skrypt musi działać bez ingerencji użytkownika, co oznacza, że skrypt nie generuje żadnych pytań o wartości argumentów i opcji (oczywiście z wyjątkiem sytuacji, kiedy tego będzie wymagała specyfikacja zadania). Skrypt nie powinien również wypisywać zbędnych komunikatów w rodzaju Parametr prawidłowy. Komunikaty mogą być potrzebne, jeśli parametr lub ew. jego wartość jest niepoprawa. 5. Jeśli istnieje taka możliwość, to skrypty muszą dostarczać danych pozwalających sprawdzić poprawność ich działania. 6. Przy tworzeniu kilkuwierszowych opisów lepiej stosować cat << EOF... EOF niż wielokrotnie echo -e. Powtarzające się fragmenty kodu powinny być zamieniane na wywołania odpowiednich funkcji. Zamiast posługiwać się w skrypcie jawną nazwą skryptu lepiej jest użyć zmiennej $0 (basename $0.sh). Wielokrotnie użycie jakiejś nazwy powinno być zastąpione przez użycie zmiennej o odpowiedniej wartości.
5 2 Zadania 1. Napisz skrypt system.sh, który wypisuje nazwę hosta (w nawiasie jego adres IP oraz pełną nazwę), nazwę dystrybucji i numer wydania, architekturę systemu, rodzaj i wersję używanego systemu operacyjnego, model procesora, liczbę procesorów, dostępną pamieć RAM oraz pamięć wymiany (w KB oraz GB), czas od ostatniego uruchomienia, liczba połączonych (zalogowanych) użytkowników. Komendy systemowe: cat, gawk, free, grep, head, hostname, uname, uptime, who Pliki: /etc/issue, /proc/cpuinfo, /proc/meminfo 2. Napisz skrypt ac-1.sh, który wypisuje użytkownika z największym czasem połączenia (logowania) i czas tego połączenia. Komendy systemowe: ac, basename, gawk, head, sort, tail Komendy basha: echo 3. Napisz skrypt ac-2.sh, który wypisuje (domyślnie) 10-u użytkowników o najdłuższym czasie połączenia. Opcja -n pozwala zmienić liczbę wypisywanych użytkowników. Identyfikatory użytkowników zapisywane są w tablicy acusers, a odpowiadające im czasy połączenia acctime. Komendy systemowe: ac, basename, gawk, head, sed, sort, tail Komendy basha: echo, let, read, while 4. Napisz skrypt skrypt ac5u3d.sh, który wypisuje (domyślnie) pięciu użytkowników z największym czasem logowania (opcja -n pozwala zmienić tę wartość). Zmodyfikuj ten skrypt tak, żeby wyznaczał także (domyślnie) trzy dni, w których całkowity czas połączenia był najdłuższy (opcja -d pozwala zmienić liczbę wyświetlanych dni). Obsługę opcji skrypt wykonuje samodzielnie. Komendy systemowe: ac, basename, gawk, head, sort, tail Komendy basha: echo, if, let, shift 5. Napisz skrypt selfpres-1.sh, który w kolejnych wierszach wypisuje: swoją nazwę, liczbę argumentów, wszystkie argumenty (parametry pozycyjne). Jeśli skrypt jest wywołany bez podania co najmniej 3 argumentów, to pojawia się stosowny komunikat (wartość 3 jest określona przez odpowiednią zmienną). Wypisz wartości argumentów stosując instrukcje iteracyjne while, until, for. Komendy systemowe: basename
6 Komendy basha: echo, for, if, shift, until, while 6. Napisz skrypt selfpres-2.sh, który przyjmuje dokładnie 3 argumenty. Jeśli skrypt jest uruchamiany bez żadnego argumentu, z jednym lub dwoma argumentami, to kończy się wypisując odpowiedni komunikat i zwracając odpowiednio status powrotu (kod błędu) 3, 2 lub 1. Komendy systemowe: basename Komendy basha: echo, for, if, shift, until, while 7. Napisz skrypt selfpres-3.sh, który do poprawnego działania potrzebuje trzech argumentów. Jeśli któregoś z argumentów brakuje, to nadawane im są domyślne wartości. Jakie wartości przyjmuje argument, który został zadany jako, np. selfpres-3.sh 1. Patrz http://devmanual.gentoo.org/tools-reference/bash/index.html. Komendy systemowe: basename Komendy basha: echo 8. Napisz skrypt ucase1.sh/lcase1.sh, który zamienia nazwy wszystkich plików w bieżącym katalogu na nazwy pisane dużymi/małymi literami. Co się dzieje, jeśli skrypt zostanie wykonany dwa lub więcej razy? Komendy systemowe: mv Komendy basha: for 9. Napisz skrypt ucase2.sh/lcase2.sh, który zamienia nazwy podanych plików na nazwy pisane dużymi/małymi literami. Domyślnie konwertowane są nazwy plików z bieżącego katalogu. Komendy systemowe: mv Komendy basha: for, if 10. Napisz skrypt listusers.sh, który służy do tworzenia listy użytkowników systemu. Plik z użytkownikami ma format pliku /etc/passwd. Jeśli skrypt zostanie wywołany, bez podania nazwy pliku, to domyślnie używany jest plik /etc/passwd. Domyślnie skrypt wypisuje uporządkowaną wg nazwisk listę użytkowników z wierszami postaci: nazwisko imię1 imię2 (nazwakonta). Jeśli zostanie podana opcja -u, to otrzymujemy listę użytkowników uporządkowaną wg nazw kont postaci: nazwakonta nazwisko imię1 imię2. Jeśli zostanie podana opcja -s, to do oddzielnych plików zapisywani są użytkownicy, którzy mają jedno bądź dwa imiona (nazwy plików to, odpowiednio, snusers.pid oraz mnusers.pid, gdzie PID jest numerem procesu).
7 Opcja -d powoduje usunięcie plików postaci snusers.* oraz mnusers.*. Komendy systemowe: gawk Komendy basha: if, read, while 11. Napisz skrypt modpasswd.sh, który służy do modyfikacji pliku, którego nazwa podana jest jako pierwszy argument. Plik ten ma format pliku /etc/passwd. Zmodyfikowany plik zapisywany jest pod nazwą kończącą się na.mod. Opcja -u powoduje zapisanie nazwisk użytkowników wyłącznie dużymi literami (należy pominąć konta systemowe). Opcja -l powoduje przywrócenie tradycyjnego zapisu, w którym tylko pierwsza litera nazwiska jest duża. Użycie opcji -s powoduje utworzenie pliku, w którym konta systemowe są uporządkowane rosnąco wg identyfikatora konta (uid), a konta zwykłych użytkowników są oddzielnie uporządkowane alfabetycznie wg nazw kont. Komendy systemowe: cat, gawk, grep, rm, sort, tr Komendy basha: if, read, while,