Wstęp do systemów operacyjnych i sieci komputerowych - LAB
Technikalia
Termin: piątek, 8:30-10:00, LAB11 (3070), Prowadzący: Michał Adamaszek, Kontakt: aszek@mimuw.edu.pl
Zasady zaliczania:
Są trzy zadania, pierwsze większe (z basha) i dwa pozostałe mniejsze. Ocena z laboratorium jest w przybliżeniu równa
liczba_rozwiązanych_zadań + 2
W przybliżeniu tzn. na połówki stopnia mogą wpłynąć: jakość rozwiązania (w obie strony), gigantyczne spóźnienie, aktywność na ćwiczeniach itp.
Ocena 3 to po prostu "zal", oceny od 4 w górę są uwzględniane jako pozytywny bonus do oceny z egzaminu.
Zmiana: będą tylko dwa zadania i oceny zostaną odpowiednio dopasowane.
Różne materiały:
Zajęcia 1, 5.10, Wprowadzenie
1. Ankieta. Proszę o wypełnienie so-ankieta.txt i wysłanie jej mailem na aszek@mimuw.edu.pl. Jej jedynym celem jest poznanie wstępnych umiejętności uczestników.
Przy każdej opcji proszę wpisać liczbę od 0 do 3 (0 = w ogóle nie znam, 3 = znam dobrze):
2. Podstawy. Polecenie man
. Poruszanie się po katalogach (cd, ls
). Struktura katalogów w Linuxie.
Zajęcia 2, 12.10, Orientacja w środowisku: użytkownicy, uprawnienia, procesy...
Materiały.
1. Użytkownicy, uprawnienia. Użytkownicy, grupy (groups, finger, w, last, passwd
). System plików: szczegóły polecenia ls
(ls -al
), prawa dostępu (rwx
, polecenia chmod, chown, chgrp
), dowiązania twarde i symboliczne (ln
). Obsługa systemu plików: mv, cp, rm, touch, mkdir, pwd, du
. Uwidacznianie typów plików w Midnight Commanderze.
2. Niektóre urządzenia specjalne. Często warto mieć pod ręką specjalne urządzenia, które wyglądają jak pliki n.p. /dev/null
- zjada wszystko co się do niego pisze (czarna dziura), /dev/zero
- można z niego czytać ciągle zera, /dev/urandom
- podaje bajty pseudolosowe.
3. Procesy. Tworzenie i zabijanie, środowisko, PID procesu (ps, kill, top, free
). Rodzice i dzieci, PPID procesu. Uruchamianie procesów w tle. Polecenia fg, bg, jobs
.
4. Prywatna konfiguracja basha. Pliki ~/.bash_profile
, ~/.bashrc
i ~/.bash_history
. Aliasy.
Ćwiczenia. Ćwiczenia dotyczące użytkowników najlepiej testować na maszynie students
.
- Łańcuszek dowiązań symbolicznych może mieć co najwyżej długość 10 (sprawdź). Po co takie ograniczenie?
- Sprawdzić do jakich grup się należy. Do jakich grup należy prowadzący laboratorium?
- Poszukaj informacji o grupach i użytkownikach w katalogu
/etc
.
- Przetestować dokładnie jak działają uprawnienia w odniesieniu do katalogów. Np. załóżmy, że mamy katalog
foo
, w nim plik bar
. Przy jakich kombinacjach uprawnień rwx
do katalogu i pliku można odczytać zawartość pliku, stworzyć nowy plik w katalogu, odczytać zawartość katalogu? Co się stanie, jeśli wykonamy polecenie cat foo/bar
nie mając uprawnienia r
do katalogu? A co jeśli nie mamy x
do katalogu? Poeksperymentować.
- Kiedy był ostatnio zresetowany komputer
students
?
- Czy można odebrać sobie wszystkie prawa dostępu do pliku? Załóżmy, że plik ma uprawnienia
0004
. Co to znaczy, i czy jego właściciel może go wtedy odczytać? A skasować?
- Który podkatalog w Twoim katalogu domowym zajmuje najwięcej miejsca?
- Jak działa opcja
-R
w chmod
i wielu tym podobnych poleceniach?
- Zmusić polecenie
rm
żeby nie dopytywało się o potwierdzenie usunięcia za każdym plikiem. Podobnie, zmusić do usuwania całych katalogów z podkatalogami.
- Kiedy ostatnio prowadzący laboratorium logował się na students?
- Wylistuj wszystkie pliki w katalogu posortowane po dacie ostatniej modyfikacji.
- Co robi polecenie
tac
? Skąd nazwa?
- Jak przy pomocy polecenia
kill
unicestwić wszystkie swoje procesy na raz? (Uwaga: wcześniej zachowaj wszystkie swoje dane :) ).Rozwiązanie
- Uruchom polecenie
ps
i omów łańcuch jego rodziców. Omów łańcuch rodziców serwera X
. Jakie są kolejne procesy w tych łańcuchach?
- Kto jest rodzicem procesu przeniesionego w tło?
- Zastąp najczęściej używane przez siebie długie polecenia krótkimi aliasami.
- Zmodyfikuj odpowiednie pliki tak, aby przy każdym logowaniu wyświetlana była aktualna data i/lub godzina (hint:
man date
).
Zajęcia 3, 19.10, Polecenia, potoki
Materiały.
- Tajny skrypt z Unixa i C M.Benke: TSU.ps.gz, rozdział 2.
- Przykłady: potoki
man bash
- sekcja Przekierowania
1. Najprostsze operacje na plikach tekstowych. cat, head, tail
. Dalsze: wc, sort, uniq, cut
.
2. Wejście/wyjście procesów. Standardowe wejście, wyjście i wyjście błędów. Operatory przekierowania wejścia/wyjścia z/do pliku/procesu: <, >, >>, |
. Przetwarzanie w potokach (pipes).
3. Więcej poleceń stworzonych do użycia z operatorem |
w potokach: sort, uniq, cut, wc, tr, head, tail, tee, echo, cat, nl, expand
. Przykład:
who | cut -f1 -d" " | sort | uniq | wc -l
Polecenie podaje liczbę aktualnie zalogowanych użytkowników. Najlepiej przeanalizować go uruchamiając coraz dłuższe jego początkowe fragmenty. Inny:
ppc386 a.pas 2> /dev/null > a.txt
Kompiluje program a.pas
przy czym wszystkie komunikaty o błędach wyrzuca do kosza, a wszystkie inne komunikaty kompilatora zapisuje w pliku a.txt
(dzięki temu nic nie jest wypisane na ekran).
Ćwiczenia
-
W pliku osoby.txt znajdują się: imię, nazwisko, płeć, PESEL i liczby punktów zdobyte za trzy zadania, te ostatnie oddzielone średnikami. Proszę napisać polecenia realizujące następujące zadania:
- Wypisać wszystkie różne nazwiska, posortowane alfabetycznie.
- Wypisać imiona i nazwiska wszystkich osób w kolejności alfabetycznej według nazwisk.
- Wypisać posortowane malejąco liczby punktów zdobyte za drugie zadanie.
- Znaleźć trzy najstarsze osoby i wypisać ich imię i nazwisko, przy czym najpierw wypisać kobiety a potem mężczyzn.
- Wypisać wszystkie różne miesiące (numerycznie) w których bohaterowie pliku mają urodziny.
- Wypisać liczbę różnych ocen za zadanie trzecie.
- Wypisać imiona i nazwiska osób posortowane malejąco według oceny uzyskanej za trzecie zadanie.
- Wypisać nazwiska osób z czterema najwyższymi wynikami za zadanie pierwsze.
- Zapisać wszystkie nazwiska do pliku
n.txt
, a PESEL-e do p.txt
(jednym poleceniem).Rozwiązanie
- Wypisz nazwę i rozmiar największego pliku w katalogu domowym.
- Skonstruuj polecenie wypisujące 10 linię z pliku (chyba, że jest mniej niż 10 linii, wtedy wypisuje pierwszą).
- Skonstruuj polecenie wypisujące 10 linię z pliku (chyba, że jest mniej niż 10 linii, wtedy wypisuje ostatnią).
- Co zrobią polecenia "
cat a > a
" i "cat < a >> a
" (Uwaga!)? Czym różni się "cat a > a
" i "cat a | cat > a
" ?
- Wziąć dowolny plik tekstowy i wypisać jego 20 pierwszych linii do jednego pliku, pierwszych 10 linii do drugiego i pierwsze 3 linie do trzeciego pliku (jednym poleceniem).
- Co robi polecenie
tac
? Skąd nazwa?
- Wyznacz długość najdłuższego polecenia, które "ostatnio" uruchomiłaś/eś. (Hint: co jest w pliku
~/.bash_history
?. Co dalej?)
- Mamy plik
liczby.txt
a w każdym jego wierszu liczbę. Czy sort liczby.txt
dobrze je posortuje? Jak to poprawić?
- Stwórz plik, w którym znajduje się kilka linii a w każdej imię, nazwisko i liczba (w tej kolejności). Następnie wypisz cały plik posortowany po każdej z tych zmiennych. Wypisz też same nazwiska i same imiona.
- Jak i po co działa
tail -f
?
- Czym są
/dev/zero
, /dev/random
, /dev/urandom
. Czym się róznią dwa ostatnie?
Zajęcia 4, 26.10, Skrypty I
Materiały.
1. Skrypty. Skrypt jest niczym innym jak pewnym (długim) poleceniem, które dla wygody, zamiast w jednej monstrualnie długiej linii poleceń, zapisujemy w pliku z wcięciami, komentarzami itp. Język programowania bash-a umożliwia (mniej więcej) użycie podobnych struktur sterujących jak inne języki imperatywne. Ogólna konstrukcja skryptu, składnia. Ściągnij przykładowy skrypt: sample_script.
1a. Zmienne i parametry. Deklarowanie i odwołania do zmiennych. Zmienne środowiska $USER, $HOME
. Parametry skryptu ($1, ...
), zmienne specjalne ($*, $#
- lista i liczba parametrów).
1b. Sterowanie. Pętle for, while
, polecenia seq, read
. Instrukcja wyboru case
. Instrukcja warunkowa if
i polecenie test, [ ]
wraz ze sprawdzaniem warunków logicznych, porównaniami i licznymi opcjami. Polecenie sleep
.
1c. Obliczenia. Wykonywanie obliczeń arytmetycznych, $[]
.
Ćwiczenia
- Ogólne:
- Napisz skrypt, który co 5 sekund wyświetla liczbę aktualnie zalogowanych użytkowników.
- Napisz skrypt, który wypisze rozmiar każdego katalogu, który został podany jako parametr (niektóre parametry mogą być śmieciami).
- Wypisać tekst
Dzisiaj jest...
po czym nastąpi bieżąca data.
- Wypisać 10 linii tekstu, przy czym zawartością i-tej linii ma być dokładnie i liter "A".
- Napisać skrypt, który sprawdza, czy dostał dokładnie 2 parametry i jeśli nie, to krzyczy na uzytkownika.
- Napisać skrypt obliczający sumę k-tych potęg liczb od 1 do n, gdzie k i n są naturalne i są podane jako parametr skryptu. Obsłużyć błędy w stylu: nadmiar lub niedobór parametrów, ujemne parametry.
- Wypisać na ekran po jednej (np. pierwszej) linii z każdego pliku w bieżącym katalogu.
- Napisz skrypt, który wypisze swoje parametry posortowane alfabetycznie (możesz chcieć użyć polecenia
tr
).
- Napisz skrypt, który zliczy liczbę podkatalogów, plików różnego typu (wykonywalnych, nie) i dowiązań symbolicznych w katalogu podanym jako parametr po czym wypisze stosowną statystykę.
- Mamy kilka plików, w każdym kilka liczb, po jednej w wierszu. Z każdego pliku chcemy wybrać największą liczbę, a następnie te największe liczby wypisać w kolejności rosnącej. Jak to zrobić? Nie chcemy używać żadnych plików tymczasowych.
- osoby.txt
- Oblicz łączną liczbę punktów zdobytych za zadania 1,2,3 przez wszystkie osoby.
- Wypisz dane osoby, która zdobyła najwięcej punktów w sumie.
- Napisz skrypt, który przekształci osoby.txt w plik z tymi samymi danymi a dodatkowo na końcu każdej linii doda czy osoba zaliczyła, czy nie, zależnie od sumy punktów. Nazwa pliku docelowego jest parametrem skrytpu.
- Skrypt, który jako parametr dostaje słowo "imie", "nazwisko" lub "pesel" i wypisuje dane osób posortowane właśnie według tego klucza.
- Skrypt, który dane każdej osoby zapisze do innego pliku zatytułowanego nazwiskiem tej osoby.
- Wpadki. Każdy z poniższych krótkich skryptów działa w szczególnych przypadkach nie tak jak byśmy chcieli (np. nie działa). Jak to poprawić?
echo $10
cat $1
if [ $a == $b ] then ....
for linia in $(cat plik); do echo kolejna linia to $linia; done
echo Tekst (z kawalkiem w nawiasie)
Zajęcia 5, 09.11, Skrypty II
Skrypty, cd. Funkcja read
i idiomatyczna konstrukcja służąca do przetwarzania pliku wiersz po wierszu:
cat $nazwa_pliku | while read wiersz; do zrób_coś_z_$wiersz; done
Funkcje w skrypcie i przesuwanie parametrów (shift
). Przykład na końcu sample_script.
Dzisiaj:
- Napisz w składni basha wyrażenia logiczne sprawdzające czy:
- plik o nazwie
$plik
istnieje i ma co najmniej 1000 bajtów
- w bieżącym katalogu jest co najmniej 10 plików
- suma liczb
$a
i $b
przekracza $c
- plik o nazwie
$name
nie jest dowiązaniem symbolicznym
- katalog o nazwie
$dir
istnieje i mamy prawo tworzyć w nim pliki
- zmienna
$data
w formacie rrrr.mm.dd
reprezentuje datę wypadającą po 2007.10.01
- użytkownik skryptu podał jakikolwiek parametr
- w pliku o nazwie
$name
, który w każdym wierszu zawiera jedno słowo, występują jakieś powtórzenia
- Sprawdź, czy opcja
-o
oblicza funkcję logiczną OR tak jak operator ||
w języku C, tzn. jeśli lewy argument jest prawdziwy to nie wylicza prawego argumentu. Jak to sprawdzić?
- Osoby mniej zaawansowane: ćwiczyć, ćwiczyć i jeszcze raz ćwiczyć. Skrypty z poprzednich ćwiczeń.
- Osoby bardziej zaawansowane: Napiszemy prościutki synchroniczny komunikator w bashu. Patrz
man mkfifo
. Jak ja to sobie wyobrażam.
- Wszyscy: oto fajne ćwiczenie: Rozwinięta wypisywaczka plików i podkatalogów. Skrypt wypisuje zawartosc biezacego katalogu w postaci drzewka, tzn. przy przejsciu do podkatalogow wciecie na kilka spacji. Dodajemy do niego obsluge roznorodnych opcji:
-r _depth
- nie wypisuj podkatalogow glebiej niz do glebokosci _depth
-d
- wypisuj tylko katalogi, bez plikow
-s _ile
- uzyj _ile
spacji do zrobienia wciecia przy przejsciu do podkatalogu
-l
- nie wchodz do podkatalogow, ktore sa linkami symbolicznymi
-b _dir
- zacznij od katalogu _dir
a nie od biezacego
Do tego podstawowa obsluga bledow przy wywolaniu np. nieznana opcja itp.
Zajęcia 6, 16.11, Wyrażenia regularne i Grep
Materiały
1. Wyrażenia regularne. Wyrażenie regularne to wzorzec, który opisuje język, tzn. zbiór słów, które do tego wzorca pasują. Operacje na wzorcach: konkatenacja, powtarzanie, alternatywa. Przykład: abc*(a|d)
- słowa zaczynające się od ab po których następuje kilka c a następnie a lub d.
2. Gwiazdka w bashu. Rozwijanie symbolu *
przez interpreter (np. ls *.txt
).
3. grep służy do znajdowania linii pasujących do wzorca (lub których część pasuje do wzorca), lub przeczesywania listy plików w poszukiwaniu pasujących do wzorca. Egrep
ma przyjaźniejszą składnię wyrażeń regularnych. Podstawowe konstrukcje: *, +, {n}
- liczność powtórzenia poprzedniego symbolu, []
- zbiór symboli, |
- alternatywa, .
- dowolny symbol, [^]
- dopełnienie zbioru symboli, ^, $
- początek, koniec wiersza. Grep-a można używać wewnątrz potoku lub podając listę plików. Bardzo liczne opcje grepa pozwalają modyfikować jego wyjście. Szczegóły w manie. Przykłady:
grep -v "^a" *.txt
- znajdź i wypisz wszystkie linie które nie zaczynają się od a w plikach o rozszerzeniu txt
cat passwd | cut -f1 -d: | egrep "^[a-z]{2}2[0-9]{5}"
- znajduje numery indeksów zaczynające się od 2
grep -c "Anna" passwd
- zlicza liczbę Ań (?) na wydziale
4. Ćwiczenia
- Napisz wyrażenia regularne rozpoznające następujące zbiory słów (abstrakcyjnie a potem w składni egrep-a):
- zawierających co najmniej dwie spośród liter a,b,c
- nie zawierających żadnej cyfry
- takich, że po każdym wystąpieniu litery a jest cyfra
- PESEL-e osób urodzonych w latach 80-tych w lipcu
- loginy na students osób o imieniu na literę pomiędzy D i W
- zawierających parzystą liczbę liter a
- ciągi cyfr w których każda następna cyfra jest większa od poprzedniej
- zawierających fragment który składa się z co najmniej 5 cyfr pod rząd
- komentarze w języku C lub Pascalu
- Zaopatrzywszy się w plik passwd znajdź:
- Nazwiska studentów zaczynające się na "A".
- Nazwiska studentów dłuższe niż 12 znaków i to takie, które nie są podwójne (bez myślnika).
- Największy numer indeksu mniejszy niż 200000 i jego posiadacza.
- To samo, ale wśród studentów JSIM.
- Prawdziwe ,,osoby'', tzn. odrzuć konta usług, roota, Archeologii, ,,Maszynę w domenie LK'' i tym podobne. Jak wygodnie zdefiniować ,,osobę''?
- Studentów (odrzuć pracowników).
- Liczbę osób mających imię zaczynające się na literę między D i G.
- Listę imion osób, których nazwiska zaczynają się na R.
- Nazwiska osób, których numery indeksu są podzielne przez 5.
- Napisz skrypt, który dostając nazwisko znajduje nazwisko studenta poprzedniego w porządku alfabetycznym.
- Osoby których imię zaczyna się na tę samą literę co nazwisko (wskazówka: wsteczne dopasowania).
- Ze wszystkich plików w bieżącym katalogu wyodrębnij linie w których znajduje się jakaś liczba (oddzielnie, otoczona białymi znakami) (wypisz tylko te linie, bez dodatkowych napisów takich jak nazwa pliku).
- Wypisz listę osób aktualnie zalogowanych na students, które zalogowane są z komputerów poza siecią wydziału lub UW (na tyle na ile to się da łatwo stwierdzić, czyli bez przesadnej skrupulatności).
- Pójdź dzisiaj o 16:00 na koncert Marianny Bednarskiej.
Zajęcia 7, 23.11, Uzupełnienia, ćwiczenia, practice makes master...
1. shift. Przesuwanie parametrów. Napisz skrypt, który wypisze kolejno wszystkie swoje parametry, korzystając tylko ze zmiennej $1
, bez odwołań do zmiennych $@
i $#
.
2. Funkcje w skrypcie. Funkcja (na końcu sample_script) to jak osobny skrypt i tak też ją wywołujemy. Wynik zwraca przez return
, dlatego trzeba go później odczytać ze zmiennej $?
. Podobnie można wywołać dowolny skrypt, program, etc.
3. Skrypty zagnieżdżone. Popatrz na fragment:
cat plik | ( while read trescLinii
do
echo kolejna linia to $trescLinii
done )
W nawiasy ujmujemy osobny skrypt, który równie dobrze mógłby być umieszczony w osobnym pliku, albo w funkcji.
4. Ładne użycie switch do rozpoznania co ma robić skrypt zależnie od pierwszego parametru. Patrz dowolny skrypt w /etc/init.d
.
5. date. Pozwala dowolnie sformatować datę dowolnego dnia. Przykłady:
date +%d-%m-%y
wynik 23-11-07
date --date "7 days ago" "+%d-%m-%Y,\ %W"
wynik 16-11-2007, 46
date --date "2007-12-24" +"%b %A"
wynik gru poniedziałek
6. Mantra... $HOME
, przekierowania do pliku, operatory porównania: -eq, -lt, -gt, -ne, ==, !=
, operatory logiczne: -a, -o, !
, man test
, uwaga na spacje, skomplikowane parametry bierz w cudzysłów, zwykle pobieramy wyjście polecenia: "$(polecenie)
", rzadziej pobieramy wynik polecenia: "polecenie; wynik=$?
", problemy ze składnią - patrz sample_script, korzystaj z narzędzi tekstowych w potokach
7. Dla zainteresowanych: sed Dobre materiały:
Przykłady:
echo dadada | sed s/da/la/
(s - substitute)
echo dadada | sed s/da/la/g
(g - globally)
echo 11 12 13 | sed s/[0-9]*/liczba &/
(& - dopasowany tekst)
echo ss 11 12 13 | sed 's/[0-9][0-9]*/liczba &/3'
(/3 - które dopasowanie)
echo aaaaaaababababababab | sed -e 's/a/x/g' -e 's/b/y/g'
(kilka zamian na raz)
echo aaaaaaababababababab | sed -e 's/a/b/g' -e 's/b/y/g'
(uwaga!!)
cat plik | sed '10,20 s/a/b/'
(wykonaj akcję w liniach 10-20 pliku)
cat plik | sed '/[0-9]/ s/a/b/'
(wykonaj akcję w liniach zawierających cyfrę)
cat plik | sed '10,20 { /[0-9]/ s/a/b/ }'
(wykonaj akcję w liniach zawierających cyfrę pomiędzy linią 10 i 20)
Zajęcia 8, 30.11, Fork()
Materiały
Uwagi dla piszących w języku C. Należy załączać pliki nagłówkowe unistd.h
, sys/types.h
, sys/wait.h
1. Procesy. Przypomnienie o procesach, PID-ach, poleceniu ps
.
2. fork(). Funkcja fork()
służy do tworzenia nowego procesu, który dziedziczy wszystko po rodzicu: pamięć, deskryptory plików, zmienne itp. Wartość zwracana wskazuje w którym procesie jesteśmy (w rodzicu - PID potomka, w potomku - 0). Oba procesy wznawiają wykonanie w tym samym miejscu.
3. wait(). Kulturalny proces powinien czekać na zakończenie jego potomków. wait()
czeka na dowolnego, waitpid(int pid,...)
na konkretnego. Funkcja jest blokująca.
4. Inne funkcje. Nazwy mówią same za siebie: getpid(), getppid(), halt, exit
... Ponadto, do osiągnięcia efektu wstrzymania procesu na chwilę: sleep(secs)
, wymaga nagłówka unistd.h
.
5. Błędy. Obsługa błędów mogących powstać przy używaniu wywołań systemowych. Standardowe zachowanie tych funkcji: zwraca coś nieujemnego jeśli OK, -1 jeśli błąd, przy czym kod błędu jest zapisywany w zmiennej globalnej errno
.
6. Ćwiczenia.
- Uzupełnij przykładowy program o obsługę błędu przy wywołaniu
fork
- Co pokaże polecenie
ps
, jeżeli dziecko się zakończy, a rodzic działa w najlepsze i nie wykonuje wait()
na dziecku? Co to jest proces zombie?
- A jeżeli dziecko działa a rodzic się zakończy? Kto staje się nowym rodzicem sieroty?
- Napisz program który stworzy liniową listę N procesów, każdy będący dzieckiem poprzedniego. Niech każdy proces coś o sobie i swoim rodzicu wypisze, niech też napisze który jest na liście. Każdy proces powinien czekać na zakończenie potomka (lista się rozwninie, a potem ładnie zwinie).
- Napisz program, który stworzy pełne drzewko binarne procesów o wysokości N. Reszta polecenia jak wyżej.
- Sprawdź eksperymentalnie, jakie jest ograniczenie na liczbę procesów na jednego użytkownika na komputerach na wydziale.
- Co jeśli proces się rozmnoży i wszyscy potomkowie piszą na swoje wyjście? Czy w poprzednich programach dało się zaobserwować różne przeploty (uruchom kilka razy).
Zajęcia 9, 7.12
Materiały
Materiały dla Pascala: Nazwy funkcji z C są takie same poza
zmianą pipe
-->AssignPipe
. Funkcje tworzenia łączy mogą
od razu działać na łączach typu text
, co potem umożliwia użycie na
nich standardowo WriteLn, Read itp. i jest wygodniejsze niż odwoływanie się
poprzez numery, ale być może trzeba pamiętać o częstym wykonywaniu
flush
, przez nazwę można się też odwoływac do standardowych
deskryptorów input
i output
.
1. exec*() uruchamia nowy zadany program w miejsce naszego, ale z
zachowaniem dotychczasowego PID, rodzica i deskryptorów. Pamięć starego
programu jest natomiast likwidowana. Składnia:
execl(nazwa_progr, param0, param1, ...., NULL)
2. Deskryptory. Tablica deskryptorów, standardowe deskryptory 0
(stdin) i 1 (stdout). Można tworzyć nowe pary deskryptorów (łącza nienazwane)
funkcją pipe
- jeden do pisania, drugi do czytania. Pisanie i
czytanie z nich przez funkcje write, read
. Składnia:
write(num_deskr, tablica_z_danymi, ile_bajtow)
read(num_deskr, tablica_na_dane, ile_bajtow)
pipe(int num_deskr[2])
- num[0] będzie do czytania,
num[1] do pisania
Mozna też nałożyć na nie strukturę FILE
(w języku C) i pisać
przez scanf, printf
, a może i cin, cout
. Deskryptor
(dowolny) zamykamy close
.
3. dup(), dup2() - powielanie deskryptorów.
4. fork-dup-exec. Standardowy sposób tworzenia łącza komunikacyjnego
między procesem i jego potomkiem. Tworzymy parę par (tzn. dwa wywołania
pipe
) deskryptorów do komunikacji (ew. tylko jedną parę jeżeli
chcemy komunikację tylko w jedną stronę); w procesie potomnym duplikujemy je na
standardowe we/wy i odpalamy w procesie potomnym nowy program, który przez
standardowe we/wy rozmawia teraz z rodzicem. Szczegóły w przykładzie.
5. Ćwiczenia na opanowanie składni i działania funkcji pipe, dup i
exec.
- Przenalizuj program przykładowy (może się przydać dobry
rysunek).
- Napisz program, który otwiera łącze do którego sam pisze a następnie
z niego czyta. Używaj funkcji
read, write
.
- Stwórz program, który tworzy łącze, rozmnaża się po czym rodzic
pisze coś do łącza a dziecko to odczytuje i wypisuje na ekran. Potem dwa łącza:
rodzic pisze do jednego, dziecko to samo pisze z powrotem do rodzica, rodzic
wypisuje na ekran.
- Napisz program, powiel deskryptor 0 na jakiś inny i czytaj z tego
innego i pisz na ekran to co przeczytałeś. Następnie wpisuj dane z
klawiatury.
- Sprawdzić co się dzieje, jeżeli piszemy do łącza, którego deskryptor
do czytania został zamknięty. Podobnie, co jeśli chcemy czytać z łącza, którego
deskryptor do pisania został zamknięty?
- Zadania przykładowe: rok 2005,
rok 2006
Zajęcia 10, 14.12
1. Ćwiczenia: Co się dzieje przy czytaniu z pustego pliku (albo
przy próbie czytania po osiągnięciu końca pliku)? Co jest wynikiem funkcji
read
? Co się dziej przy czytaniu z pustego łącza? Co się
dzieje przy czytaniu z pustego łącza do którego nie ma żadnych otwartych
deskryptorów do pisania? Kiedy funkcja read
blokuje się, a kiedy
nie?
2. Nagłówek programu. W programie, tak jak w skrypcie, można
odwołać się do argumentów wiersza poleceń. W C poprzez parametry funkcji
main
:
int main(int argc, char **argv)
gdzie argc
to liczba parametrów, a argv
to
tablica z kolejnymi parametrami jako napisami. Funkcja atoi
przekształca napis na liczbę, na przykład:
int x = atoi(argv[3]);
Tutaj
jest napisane jak to zrobić w Pascalu.
3.Uwaga! W każdym języku są inne sposoby odwoływania do argumentów
wiersza poleceń, do środowiska, wywoływania funkcji systemowych, dostępu do
wejść/wyjść itp. Sposób zapisywania i przeprowadzania tych operacji należy
poznać ucząc się danego języka programowania (jego składni), natomiast schemat
ich działania (fachowo: semantyka) jest zawsze taki sam (taka sama), bo prędzej
czy później sprowadza się do wywołania funkcji systemowych, które są wspólne dla
wszystkich.
4. Ćwiczenia z poprzednich zajęć.
Zajęcia 11, 4.01, IP, DNS, telnet...
Materiały
1. Adresowanie. Struktura adresu IPv4. Polecenie
ifconfig
, klasy adresowe, maska podsieci. Adresowanie IPv6.
2. DNS. Domeny, serwery DNS, translacja nazw. Hierarchiczna struktura
domen. Znajdowanie serwera nazw domeny. Odpytywanie serwerów nazw:
host
, nslookup
. Typy wpisów konfiguracyjnych serwera
DNS (czwarta kolumna w host -v
: NS, MX, TXT, A itp.). Opcje
host -t typ_zapytania
, host -t any
, host
-a
pozwalają poznać bardziej szczegółowe dane. Plik
/etc/resolv.conf
.
3. Organizacja adresów IP na świecie. RIR-y i LIR-y. Europejski RIR:
RIPE oraz jego baza Whois: http://www.ripe.net/whois. Znajdowanie
informacji o domenie lub zakresie adresowym poprzez bazę Whois.
4. Porty, usługi, protokoły. Port jest pojęciem umownym, w zasadzie
liczbą. Łącząc się ze zdalnym hostem łączymy się z jakimś jego portem.
Standardowe usługi (services) sieciowe używają standardowych portów, ich lista
jest w /etc/services
(np: HTTP-80, SMTP-25, POP3-110, SSH-23,
FTP-21, NNTP-119). Podstawą łączenia ze zdalnym hostem jakimkolwiek protokołem
jest polecenie telnet nazwa_hosta nazwa_portu
. Dalej następuje
interakcja za pomocą protokołu odpowiedniego dla danej usługi.
6. RFC. Skąd wiadomo, jaki jest protokół dla danej usługi? Celem
dokumentów RFC jest m.in. standaryzacja różnorakich protokołów. Aktualnie
RFC3700 zawiera listę bieżących numerów RFC dla poszczególnych usług.
Ćwiczenia.
- Podaj zakres adresów należących do podsieci opisanej jako
213.130.23.0/8.
- Pewien komputer o adresie 130.10.10.23 należy do podsieci o masce
255.255.255.240. Ile numerów ma pula adresowa tej podsieci? Czy należy do niej
adres 130.10.10.30?
- Który komputer na wydziale ma adres 10.1.1.143 ?
- Znajdź adresy IP poszczególnych komputerów wydziałowych: students,
duch. A zodiac?
- Znajdź w bazie whois informacje o domenach: mimuw.edu.pl, edu.pl,
pkp.pl itp.
- Używając jedynie polecenia
host
znajdź numer telefonu
do firmy obsługującej serwis onet.pl. Zrób to samo przy pomocy baz whois.
- Znajdź dostawcę internetu do którego puli adresów przynależy adres
80.252.0.145. A 80.251.0.145?
- Dowiedz się o serwery nazw domeny mimuw.edu.pl.
- Znajdź numer IP komputera students widzianego spoza sieci
wydziału?. Odpytaj poleceniem
host
odpowiedni serwer DNS
(który?).
- (!) Wyślij do prowadzącego (na adres aszek@mimuw.edu.pl)
maila przy użyciu wyłącznie programu
telnet
. W tym celu zapoznaj
sie ze skróconym opisem protokołu SMTP: http://www.cs.cf.ac.uk/Dave
/PERL/node175.html. Z jakim serwewem należy się połączyć aby wysyłać pocztę?
Użyj fikcyjnego nadawcy maila (np. kubus.puchatek@o2.pl)
- (!) Ściągnij jakąś stronę przez HTTP używając tylko
telnet
-u. Szybkie wprowadzenie do protokołu HTTP:http://www.jmarshall.com/easy/http/
- Nie całkiem serio: RFC2324, RFC1882, RFC2550, RFC3092, RFC1437.
Zajęcia 12, 11.01
Materiały
1. Poczta. Polecenie mail
jest przydatne do wysyłania
poczty np. ze skryptu. Jest (trochę) bardziej zaawansowane niż telnet na port
25. Standardowe użycie:
echo "Tresc maila" | mail -s "Temat maila"
adresat@gdzies.pl
Można dodać załącznik (-a
), (blind) carbon copies (-b,
-c
), zmienić adres w polu From: (-r
) etc.
1a. MTA. Czyli Mail Transfer Agent. Można wysłać maila uruchamiając
kopię serwera pocztowego (sendmail
, man sendmail
) i
przekazując mu treść listu (wraz z nagłówkiem) na wejście. Stąd schemat
automatycznej odpowiadaczki: weź list, wygeneruj nagłówek automatycznej
odpowiedzi, następnie wygeneruj treść listu i przekieruj to wszystko na wejście
sendmaila
.
2. Organizacja poczty. Przechowywanie: mailboxy i maildiry, różnice
między nimi. Mailboxy i maildiry nadają się do ręcznego przeglądania, np.
grep
-em.
3. Struktura pojedynczej wiadomości. E-mail (SMTP/POP3/IMAP) opiera
się na protokołach całkowicie tekstowych, nagłówek wiadomości zawiera wszystkie
pola niezbędne do jej dostarczenia i dodatkowe informacje, dalej treść.
Załączniki są częścią treści. Najważniejsze pola: From:, To:, Subject:, Cc:,
Bcc:, Reply-To: Message-ID:, Received:.
UWAGA. Używając narzędzi opisanych poniżej
należy bardzo uważać, aby nie doprowadzić do nieskończonej pętli mailowej! W
razie czego należy szybko usunąć plik .forward.
5. Mechanizm .forward. Pomiędzy otrzymaniem maila przez serwer
pocztowy a dostarczeniem go do skrzynki użytkownika można go jakoś przetworzyć.
Najbardziej podstawowy mechanizm polega na umieszczeniu w katalogu domowym pliku
.forward
z podaną pewną akcją. Akcja ta zostanie zastosowana do
każdego nadchodzącego maila. Może to być adres e-mail na który mail należy
przesłać, nazwa programu (po symbolu pipe-a |
) którym należy go
obsłużyć, lub kilka akcji oddzielonych przecinkami. Przykład pliku
.forward
:
jasio@o2.pl, "| head -1 >> ~/pierwsze.txt"
Spowoduje on przeforwardowanie każdego nadchodzącego maila do jasia oraz
dopisanie pierwszej linii maila (co to za linia?) do pliku
pierwsze.txt
.
6. procmail. Jest to bardziej zaawansowany filtr poczty. Aby go
uaktywnić kierujemy w .forward
wszystkie maile do tego programu:
|procmail
Po nadejściu maila procmail czyta go i dopasowuje do reguł zawartych w pliku
konfiguracyjnym .procmailrc
(uprawnienia 0600). Jeżeli dopasowanie
do jakieś reguły sie uda wykonywana jest akcja związana z tą regułą i
przetwarzanie się kończy (z jednym wyjątkiem o którym dalej). Jeżeli po
przejrzeniu wszystkich reguł maila nie udało się do żadnej dopasować to trafia
on w najzupełniej zwyczajny sposób do skrzynki pocztowej. Reguła jest wyrażeniem
regularnym do którego jest dopasowywana treść maila (dokładnie jak z grep-em).
Akcja to nazwa mailboxa lub pliku do którego ma być zapisany mail lub polecenie
na którego standardowe wejście ma być przekazany mail.
7. Reguły procmaila. Składnia pojedynczej reguły (z grubsza):
:0 flagi
* wyrazenie_regularne
akcja
Na przykład:
:0
* From:.*aszek.*mimuw.*
/dev/null
wrzuci wszystkie maile od prowadzącego zajęcia tam, gdzie ich miejsce.
Inne:
:0 c
* From:.*aszek.*
| grep Subject >>
~/from-aszek.txt
zapisze wszystkie tematy maili otrzymanych od aszka do odpowiedniego pliku.
Flaga "c" oznacza, że nawet po udanym dopasowaniu do tej reguły przetwarzanie
pliku ma być kontynuowane. Wniosek: użycie flagi "c" przy wszystkich regułach
spowoduje że list i tak trafi do standardowej skrzynki (i może przy pierwszych
próbach z procmailem lepiej się tego trzymać). Możliwe akcje: |
skrypt
- przekazuje maila na wejście programu/skryptu, !
adres
- forwarduje maila na podany adres, nazwa_pliku
-
zapisuje maila do podanego pliku. Więcej przykładów w man
procmailex
. Tam też bardziej zaawansowana kontrola reguł przetwarzania
(flagi) i bardziej skomplikowane warunki.
8. formail. Wyciąganie poszczególnych danych z maila oraz
przekształcanie maili ułatwia program formail
. Działanie:
wybieranie określonych pól z nagłówka, lub ekstrahowanie treści (body) maila,
generowanie nagłówków nowych wiadomości na podstawie innych wiadomości,
generowanie nagłówków wiadomości z zadanych pól. Formail czyta z wejścia i pisze
na wyjście.
Ćwiczenia.
- Obejrzyj swój maildir na students: katalog
~/Mail
.
- Przejrzyj jakiś plik z mailem ze swojego maildira. Zwróć uwagę na
nagłówek i zinterpretuj jak najwięcej pól.
- Wyszukaj w swoim maildirze (lub w mailboxach pine-a jeżeli je masz,
w katalogu
~/mail
) maile pochodzące od określonego nadawcy, mające
określony temat itp. Dla każdego znalezionego wpisu wypisz jakis początkowy
fragment maila (grep -A
)
- (!) Wyślij do prowadzącego maila zawierającego kolejno
wszystkie liczby naturalne od 1 do 100.
- Weź plik z dowolnym mailem i poobrabiaj go programem
formail
. W szczególności:
- wybierz sam nagłówek wiadomości
- wypisz wszystko, ale z usuniętymi wszystkimi polami Received
i bez pola Subject
- wypisz tylko treść maila, bez nagłówków
- (!) wygeneruj nagłówek maila, który mógłby być
odpowiedzią na tego maila (tzw. nagłówek automatycznej odpowiedzi)
- jak wyżej, ale tak żeby tematem nie było "Re: stary_temat"
ale coś innego
- Uaktywnij na swoim koncie na zodiacu procmaila i napisz następujące
reguły. Na wszelki wypadek pamiętaj o opcji c.
- Każdego maila przychodzącego od siebie zapisuje do
specjalnego pliku.
- Zlicza maile o temacie zawierającym literę "a": po każdym
takim mailu licznik znajdujący się w pliku a.txt ma się zwiększać o 1. (Długi
skrypt można dzielić na linie znakiem
\
, nie trzeba pisać
wszystkiego w jednej linijce.)
- (!) Po otrzymaniu maila z adresu zawierającego
fragment "aszek" odpowiada na tego maila mailem o treści "Dziekuje". Wskazówka:
użyj konstrukcji opisanej w
man procmailex
.
- To samo, ale jeszcze dołącz siebie do Cc: tej
odpowiedzi.
- To samo, ale zamiast "Dziękuję" odeślij treść otrzymanej
wiadomości.
- Zobacz w
man procmailex
schemat automatycznej
odpowiadaczki. Co oznaczają opcje -oi -t
przy uruchomieniu
sendmaila?
- Załóżmy, że nie chcemy odpowiadać wszystkim, ale tylko na maile
pochodzące z domeny mimuw. Jak to zrobić?
- Zajrzyj do
/etc/procmailrc
- globalnego pliku
konfiguracyjnego procmaila.
- Napisz filtr, który wszystkie maile większe niż 100kB wrzuca do
osobnego pliku.
- Częściowe uproszczenie wysyłania automatycznej odpowiedzi można
uzyskać przy użyciu programu
vacation
(sama nazwa wskazuje jego
działanie). Zapoznaj się z man vacation
.
Zajęcia 13, 18.01
Synchronizacja -- omówienie w kontekście zadania laboratoryjnego nr
2
Sesja Q & A przed egzaminem. Materiały:
Przed egzaminem: egzamin z
2003, slajdy z 2005
Lista pojęć wypisanych ze slajdów (uwaga, być może nie pokrywa się w pełni
z tegorocznym wykładem.)
- rejestry procesora, licznik rozkazów, stos, wskaźnik stosu,
tryb pracy procesora, pamięć cache, przerwanie (sprzętowe, programowe), obsługa
przerwania, DMA, ochrona pamięci
- SMP, systemy rozproszone, współbieżność, maszyna wirtualna,
warstwowość SO
- wywołanie systemowe
- proces i wątki, szeregowanie procesów, strategie przydziału
procesora: RR, FCFS, czasu rzeczywistego, priorytetowe, z postarzaniem;
przełączenie kontekstu
- komunikacja między procesami (IPC), synchronizacja, sekcja
krytyczna, semafor, aktywne oczekiwanie, zagłodzenie, zakleszczenie, blokada,
bezpieczny stan systemu, algorytm bankiera przydziału zasobów
- adresy logiczne i fizyczne, strona, ramka, stronicowanie,
tablica stron, translacja adresu logicznego na fizyczny, wymiana stron,
współdzielenie stron, copy on write, algorytmy wymiany stron: FIFO, LRU,
optymalny; trashing
- katalog, plik, montowanie, przezroczystość dostępu i warstwy
systemu plików w SO (VFS), i-węzeł w Linuxie, bloki dyskowe, sposoby adresowania
kolejnych bloków pliku, kronikowanie, różnice między lokalnym systemem plików a
NFS, budowa dysku, algorytmy szeregowania żądań dyskowych: FCFS, elevator-seek,
SSTF, itp.; RAID
Zajęcia 14, 25.01, Kryptografia, bezpieczeństwo
1.Szyfrowanie z kluczem publicznym i RSA. Klucz publiczny jest
jawny, klucz
prywatny stanowiący jego parę tajny. Działanie kluczy jest przemienne.
Wysyłający koduje wiadomość kluczem publicznym odbiorcy. Wszystko opiera się na
trudności odtworzenia klucza prywatnego z publicznego.
Najbardziej znany algorytm szyfrowania asymetrycznego (RSA),
opiera sie na trudności rozkładu liczb na czynniki.
2. PGP Pretty Good Privacy (w wersji gnu: gpg). Pakiet szyfrowania
asymetrycznego. Najpierw trzeba wygenerować sobie klucz oraz zaimportować klucze
publiczne osób, którym chcemy wysyłać szyfrowane wiadomości (lub od których
chcemy odbierać wiadomości). Można szyfrować dowolny plik. (Szczegóły: man
gpg
)
- Oto klucz publiczny: klucz
PGP, a oto wiadomość zaszyfrowana przy pomocy odpowiadającego mu klucza
prywatnego programem gpg: wiadomość. Odszyfruj oryginalną wiadomość.
- Oblicz klucz prywatny odpowiadający kluczowi publicznemu z poprzedniego
ćwiczenia (na odpowiedzi czekam do 31 grudnia 2011). Rozwiązania polegające na
włamaniu się na mój komputer i kradzieży klucza nie będą uwzględniane.
3. Haszowanie, funkcje skrótu. Taka funkcja wylicza skrót (np.
128-bitowy) dowolnie dużej porcji danych (np. pliku). Przy tym
prawdopodobieństwo kolizji powinno być niezwykle niskie. Popularne funkcje
skrótu: MD5, SHA.
- Poleceniami
md5sum
, sha1sum
oblicz sumy
kontrolne jakiegoś pliku. Następnie zmień w tym pliku choć jeden bajt (albo
nawet bit!). Czy suma kontrolna nowego pliku przypomina poprzednią?
- Inna własność skrótów polega na tym, że dla danego skrótu s odtworzenie
jakiejkolwiek wiadomości x takiej, że H(x)=s powinno być niezwykle trudne
obliczeniowo. Jakie to może mieć znaczenie dla przechowywania haseł
użytkowników na serwerze? (Zajrzyj do
/etc/shadow
na swoim
komputerze.) Czy gdziekolwiek na dysku serwera są faktycznie przechowywane
hasła użytkowników?
- http://pl.wikipedia.org/wiki/MD5,
http://en.wikipedia.org/
wiki/SHA_hash_functions
4. Po co funkcje skrótu? Podpisywanie dokumentów. Jak za pomocą
mechanizmów z kluczem publicznym zapewniać autentyczność wiadomości (tzn.
potwierdzać jej autorstwo). Mam wiadomość i szyfruję ją swoim kluczem
prywatnym. Wtedy wiadomo, że to ja ją podpisałem. W praktyce podpisuje się
jedynie sktót wiadomości, bo tak jest szybciej. Potem porównuje się skróty.
- MD5 poległo już jakiś czas temu: podrabianie wiadomości jest łatwe:
Alicja i Cezar. SHA
na razie się trzyma.
- Sprawdź, czy ten plik:podpis zawiera wykonany
przeze mnie podpis skrótu SHA1 wiadomości odtworzonej dwa ćwiczenia temu.
- Jak Alicja może jednocześnie zaszyfrować i podpisać wiadomość
przeznaczoną dla Boba?
5. SSH. Także SSH szyfruje komunikację. Jeżeli ustalimy klucze i
poinformujemy serwer o naszym kluczu publicznym, to bedziemy mogli się logować
nie podajac hasła, a jedynie klucz prywatny (ssh poda klucz za nas). (Szczegóły:
man ssh
, man ssh-keygen
)
- wygeneruj sobie parę kluczy publiczny-prywatny:
ssh-keygen -t rsa
,
pliki z kluczami powstają w katalogu ~/.ssh
- pamiętaj, że plik z kluczem
prywatnym nie może być nikomu udostępniony
- skopiuj klucz publiczny (
*.pub
) do pliku
~/.ssh/authorized_keys2
na maszynie na którą będziesz się logował
(np. zodiac)
ssh students
, także scp
zadziała
bez hasła
- jeżeli nie czujesz się z tym bezpiecznie, pousuwaj pliki z
kluczami z obu maszyn
6. SSL, TLS. Techniki kryptograficzne pozwalają na szyfrowanie
komunikacji dowolnym protokołem, np. HTTP-->HTTPS (włącz np. Usosweb).
7. To jeszcze nie koniec: