Home

Wstęp do systemów operacyjnych i sieci komputerowych - 1000-1M00SO


Technikalia

Termin: piątek, 14:15-15:45, s. 2041
Prowadzący: Sławek Kolasiński
Kontakt: initial.lastname @ mimuw.edu.pl
Konsultacje: sala 4500 MIM UW, poniedziałek 12:15 - 13:45 lub po indywidualnym umówieniu się.

Do góry

Zadania

Do góry

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.

Do góry

Różne materiały:

Do góry

Zajęcia 1, 03.10, Wprowadzenie

1. Ankieta.
Proszę o wypełnienie ankiety i wysłanie jej mailem na initial.lastname @ mimuw.edu.pl do mnie. 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.

3. Ćwiczenia.

Do góry

Zajęcia 2, 10.10, Orientacja w środowisku: użytkownicy, uprawnienia, procesy...

Materiały.

Tematy do omówienia.

  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. Proste przekierowania.
    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 skróty klawiaturowe C-z, C-c.
  4. Prywatna konfiguracja basha.
    Pliki ~/.bash_profile, ~/.bashrc i ~/.bash_history. Aliasy.

Ćwiczenia.

Ćwiczenia dotyczące użytkowników najlepiej testować na maszynie students.

  1. Łańcuszek dowiązań symbolicznych może mieć co najwyżej długość 10 (sprawdź). Po co takie ograniczenie?

    Stwórz katalog, a w nim dowiązanie symboliczne wskazujące na niego samego. W ten sposób powstaje cykl w drzewie katalogów. Za pomocą komendy cd wejdź do stworoznego katalogu. Ile razy można powtarzać tę czynność?

  2. Sprawdzić do jakich grup się należy. Do jakich grup należy prowadzący laboratorium?
  3. Poszukaj informacji o grupach i użytkownikach w katalogu /etc.
  4. Przetestować dokładnie jak działają uprawnienia w odniesieniu do katalogów. Np. załóżmy, że mamy katalog pimpek, w nim plik dimpek. 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 pimpek/dimpek nie mając uprawnienia r do katalogu? A co jeśli nie mamy x do katalogu? Poeksperymentować.
  5. Na maszynie students stworzyć w katlogu /tmp kilka plików za pomocą komendy touch. Następnie znaleźć wszystkie pliki w katalogu /tmp, których jesteś właścicielem. Zrobić to tak by nie wypisywały się komunikaty o błędach.
  6. Kiedy był ostatnio zresetowany komputer students?
  7. 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ć?
  8. Który podkatalog w Twoim katalogu domowym zajmuje najwięcej miejsca?
  9. Jak działa opcja "-R" w poleceniu chmod i wielu tym podobnych poleceniach?
  10. 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.
  11. Kiedy ostatnio prowadzący laboratorium logował się na students?
  12. Wylistuj wszystkie pliki w katalogu posortowane po dacie ostatniej modyfikacji.
  13. Co robi polecenie tac? Skąd nazwa?
  14. Jak przy pomocy polecenia kill unicestwić wszystkie swoje procesy na raz? (Uwaga: wcześniej zachowaj wszystkie swoje dane :) ).
  15. 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?
  16. Kto jest rodzicem procesu przeniesionego w tło?
  17. Zastąp najczęściej używane przez siebie długie polecenia krótkimi aliasami (np. stwórz aliasy dla ls -l, ps -ax, rm -rf).
  18. Zmodyfikuj odpowiednie pliki tak, aby przy każdym logowaniu wyświetlana była aktualna data i/lub godzina (hint: man date).
Do góry

Zajęcia 3, 17.10, Przetwarzanie potokowe

Materiały.

Tematy do omówienia.

  1. Dokończenie z poprzedniego laboratorium - sterowanie procesami i pliki konfiguracyjne BASHa.
  2. Operacje na plikach tekstowych. cat, head, tail, wc, sort, uniq, cut, xargs, tr, nl, exapnd, tee
    Przykłady:
  3. 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).

Ćwiczenia

  1. 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:
    1. Wypisać wszystkie różne nazwiska, posortowane alfabetycznie.
    2. Wypisać imiona i nazwiska wszystkich osób w kolejności alfabetycznej według nazwisk.
    3. Wypisać posortowane malejąco liczby punktów zdobyte za drugie zadanie.
    4. Znaleźć trzy najstarsze osoby i wypisać ich imię i nazwisko, przy czym najpierw wypisać kobiety a potem mężczyzn.
    5. Wypisać wszystkie różne miesiące (numerycznie) w których bohaterowie pliku mają urodziny.
    6. Wypisać liczbę różnych ocen za zadanie trzecie.
    7. Wypisać imiona i nazwiska osób posortowane malejąco według oceny uzyskanej za trzecie zadanie.
    8. Wypisać nazwiska osób z czterema najwyższymi wynikami za zadanie pierwsze.
    9. Zapisać wszystkie nazwiska do pliku n.txt, a PESEL-e do p.txt (jednym poleceniem).Rozwiązanie
  2. Wypisz nazwę i rozmiar największego pliku w katalogu domowym.
  3. Skonstruuj polecenie wypisujące 10 linię z pliku (chyba, że jest mniej niż 10 linii, wtedy wypisuje pierwszą).
  4. Skonstruuj polecenie wypisujące 10 linię z pliku (chyba, że jest mniej niż 10 linii, wtedy wypisuje ostatnią).
  5. Co zrobią polecenia "cat a > a" i "cat < a >> a" (Uwaga!)? Czym różni się "cat a > a" i "cat a | cat > a" ?
  6. 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).
  7. Wyznacz długość najdłuższego polecenia, które "ostatnio" uruchomiłaś/eś. (Hint: co jest w pliku ~/.bash_history?. Co dalej?)
  8. Mamy plik liczby.txt a w każdym jego wierszu liczbę. Czy sort liczby.txt dobrze je posortuje? Jak to poprawić?
  9. 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.
  10. Jak i po co działa tail -f?
Do góry

Zajęcia 4, 24.10, Skrypty I: instrukcje sterujące, zmienne

Materiały.

Tematy do omówienia.

  1. Skrypty. Skrypt to po prostu ciąg poleceń (takich samych jakie możemy wykonywać z linii poleceń) zapisanych w pliku. Dodatkowo można (a nawet należy!) w skrypcie umieszczać komentarze, wcięcia itp. tak by kod skryptu był jasny i przejrzysty. Język programowania BASH umożliwia (mniej więcej) użycie podobnych struktur sterujących jak inne języki imperatywne. Ogólną konstrukcję skryptu i składnię można poznać analizują przykładowy skrypt.
  2. Zmienne i parametry. Deklarowanie i odwołania do zmiennych. Zmienne środowiska $USER, $HOME. Parametry skryptu ($1, ...), zmienne specjalne $@, $*, $$, $?, ...(zobacz man bash sekcja Special Parameters).
  3. Przetwarzanie zawartości zmiennych. Użycie operatorów ${parameter#word}, ${parameter%word}, ${parameter/pattern/string} do wycinania z przodu, z tyłu oraz do podmiany kawałka tekstu, np. Zobacz sekcję Parameter Expansion na stronie podręcznika man bash.
  4. Przechwytywanie wyjścia programu do zmiennej. Operatory $( ) i ` `, np.
  5. Sterowanie. Pętle for, while, polecenia seq, read. Instrukcja wyboru case. Instrukcja warunkowa if, polecenie test oraz operatory [ ] i [[ ]] (zobacz help test oraz help [) wraz ze sprawdzaniem warunków logicznych, porównaniami i licznymi opcjami.
  6. Obliczenia. Wykonywanie obliczeń arytmetycznych za pomocą opertora $(( )).

Ćwiczenia.

  1. Ogólne:
    1. Napisz skrypt, który co 5 sekund wyświetla liczbę aktualnie zalogowanych użytkowników.
    2. Napisz skrypt, który wypisze rozmiar każdego katalogu, który został podany jako parametr (niektóre parametry mogą być śmieciami).
    3. Wypisać tekst Dzisiaj jest... po czym nastąpi bieżąca data.
    4. Wypisać 10 linii tekstu, przy czym zawartością i-tej linii ma być dokładnie i liter "A".
    5. Napisać skrypt, który sprawdza, czy dostał dokładnie 2 parametry i jeśli nie, to krzyczy na uzytkownika.
    6. a) Napisać skrypt, który zamieni spacje w nazwach plików na znaki podkreślenia.
      b) Napisać skrypt, który zmieni rozszerzenia plików .TXT na .txt.
      Obydwa skrypty powinny działać na wszystkich pasujących plikach w aktualnym katalogu.
    7. 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.
    8. Wypisać na ekran po jednej (np. pierwszej) linii z każdego pliku w bieżącym katalogu.
    9. Napisz skrypt, który wypisze swoje parametry posortowane alfabetycznie (możesz chcieć użyć polecenia tr).
    10. 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ę.
    11. 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.
  2. Ćwiczenia z plikiem osoby.txt
    1. Oblicz łączną liczbę punktów zdobytych za zadania 1,2,3 przez wszystkie osoby.
    2. Wypisz dane osoby, która zdobyła najwięcej punktów w sumie.
    3. 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.
    4. 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.
    5. Skrypt, który dane każdej osoby zapisze do innego pliku zatytułowanego nazwiskiem tej osoby.
  3. 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ć?
    1. echo $10
    2. cat $1
    3. if [ $a == $b ] then ....
    4. for linia in $(< plik); do echo kolejna linia to $linia; done
    5. echo Tekst (z kawalkiem w nawiasie)
Do góry

Zajęcia 5, 31.10, Skrypty II: funkcje

Tematy.

  1. Przetwarzanie plików tekstowych linia po linii. Służy do tego idiomatyczna konstrukcja:
    cat $nazwa_pliku | while read wiersz; do zrób_coś_z_$wiersz; done
    lub nawet lepiej
    (while read wiersz; do zrób_coś_z_$wiersz; done) < $nazwa_pliku
  2. Funkcje. Składnia jest następująca
    function pimpek() {
        echo "Dostałem $# argumentów"
        shift
        echo "Drugi argument to $1"
        x="abcd"
        return 0;
    }
    lub
    dimpek() {
        local x=123
        echo "Dimpek!"
        return 0;
    }

    Funkcje zachowują się tak jakby były osobnymi skryptami, tzn. zdefiniowanie funkcji pimpek jest mniej więcej równoważne napisaniu skryptu w pliku o nazwie pimpek. Wywołanie funkcji wygląda jak wywołanie zewnętrznego skryptu, np.
    pimpek a b 123 c

    Argumentów się nie deklaruje jak w C czy Pascalu. Dostęp do nich jest taki sam jak do argumentów skryptu, tzn. przez zmienne specjalne $1, $2 itd.

    Zmienne lokalny tworzy się za pomocą słowa kluczowego local. Wszystkie inne zmienne są globalne. W powyższych przykładach funkcja pimpek wykonuje przypisanie na globalną zmienną x, a funkcja dimpek na lokalną zmienną x.

    Operator shift przesuwa argumenty skryptu/funkcji w lewo o zadaną liczbę argumentów, np. po wykonaniu shift 2 zmienna $1 zawiera trzeci argument, a pierwsze dwa znikają i nie są już dostępne. Zobacz help shift.

    Wartość zwracana przez funkcję może być odczytana ze zmiennej $? zaraz po wykonaniu funkcji ale nie później.

    Uwaga: Inaczej niż np. w C wartością uważaną za prawdę jest 0, a wszystkie inne za fałsz. Wynika to stąd, że wartość zwracana ma oznaczać kod błędu, więc 0 oznacza brak błędów. Ma to znaczenie jeśli chcemy pisać np.
    if pimpek; then coś...; fi.

  3. Konstrukcje select i case. Polecenie select służy do tworzenia interaktywnego menu. Polecenie case pozwala dopasować dane słowo do kilku innych podobnie jak konstrukcja case ... of w Pascalu lub switch w C.
    Przykład:
    select x in abra kadabra abramowicz kadlub kukulka
    do
        case $x in
            (abr*)
                echo "raz";;
            (kada*|kuk*)
                echo "dwa";;
            kadlub)
                echo "trzy";
                break;;
        esac
    done

    Zauważmy, że w słowach dopasowywanych do $x mogą występować specjalne znaki jak np. "*". BASH w tym miejscu rozwija nazwy zmiennych, oblicza wyrażenia arytmetyczne, znak tyldy zamienia na ścieżkę do kataogu domowego itp. Zobacz sekcję Compound Commands w man bash.

Ćwiczenia.

  1. Napisz w składni BASHa funkcje sprawdzające czy:
    1. plik o nazwie przekazanej jako argument istnieje i ma co najmniej 1000 bajtów
    2. w bieżącym katalogu jest co najmniej 10 plików
    3. suma argumentów $1 i $2 przekracza wartość $3
    4. plik o nazwie $1 nie jest dowiązaniem symbolicznym
    5. katalog o nazwie $1 istnieje i mamy prawo tworzyć w nim pliki
    6. pierwszy arguement jest w formacie rrrr.mm.dd i reprezentuje datę wypadającą po 2007.10.01 (jeśli nie wiemy jak sprawdzić foramt, to można założyć, że przekazany arguemnt jest w takim formacie)
    7. podano co najmniej jeden parametr
    8. w pliku o nazwie $1, który w każdym wierszu zawiera jedno słowo, występują jakieś powtórzenia
  2. 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ć?
  3. Rozwinięta wypisywaczka plików i podkatalogów. Skrypt wypisuje zawartosc biezacego katalogu w postaci drzewka, tzn. przy przejsciu do podkatalogow wcięcie na kilka spacji. Dodajemy do niego obsługę różnorodnych opcji: Do tego podstawowa obsluga bledow przy wywolaniu np. nieznana opcja itp.
  4. Osoby mniej zaawansowane: ćwiczyć, ćwiczyć i jeszcze raz ćwiczyć. Skrypty z poprzednich ćwiczeń.
  5. Osoby bardziej zaawansowane: Napiszemy prościutki synchroniczny komunikator w BASHu. Patrz man mkfifo.

    Napisać skrypt (jeden), który uruchomimy w dwóch różnych terminalach. Chcemy by te dwa programy komunikowały się ze sobą za pomocą FIFO, na przemian odczytując i wysyłając do siebie komunikaty odczytane ze standardowego wejścia (tzn. od użytkownika).

    Trzeba sobie dobrze przemyśleć sprawę. Jak to zrobić, żeby nie doszło do zakleszczenia, tzn. żeby nie okazało się, że obydwa programy na raz czekają na komunikat od tego drugiego?

    Można użyć instrukcji case by zdecydować, że np. kończymy komunikację. Jak to zrobić, żeby ten drugi program też się zakończył w tym samym czasie?

Do góry

Zajęcia 6, 07.11, Wyrażenia regularne

Materiały.

Tematy.

  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ą (coś jak gramatyki, o których uczą na wstępie do informatyki ale trochę prostsze). 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. Program (e)grep. Wybiera wiersze pasujące do zadanego wzorca. Najwygodniej jest korzystać z polecenia egrep lub (co jest tym samym) grep -E, który akceptuje przyjaźniejszy dla użytkownika sposób wpisywania wzroców.
    Znaki specjalne: Przykłady:

    Uwaga: Trzeba zawsze pamiętać, by brać wyrażenia w ciapki ('wyrażenie'), gdyż BASH może nam porozwijać np. znaki *, a tego byśmy nie chcieli.

  3. Podstawy sed. Najprostsze (i najczęstsze) użycie edytora wierszowego sed:
    cat plik | sed 's/abc/xyz/g'
    Polecenie to powoduje wypisanie pliku plik z jednoczesną zamianą wszystkich wystąpień słowa abc na słowo xyz. Oczywiście zamiast słowa abc można użyć dowolnego wyrażenia regularnego, np.
    cat logins.txt | sed 's/^w[a-z]\([0-9]\+\)/\1/g'
    spowoduje wycięcie z loginów inicjałów, a zostawienie tylko numerów indeksów, tzn. np. wiersz
    wk654321 Wacław Kowalski
    zostanie zamieniony na
    654321 Wacław Kowalski.

Ćwiczenia.

  1. Napisz wyrażenia regularne rozpoznające następujące zbiory słów (abstrakcyjnie, a potem w składni grep-a):
    1. zawierających co najmniej dwie spośród liter a,b,c,
    2. nie zawierających żadnej cyfry,
    3. takich, że po każdym wystąpieniu litery a jest cyfra,
    4. PESEL-e osób urodzonych w latach 80-tych w lipcu,
    5. loginy na students osób o imieniu na literę pomiędzy D i W,
    6. zawierających parzystą liczbę liter a,
    7. ciągi cyfr w których każda następna cyfra jest większa od poprzedniej,
    8. zawierających fragment który składa się z co najmniej 5 cyfr pod rząd,
    9. komentarze w języku C lub Pascalu (Uwaga: nie uda się napisać wyrażenia dopasowującego zagnieżdżone komentarze.),
  2. Za pomocą polecenia
    find /home/mat/ -maxdepth 2 -type d -name '[a-z][a-z][0-9]*' | cut -f5 -d'/' | xargs finger -p | egrep '^Login' > studmat
    Wygeneruj plik studmat. Wykorzystując ten plik znajdź:
    1. Nazwiska studentów zaczynające się na "A",
    2. Nazwiska studentów dłuższe niż 12 znaków i to takie, które nie są podwójne (bez myślnika),
    3. Największy numer indeksu mniejszy niż 200000 i jego posiadacza,
    4. Liczbę osób mających imię zaczynające się na literę między D i G,
    5. Listę imion osób, których nazwiska zaczynają się na R,
    6. Nazwiska osób, których numery indeksu są podzielne przez 5,
    7. Napisz skrypt, który dostając nazwisko znajduje nazwisko studenta poprzedniego w porządku alfabetycznym,
    8. Osoby których imię zaczyna się na tę samą literę co nazwisko (wskazówka: wsteczne dopasowania),
  3. 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),
  4. 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).
Do góry

Zajęcia 7, 14.11, Różne różności

Materiały.

Tematy.

  1. Polecenie shift - przetwarzanie argumentów skryptu. Szablonowa konstrukcja do zapamiętania i używania:
    while (($# != 0))
    do
        case $1 in
            -h | --help)
                # wypisz instrukcje obslugi skryptu
                echo "$usage"
                ;;
            -x)
                # ustaw jakies parametry zgodnie ze znaczeniem przelacznika -x
                ...
                ;;
            -f | --file=*)
                # tutaj mamy parametr z argumentem
                if [[ "$1" == "-f" ]]
                then
                    shift
                    argument="$1"
                else
                    argument=${1#--file=}
                fi
                ...
                ;;
            *)
                # tu jakas domyslna akcja jesli dostalismy nieobslugiwany parametr
                ...
        esac
        shift
    done
  2. Polecenie source - ładowniae plików konfiguracyjnych. Najprostszym sposobem odczytania pliku konfiguracyjnego w formacie klucz=wartosc jest użycie polecenia source _plik_, które powoduje wykonanie poleceń zwartych w pliku _plik_ w aktualnie działającej powłoce. Skrótem polecenia source jest też kropka (. _plik_), np.
    source conf.txt
    ma takie samo działanie jak
    . conf.txt
  3. Strumieniowy edytor wierszowy sed - przetwarzania szablonów stron WWW.
    Przykłady:
  4. Polecenie set - ustawia parametry skryptu, np.
    set a b c d e
    powoduje, że
    $1 == a, $2 == b, $3 == c itd.
  5. rsync - synchronizacja różnych kopii tego samego
  6. convert, display, identify, exiv2 - przetwarzanie zdjęć

Ćwiczenia.

  1. Stworzyć najprostszą stronę WWW lokalnie na komputerze i wysłać ją za pomocą rsync na students.
    1. Stworzyć katalog ~/tmp/public_html,
    2. Skopiować do niego pliki gallery-template.xhtml oraz photo-template.xhtml,
    3. Zmienić nazwę pliku gallery-template.xhtml na index.xhtml,
    4. Ustawić odpowiednio uprawnienia do katalogu ~tmp/public_html,
      chmod -R u+rwX,g+rX,o+rX ~/tmp/public_html
    5. Wysłać zawartość ~/tmp/public_html na serwer students,
      rsync -rp ~/tmp/public_html ab123456@students.mimuw.edu.pl:

      Uwaga: jeśli ktoś ma już na students założoną stronę powinien odpowiednio zmodyfikować katalogi powyżej tak by nie stracić tego co już ma, np.
      rsync -rp ~/tmp/public_html ab123456@students.mimuw.edu.pl:public_html/sosik

      Uwaga: rsync zmienia swoje działanie w zależności czy zakończymy ścieżkę slaszem ("/") czy nie. Przetestować.

      Uwaga: Być może będzie potrzeba zmienić też uprawnienia do katalogu domowego na students:
      ssh ab123456@students
      ...
      chmod go+x ~

    6. Za pomocą przeglądarki internetowej obejrzeć zawartość swojej strony, tj.
      http://students.mimuw.edu.pl/~ab123456/index.xhtml
  2. Ściągnąć zawartość katalogu zdjecia-przyklad. Jest tam 9 zdjęć i plik z opisami. Posłużyć się programem wget.

    Uwaga: to około 15MB - jeśli komuś brakuje miejsce może ściągnąć do katalogu /tmp.

    1. Odczytać za pomocą exiv2 datę zrobienia każdego ze zdjęć. Napisać krótkie skrypt, który dla każdego zdjęcia wypisze nazwę pliku zdjęcia, datę jego wykonania oraz jego rozdzielczość,
    2. Pobracać zdjęcia tak by były pionowo (tylko dwa tego wymagają). Użyć polecenia
      convert -rotate,
    3. Zmniejszyć wszystkie zdjęcia do rozmiaru 1024x1024. Wygenerować też minitury rozmiaru 128x128.
  3. Napisać skrypt, który wygeneruje 9 stron ze zdjęciami. Trzeba zrobić 9 kopii pliku photo-template.xhtml i w każdym wypełnić odpowiednie pola odpowiednimi wartościami. Wykorzystać plik descriptions.txt zawierający opisu zdjęć. (jak przetwarzać szablony? patrz następne ćwiczenie)
  4. Napisać skrypt, który stworzy stronę galerii z 4 kolumnami i 3 wierszami. Zdjęcia powinny być posortowane rosnąco według daty zrobienia.

    Do przetwarzania szablonu proponuję skorzystać z konstrukcji:
    komorka=$(sed -n '/POCZATEK_KOMORKI_TABELI/,/KONIEC_KOMORKI_TABELI/p' gallery-template.xhtml)
    komorka="${komorka//TU_WSTAWIC_LINK_DO_MINIATURY/$miniatura}"
    komorka="${komorka//TU_WSTAWIC_OPIS_ZDJECIA/$opis}"
    komorka="${komorka//TU_WSTAWIC_LINK_DO_STRONY_ZDJECIA/$strona}"

    Przydatne może być też polecenie
    exiv2 mv -T IMG_12345.jpg
    które ustawia datę ostatniej modyfikacji pliku zdjęcia na datę zrobienia zdjęcia.

    Innym przydatnym poleceniem może się okazać
    date +%s -d '11/10/2006 10:45'
    które wyświetla ilość sekund jakie minęły od tzw. epoki (tj. 1 stycznia 1970 roku godzina 00:00:00) do podanej daty (tutaj jest to 10 listopada 2006 godzina 10:45).

Do góry

Zajęcia 8, 21.11, fork()

Materiały.

Uwaga: (dla piszących w języku C) należy załączać pliki nagłówkowe unistd.h, sys/types.h, sys/wait.h

Tematy.

  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.

Ćwiczenia.

  1. Uzupełnij przykładowy program (fork.pas/fork.c) o obsługę błędu przy wywołaniu fork().
  2. Co pokaże polecenie ps, jeżeli dziecko się zakończy, a rodzic działa w najlepsze i nie wykonuje wait() na dziecku?
  3. Co to jest proces zombie?
  4. A jeżeli dziecko działa a rodzic się zakończy? Kto staje się nowym rodzicem sieroty?
  5. 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).
  6. Napisz program, który stworzy pełne drzewko binarne procesów o wysokości N. Reszta polecenia jak wyżej.
  7. Sprawdź eksperymentalnie, jakie jest ograniczenie na liczbę procesów na jednego użytkownika na komputerach na wydziale.
  8. 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).
Do góry

Zajęcia 9, 28.11, pipe() - fork() - dup() - exec()

Materiały.

Tematy.

  1. Deskryptory plików. W systemie jest globalna (tylko jedna) tablica otwartych plików. Każdy proces ma swoją własną tablicę deskryptorów otwartych plików. Indeks w tej tablicy nazywamy deksryptorem. Każdy jej element odnosi się do pewnego elementu systemowej tablicy otwartych plików, więc można mieć kilka deskryptorów wskazujących na ten sam plik. Deskryptory 0, 1 i 2 są zarezerwowane dla standardowego wejście, wyjście i wyjścia błędów ale można je zamknąć i ustawić na inne pliki. Polecenie fork() kopiuje tablicę deskryptorów, więc w procesie potomnym możemy pisać do i czytać z plików otwartych przez proces macierzysty. W ten sposób można zrealizować komunikację między procesem macierzystym i potomnym.
  2. pipe(). Tworzy parę łącz nienazwanych - jedno do pisania, drugie do czytania. Łącze to zwykła kolejka FIFO.
  3. dup() i dup2(). Powielają deskryptor. Druga forma pozwala wskazać, indeks w tablicy deskryptorów, który chcemy podmienić (zostanie on zamknięty).
  4. exec(). Uruchamia inny proces, zastępując aktualnie działający. Tablice deskryptorów pozostają niezmienione.

    execl(nazwa_progr, param0, param1, ...., NULL)

    Funkcja exec() ma różne inne formy, różniące się sposobem przekazania parametrów do nowego procesu. Zobacz man 3 exec.

  5. Czytanie i pisanie. Praca z deskryptorami plików może być uciążliwa jeśli zamierzamy wymieniać komunikaty tekstowe. Do pisania i czytania służą funkcje write() oraz read(), które nie pozwalają na parsowanie i formatowanie tekstu w stylu scanf() i printf(). Można temu zaradzić tworząc strumień na deskryptorze. Służy do tego funkcja fdopen(). W Pascalu używamy funkcji AssignPipe z unitu Unix, która od razu przydziela deskryptorowi plik typu text.

    Uwaga: korzystając z funkcji fprintf() należy pamiętać o wywołaniu fflush(), żeby zapisane dane rzeczywiście zostały wysłane.

Ćwiczenia.

  1. Przenalizuj program przykładowy (może się przydać dobry rysunek).
  2. Napisz program, który otwiera łącze do którego sam pisze a następnie z niego czyta. Używaj funkcji read, write.
  3. 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.
  4. Czytelnicy i pisarze. Mamy jednego pisarza, który wypisuje co jakiś czas komunkaty na standardowe wyjście. Ponadto mamy kilku czytelników, którzy odczytują ze standardowego wejścia komunikaty od pisarza i wypisują je na ekran. Czytelnik poprzedza każdy komunikat swoim numerem tak by było widać kto go odczytał.
  5. 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.
  6. 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?
  7. Zadania przykładowe:
Do góry

Zajęcia 10, 05.12, Procesy i sygnały

Materiały.

Tematy.

  1. Obsługa sygnałów.
  2. Maska sygnałów.
  3. Skrypty i obsługa sygnałów. Wbudowane polecenie BASHa trap.

Ćwiczenia.

  1. 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? (rozwiązanie)
  2. Napisz program, który wczytuje z klawiatury nazwy dwóch plików oraz nazwę pewnego programu i uruchamia ten program podając mu na standardowe wejście zawartość pierwszego pliku i zapisując output tamtego programu do drugiego pliku (taki interpreterek poleceń).
  3. Napisz "linię" programów ustalonej długości, z których każdy ma łącze do pisania do kolejnego programu, zaś ostatni wypisuje na ekran. Pierwszy program wczytuje coś z kalwiatury, podaje drugiemu, on trzeciemu, ..., ostatni wypisuje to na ekran. Zadbaj o to, żeby po każdym forkowaniu zamykać niepotrzebne deskryptory, tzn. żeby każdy proces w linii miał otwarte TYLKO dwa: jeden do czytania z poprzedniego procesu i jeden do pisania do następnego (tak naprawdę ten szczegół to najważniejsza część tego ćwiczenia).
  4. To samo, ale dla "kręgu" procesów, tzn. ostatni ma mieć wyjście do pisania do pierwszego - jak to połączenie zrobić? (Oczywiście raz wpuszczony komunikat do takiego pierścienia będzie krążył w nieskończoność, można np. ograniczyć: każdy program, który otrzymał komunikat już 5 razy przechwytuje go i nie podaje dalej).
  5. Napisz program, który przechwytuje sygnał SIGUSR1 i za każdym razem gdy dostanie ten sygnał wypisuje na ekran komunikat "Hello!" - poza tym może nic innego nie robić.
  6. Spróbuj zablokować wszystkie możliwe sygnały. Obsłuż błędy tak, by było widać co się dzieje. Czy można zablokować sygnał KILL, a STOP?
  7. Spróbuje zainstalować własną procedurę obsługi przerwania KILL. Co się stało?
Do góry

Zajęcia 11, 12.12, IP, DNS, telnet

Materiały.

Tematy.

  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. 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.
  5. RFC. Skąd wiadomo, jaki jest protokół dla danej usługi? Celem dokumentów RFC jest m.in. standaryzacja różnorakich protokołów. Aktualnie RFC 3700 zawiera listę bieżących numerów RFC dla poszczególnych usług.

Ćwiczenia.

  1. Podaj zakres adresów należących do podsieci opisanej jako 213.130.23.0/8.
  2. 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?
  3. Który komputer na wydziale ma adres 10.1.1.143 ?
  4. Znajdź adresy IP poszczególnych komputerów wydziałowych: students, duch. A zodiac?
  5. Znajdź w bazie whois informacje o domenach: mimuw.edu.pl, gazeta.pl, edu.pl, pkp.pl itp.
  6. 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.
  7. Znajdź dostawcę internetu do którego puli adresów przynależy adres 80.252.0.145. A 80.251.0.145?
  8. Dowiedz się o serwery nazw domeny mimuw.edu.pl.
  9. Znajdź numer IP komputera students widzianego spoza sieci wydziału?. Odpytaj poleceniem host odpowiedni serwer DNS (który?).
  10. (!) Wyślij do prowadzącego (na adres skola }{ mimuw.edu.pl) maila przy użyciu wyłącznie programu telnet. W tym celu zapoznaj sie ze skróconym opisem protokołu SMTP. Z jakim serwerem należy się połączyć aby wysyłać pocztę? Użyj fikcyjnego nadawcy maila (np. kubus.puchatek@o2.pl)
  11. (!) Ściągnij jakąś stronę przez HTTP używając tylko telnet-u. Szybkie wprowadzenie do protokołu HTTP,
  12. Nie całkiem serio: RFC 2324, RFC 1882, RFC 2550, RFC 3092, RFC 1437.
Do góry

Zajęcia 12, 19.12, Poczta

Materiały.

Tematy.

  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.,
  2. 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,
  3. Organizacja poczty. Przechowywanie: mailboxy i maildiry, różnice między nimi. Mailboxy i maildiry nadają się do ręcznego przeglądania, np. grep-em,
  4. 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 jest 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). Wykonywana jest akacja związana z pierwszą dopasowana regułą, a potem przetwarzania 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 po prostu w 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:.*skola.*mimuw.*
    /dev/null

    wrzuci wszystkie maile od prowadzącego zajęcia tam, gdzie ich miejsce. Inne:
    :0 c
    * From:.*skola.*
    | grep Subject >> ~/from-skola.txt

    zapisze wszystkie tematy maili otrzymanych od skola 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 w formacie mailbox,
    nazwa_katalogu/ - zapisuje maila do podanego katalogu w formacie maildir (ważny jest ten slash (/) na końcu).
    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.

    Przykład: Poręczna reguła, która wyrzuca duplikaty (przydatne gdy ktoś umieści nas kilka razy na liście adresatów).
    :0 Wh: msgid.lock
    | formail -D 1024 $HOME/Mail/msgid.cache

Ćwiczenia.

Zaległe:
  1. (!) Wyślij do prowadzącego (na adres skola }{ mimuw.edu.pl) maila przy użyciu wyłącznie programu telnet. W tym celu zapoznaj sie ze skróconym opisem protokołu SMTP. Z jakim serwerem należy się połączyć aby wysyłać pocztę? Użyj fikcyjnego nadawcy maila (np. kubus.puchatek@o2.pl),
  2. (!) Ściągnij jakąś stronę przez HTTP używając tylko telnet-u. Szybkie wprowadzenie do protokołu HTTP.
Nowe:
  1. Obejrzyj swój maildir na students: katalog ~/Mail,
  2. Przejrzyj jakiś plik z mailem ze swojego maildira. Zwróć uwagę na nagłówek i zinterpretuj jak najwięcej pól.
  3. 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)
  4. (!) Wyślij do prowadzącego maila zawierającego kolejno wszystkie liczby naturalne od 1 do 100.
  5. Weź plik z dowolnym mailem i poobrabiaj go programem formail. W szczególności:
  6. Uaktywnij na swoim koncie na students procmaila i napisz następujące reguły. Na wszelki wypadek pamiętaj o opcji c.
  7. Zobacz w man procmailex schemat automatycznej odpowiadaczki. Co oznaczają opcje -oi -t przy uruchomieniu sendmaila?
  8. Załóżmy, że nie chcemy odpowiadać wszystkim, ale tylko na maile pochodzące z domeny mimuw. Jak to zrobić?
  9. Zajrzyj do /etc/procmailrc - globalnego pliku konfiguracyjnego procmaila.
  10. Napisz filtr, który wszystkie maile większe niż 100kB wrzuca do osobnego pliku.
  11. 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.
Do góry

Zajęcia 13, 09.01, Szyfrowanie danych

Materiały.

  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, czyli Gnu Privacy Guard). 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)
    Ćwiczenia:
  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.
  4. Po co funkcje skrótu? Podpisywanie dokumentów. Uwaga! MD5 jakiś czas temu zostało złamane i możliwe jest podrabianie wiadomości. SHA na razie jest bezpieczne.
  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)
    Ćwiczenie:
    1. wygeneruj sobie parę kluczy publiczny-prywatny: ssh-keygen -t rsa, pliki z kluczami powstają w katalogu ~/.ssh
    2. pamiętaj, że plik z kluczem prywatnym nie może być nikomu udostępniony
    3. skopiuj klucz publiczny (*.pub) do pliku ~/.ssh/authorized_keys2 na maszynie na którą będziesz się logował (np. students)
    4. Spróbuj teraz wykonać ssh students lub scp. Powinno zadziałać bez hasła!
    5. 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 (używane np. przez USOSWeb, banki, GMail i wszędzie tam gdzie potrzebne jest wiarygodne potwoerdzenie tożsamości).
  7. Inne metody kryptografii:
Do góry

Zajęcia 14, 16.01, Sieć: konfiguracja, trasowanie, tcpdump

Materiały.

Zajęcia te będą wymagały użycia narzędzia do wirtualizacji VirtualBox. Oprogramowanie to potrafi zasymulować komputer. Sytuacja będzie wyglądała tak, jakbyśmy podłączyli przez sieć swój komputer do komputera w laboratorium.

Na students w katalogu /home/tmp/ znajdują się pliki mini.vdi (obraz ttyLinux) oraz u-lite.vdi (obraz Ubuntu Lite). Należy ich użyć do stowrzenia w VirtualBox kilku wirtualnych maszyn.

Instrukcja jak skonfigurować VirtualBox.

Tematy.

  1. Konfiguracja. Katalog /etc/init.d, skrypty startowe, /etc/rc.d, /etc/sysconfig/net.... Interfejsy lo i eth0. Polecenie ifconfig w pełnej okazałości. Konfigurowanie swojej sieci, np.:
    ifconfig eth0 192.168.0.1 up
    Inne parametry: netmask, broadcast.
  2. Trasowanie. Polecenia ping, traceroute służą do diagnostyki połaczenia ze zdalnym komputerem. Interpretacja wyników. Ustalanie bram i tras dla pakietów wychodzących z naszego komputera: route. Ustalanie serwerów DNS z których chcemy korzystać: /etc/resolv.conf.
  3. tcpdump. Przechwytywanie pakietów. Tcpdump wypisuje wszystkie dane z nagłówka pakietu a jeśli chcemy to i cały pakiet. Podstawy składni: mamy opcje (jak wypisywać) i zapytania (jakie pakiety przechwytywać). W zapytaniach warunki logiczna z and, or i not.
  4. Budowa pakietu, protokoły. Hierarchia IP-->TCP/UDP/ICMP-->HTTP/SSH/... (ISO/OSI). Interpretacja niektórych pól z nagłówków wypisywanych przez tcpdump.

Ćwiczenia.

  1. (Na students) Przetestuj ping do różnych komputerów: na wydziale, w Polsce, w Australii.
  2. (W domu) Którędy podróżuje pakiet do www.onet.pl? Do www.google.com? Gdzie to jest?
  3. (W domu) Przez jaki komputer wychodzą pakiety z sieci wydziałowej na świat?
  4. Stwórz w VirtualBoxie 3 maszyny. Skonfiguruj z nich sieć przy pomocy ifconfig. Sprawdź, że działa między tymi maszynami ping, ssh itp.
  5. Skonfiguruj te 3 maszyny jak poprzednio ale tak, by zachować tę konfigurację po restarcie systemu.
  6. W konfiguracji VirtualBox dodaj jednej z maszyn drugą kartę sieciową w trybie NAT. Skonfiguruj teraz system na ten maszynie tak, by autmatycznie pobierał adres IP dla tej karty.
  7. Dla dwóch połączonych w podsieć maszyn w VirtualBox, sprawdź tcpdumpem jak wyglądają pakiety między nimi przesyłane.
  8. Odfiltruj tylko pakiety protokołu ping i pinguj jedną z tych maszyn.
  9. Sprawdź działanie tcpdumpa na interfejsie lokalnym, np. logując się do siebie przez ssh.
  10. Odfiltruj tylko pakiety przychodzące z jednej wybranej maszyny.
  11. Odfiltruj tylko pakiety przyznaczone do wybranej maszyny.
  12. (!) Zaobserwuj, np. na przykładzie połaczenia ssh, cykl życiowy połączenia tcp (SYN, SYN+ACK, ..., FIN).
  13. Obejrzyj całą zawatrośc danych przesyłanych np. w interakcji przez HTTP.
  14. Do domu: Oglądaj i filtruj na milion sposobów to co się dzieje w Twojej sieci (np. gdy oglądasz filmik na YouTube, albo gdy sciągasz pocztę, albo słuchasz radia internetowego (UDP), albo...).
Do góry

Zajęcia 15, 23.01, Omówienie zadań, reklamacje, zażalenia...

Jak w tytule.

Zadanie.

Jakby się komuś nudziło może spróbować skonstruować przy pomocy VirtualBoxa sieć złożoną 4 komputerów tworzących 3 sieci: dwie routowalne (adresy IP dowolne, np. 1.2.3.4) i jedną nieroutowalną (adresy IP z jednej z klas: klasa A 10.x.x.x, klasa B 172.16.x.x lub klasa C 192.168.x.x). Jeden z komputerów będzie routerem między tymi trzema sieciami, a w każdej sieci będzie dokładnie jeden komputer (można zrobić więcej ale odpalanie takiej ilości wirtualnych maszyn na jednym komputerze może się źle skończyć). Na routerze należy ustawić odpowiednio tablicę routowania (polecenie route) tak by dwie siecie routowalne się widziały. Na routerze trzeba będzie wykonać polecenie:
echo 1 >> /proc/sys/net/ipv4/ip_forward
by włączyć w jądrze systemu funkcję przekazywania pakietów IP. Należy też ustawić NAT (iptables), tak by komputer z klasy nieroutowalnej mógł komunikować się z resztą sieci.

Uwaga: Starałem się sam zrobić to zadanie ale coś nie chciało działać. O ile routing (/sbin/route) dało się poprawnie ustawić, o tyle filtorwania pakietów (/sbin/iptables) nie bardzo.

Materiały.

Do góry

Valid XHTML 1.1