Wstęp do systemów operacyjnych i sieci komputerowych - LAB


Technikalia

Termin: czwartek, 10.15-12.00, LAB6, Prowadzący: Michał Adamaszek, Kontakt: aszek@mimuw.edu.pl

Zasady zaliczania:

Są trzy zadania, pierwsze większe i dwa pozostałe mniejsze.

Różne materiały:


Zadania egzaminopodobne:

Co to jest i z czym to się je:

Zajęcia 1, 6.10

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, 13.10

Materiały. 1. Podstawy II. Użytkownicy, grupy, UID (groups, finger, w, last, passwd, plik /etc/passwd). System plików: prawa dostępu (rwx), dowiązania twarde i symboliczne (ls, chmod, chown, chgrp, ln, pwd). Obsługa plików: mv, cp, rm, touch, mkdir, cat. Procesy: tworzenie i zabijanie, środowisko, PID procesu (ps, kill, top). Uruchamianie procesów w tle. Inne: echo, date, uptime, du.
2. Ćwiczenia.
  1. Jak długi może być łańcuszek dowiązań symbolicznych? Po co takie ograniczenie?
  2. Sprawdzić do jakich grup się należy. Do jakich grup należy prowadzący laboratorium?
  3. 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ć.
  4. Kiedy był ostatnio zresetowany komputer zodiac?
  5. Sprawdzić, że polecenia można łączyć średnikiem, np. "mv x y/z; cd /tmp"
  6. Jak działa chown i podobne w odniesieniu do dowiązań symbolicznych?
  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. Wylistuj wszystkie pliki w katalogu posortowane po dacie ostatniej modyfikacji.
  10. Jaki jest Twój UserID?
  11. Jak jednym ruchem zmieniać właścicieli, grupy lub kopiować całe katalogi wraz z podkatalogami?
  12. 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.
  13. Kiedy ostatnio prowadzący laboratorium logował się na zodiac?
  14. Wyświetlić wszystkie działające w systemie procesy i sprawdzić jaki proces jest najdalej w drzewie od procesu mającego PID 1.
  15. Jak przy pomocy polecenia kill unicestwić wszystkie swoje procesy na raz? (Uwaga: wcześniej zachowaj wszystkie swoje dane :) ).
  16. Którego kolejnego dnia roku wypada Dzień Dziecka? A ile sekund od północy 1 stycznia 1970 upłynęło dokładnie dobę temu? (Hint: man date) Wypisać bieżącą datę w postaci "dzień_tygodnia hh:mm:ss".
  17. echo kończy wypisywany ciąg znakiem nowej linii. Jak tego uniknąć?
  18. Ile MB pamięci operacyjnej ma komputer przy którym siedzisz?
  19. Ciekawostki: do czego służy polecenie yes ? A polecenie tac (tego drugiego można się domyślić bez sprawdzania!).

Zajęcia 3, 20.10

Materiały. 1. 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: <, >, >>. Przetwarzanie w potokach (pipes), operator tworzenia potoku | i jego użycie.
2. Więcej poleceń. Niektóre polecenia, szczególnie do obróbki danych tekstowych, są jakby stworzone do użycia z operatorem | w potokach. Pozwala to obrabiać różnorakie dane. Podstawowe przykłady: sort, uniq, cut, wc, head, tail, tee.
3. Niektóre urządzenia specjalne. Często warto mieć pod ręką specjalne urządzenia, które wyglądają jak pliki (w szczególności można w stosunku z/do nich przekierowywać) 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.
4. Przykłady. Rozważmy następujące polecenia:
who | cut -f1 -d" " | sort | uniq | wc -l
Podaje ono liczbę aktualnie zalogowanych użytkowników. Najlepiej przeanalizować go uruchamiając coraz dłuższe jego początkowe fragmenty.
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).
5. Ć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:
  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", "cat a > a" i "cat < a >> a" ? (Uwaga!)
  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).

Zajęcia 4, 27.10

Materiały. 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.
1. Zmienne i parametry. Deklarowanie i odwołania do zmiennych. Zmienne środowiska $USER, $HOME. Parametry skryptu ($1, ...), zmienne specjalne ($*, $# - lista i liczba parametrów).
2. Wywołania. Wykonywanie poleceń i pobieranie ich wyjścia (w odwrotnych apostrofach lub $()). Wywołanie kopii interpretatora (pod-polecenie w nawiasach).
3. Sterowanie. Pętle for, polecenie seq. Instrukcja wyboru case. Instrukcja warunkowa if i polecenie test, [ ] wraz ze sprawdzaniem warunków logicznych, porównaniami i licznymi opcjami. Polecenie sleep.
4. Obliczenia. Wykonywanie obliczeń arytmetycznych, konstrukcja $[].
5. Procedury. Użycie procedur w skryptach. Przekazywanie parametrów do procedur.
Ćwiczenia
  1. Wypisać liczbę parametrów z jakimi wywołano skrypt.
  2. Jak wypisać 10-ty parametr skryptu? Innymi słowy, jak zadziała zmienna $10? Co z tym począć?
  3. Napisz skrypt, który wypisze rozmiar każdego katalogu, który został podany jako parametr.
  4. Wypisać tekst Dzisiaj jest... po czym nastąpi bieżąca data.
  5. Wypisać 10 linii tekstu, przy czym zawartością i-tej linii ma być dokładnie i liter "A".
  6. Wypisać listę plików w bieżącym katalogu, posortowanych alfabetycznie, przed każdą nazwą stawiając kolejny numer.
  7. Napisać skrypt, który sprawdza, czy dostał dokładnie 2 parametry i jeśli nie, to krzyczy na uzytkownika.
  8. 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.
  9. Napisać skrypt uruchamiający kolejno wszystkie wykonywalne pliki w podanym jako parametr katalogu, i to tak żeby nic nie wypisały na ekran. (BTW: co się stanie po podaniu mu jako parametr katalogu w którym sam się znajduje? Czy można temu zapobiec?)
  10. Wypisać na ekran po jednej (np. pierwszej) linii z każdego pliku w bieżącym katalogu.
  11. Napisać wrapper na edytor tekstu: skrypt, który bierze nazwę pliku jako parametr, sprawdza czy plik istnieje i czy mamy uprawnienia do zapisu (wpp odpowiedni komunikat), tworzy kopię zapasową, uruchamia Twój ulubiony edytor na tym pliku, po zakończeniu usuwa kopię zapasową.
  12. Napisz skrypt, który co 5 sekund wyświetla liczbę aktualnie zalogowanych użytkowników.
  13. Napisz skrypt, który wyświetla nazwy wszystkich podkatalogów w katalogu bieżącym, a przy każdym katalogu dodatkowo listę plików w nim zawartych
  14. (Rozszerzenie poprzedniego). Skrypt, który wyświetla pełne drzewko katalogów bieżącego katalogu, z wcięciami przy przechodzeniu do podkatalogów. Może się przydać rekurencyjne wywołanie procedury.
  15. Napisz skrypt, który wypisze swoje parametry posortowane alfabetycznie (możesz chcieć użyć polecenia tr).
  16. 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ę.
  17. Dotyczy pliku osoby.txt z poprzednich zajęć: napisz skrypt, który obliczy łączną liczbę punktów zdobytych za zadania 1,2,3 przez wszystkie osoby. Napisz skrypt, który wypisze dane osoby, która zdobyła najwięcej punktów w sumie.
  18. 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.

Zajęcia 5, 03.11

Skrypty II. shift - przesuwanie parametrow.
Cwiczenia.

Zajęcia 6, 10.11

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: 4. find - wyszukiwanie plików. Znajduje pliki spełniające zadane warunki: nazwa, typ pliku, określone uprawnienia, rozmiar, właściciel, data utworzenia, modyfikacji etc. Akcje: wypisanie (sformatowanej) nazwy, wykonanie polecenia, listowanie pliku. Przykłady: 5. Ćwiczenia
  1. Napisz wyrażenia regularne rozpoznające następujące zbiory słów (abstrakcyjnie lub w składni grep-a):
  2. Zaopatrzywszy się w plik /etc/passwd z zodiac-a znajdź:
  3. Napisz skrypt, który dostając nazwisko znajduje nazwisko studenta poprzedniego w porządku alfabetycznym.
  4. Stwórz procedurę w bashu, sprawdzającą czy zawartość podanej zmiennej jest liczbą w systemie dziesiętnym (można takiej podprocedury z grubsza używać do sprawdzania typów).
  5. Ze wszystkich plików w bieżącym katalogu wyodrębnij linie w których znajduje się jakaś liczba (oddzielnie, otoczona białymi znakami) (i tylko je wypisz, bez dodatkowych napisów takich jak nazwa pliku).

Zajęcia 7, 17.11

Skrypty i grep. Większe ćwiczenie skryptowe. Skrypt, który bada podobieństwo kodów źródłowych programów (można dla swojego ulubionego języka programowania). Skrypt dostaje jako parametry nazwy dwóch plików ze źródłami programów i stosując wymyślone przez rozwiązującego sposoby bada ich stopień podobieństwa, wypisując stosowne informacje. Oto sugestie kryteriów podobieństwa: Możliwe rozszerzenia:

Zajęcia 8, 24.11

Materiały Ważne uwagi dla piszących w języku Pascal. Kompilatorem Pascala pod Linuxem jest FPC, uruchamiany poleceniem ppc386 plik.pas. Do pisania programów używających wywołań systemowych należy dołączyć moduł linux (uses linux;). To działa tylko w wersji 1.* kompilatora, czyli tej na wydziale. W najnowszej wersji 2.*, dostępnej czy to w dystrybucjach, czy ze strony, nastąpiła przebudowa systemu modułów i tego modułu w zasadzie nie ma. Są dwa wyjścia dla użytkowników tej wersji, przesiąść się na nowy moduł BaseUnix (co wiąże się ze zmianą nazw wielu funkcji) lub używać modułu oldlinux, pozostawionego dla kompatybilności ze starą wersją. Na zajęciach będziemy posługiwać się składnią starego modułu, bo taki kompilator jest na wydziale oraz dlatego, że nazwy funkcji bardziej odpowiadają tym z C.
Mniej ważne 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ę: (Delay(milisecs) / sleep(secs)) (w Pascalu / C), wymaga (modułu Crt / 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 / LinuxError odpowiednio dla C/Pascal).
6. Ćwiczenia.

Zajęcia 9, 01.12

Materiały Materiały dla Pascalowców: 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. Deskryptory. Tablica deskryptorów, standardowe deskryptory 0 (stdin) i 1 (stdout). Można tworzyć nowe pary deskryptorów funkcją pipe - jeden do pisania, drugi do czytania. Pisanie i czytanie z nich przez funkcje write, read, jak ze standardowych (można też nałożyc na nie strukturę FILE i pisać przez scanf, printf itp. Deskryptor (dowolny) zamykamy close.
2. exec*() uruchamia nowy zadany program w miejsce naszego, ale z zachowaniem dotychczasowego PID, rodzica i deskryptorów. Pamięć starego programu jest natomiast likwidowana.
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.

Zajęcia 10, 08.12

Materiały Garść ostatnich informacji o programowaniu.
1. Linia poleceń. Program może dobrać się do parametrów linii poleceń. W C mamy zmienne int argc - liczba parametrów i char **argv - tablica parametrów, przekazywane funkcji main (int main(int argc, char **argv) {...}). Są one typu ciąg znaków (char *). Pożyteczne funkcje do konwersji: atoi, itoa, ....
2. Wartość zwracana. Program może zwracać wartość (przez return). W bashu można się do niej dobrać przez zmienną $?.
3. Pliki Makefile. Program make służy do wykonywania sekwencji poleceń opisanych w pliku konfiguracyjnym makefile. Użycie: głównie do kompilacji programów składających się z wielu plików. Należy podać cel, cele od których zależy i polecenia które do niego prowadzą. Dodatkowo: zmienne, zmienne specjalne, wzorce...
4. Ćwiczenia

Zajęcia 11, 15.12

Materiały 1. Adresowanie. Struktura adresu IPv4. Polecenie ifconfig, klasy adresowe, maska podsieci.
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. ping. Polecenia ping, traceroute itp. służą do badania przepływu pakietów do hosta.
4. Organizacje. 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.
5. 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.
  1. Znajdź adresy IP poszczególnych komputerów wydziałowych: rainbow, zodiac. A co ze students?
  2. Podaj zakres adresów należących do podsieci opisanej jako 213.130.23.0/8.
  3. 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?
  4. Który komputer na wydziale ma adres 10.1.1.143 ?
  5. Jak działa ta strona: www.whatismyip.com ? Czego dowiedzą się z niej osoby pracujące na różnych komputerach na wydziale? Wyjaśnij, co się dzieje.
  6. Znajdź w bazie whois informacje o domenach: mimuw.edu.pl, edu.pl, pkp.pl itp.
  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. Jak znaleźć numer IP komputera rainbow widzianego spoza sieci wydziału? Odpytaj poleceniem host odpowiedni serwer DNS.
  10. Wróć do ćwiczenia 5 i dowiedz się o nazwę komputera którego IP podała strona.
  11. Skorzystaj z bazy whois przy pomocy programu telnet. Adres serwera: whois.ripe.net, usługa whois (jaki jest jej numer portu?).
  12. (!) 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ę? Nadawcą maila ma być Kubus Puchatek.
  13. Ściągnij jakąś stronę przez HTTP używając tylko telnet-u.
  14. Prezent gwiazdkowy: zapoznaj sie z następującymi RFC: RFC2324, RFC1882, RFC2550, RFC3092, RFC1437. Poćwicz obsługę protokołu HTCPCP opisanego w RFC2324. Więcej podobnych: http://datacomm.org/rfc.html.

Zajęcia 12, 05.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.
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 jest protokołem całkowicie tekstowym, 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:.
4. 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.
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.
Ćwiczenia.
  1. Wyślij do siebie maila na adres xx999999@rainbow.mimuw.edu.pl albo @violet01.mimuw.edu.pl. Co się stało?
  2. Obejrzyj swój maildir na zodiac-u: katalog ~/Mail. A co jest w katalogu ~/mail?
  3. Przejrzyj jakiś plik z mailem ze swojego maildira. Zwróć uwagę na nagłówek i zinterpretuj jak najwięcej pól.
  4. 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)
  5. (!) Wyślij do prowadzącego maila zawierającego kolejno wszystkie liczby naturalne od 1 do 100.
  6. Weź plik z dowolnym mailem i poobrabiaj go programem formail. W szczególności:
  7. Uaktywnij na swoim koncie na zodiacu procmaila i napisz następujące reguły. Na wszelki wypadek pamiętaj o opcji c.

Zajęcia 13, 12.01

1. Procmail - uzupełnienia. Zapewnianie kontroli współbieżności poprzez pliki blokujące. Używanie zmiennych środowiskowych w plikach .procmailrc. Bardziej zaawansowana kontrola reguł przetwarzania (flagi) i bardziej skomplikowane warunki.
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. Ciekawostka. Każdy e-mail ma w nagłówku pole Message-ID. Powinno ono być unikalne w całej czasoprzestrzeni, tzn. każde dwa maile wysłane kiedykolwiek we wszechświecie powinny mieć inne Message-ID. Jak to zapewnić? Po co takie wymaganie (jak programy pocztowe wątkują? patrz pole References:, poza tym zastanów się też nad grupami dyskusyjnymi, tam też każdy post musi mieć unikalne ID i jest to dużo ważniejsze, dlaczego)? Patrz Recommendations for generating Message IDs.
4. fetchmail. jest użytecznym programem do ściągania poczty z jednego konta na inne. Użycie: np. w domu jeżeli rzadko jesteśmy on-line. W pliku konfiguracyjnym .fetchmailrc wpisujemy skąd ma być ściągana poczta (konto, serwer). Polecam.
Ćwiczenia:
  1. Ćwiczenia z poprzednich zajęć, głównie automatyczne odpowiadanie.
  2. Zobacz w man procmailex schemat automatycznej odpowiadaczki. Co oznaczają opcje -oi -t przy uruchomieniu sendmaila?
  3. Załóżmy, że nie chcemy odpowiadać wszystkim, ale tylko na maile pochodzące z domeny mimuw. Jak to zrobić?
  4. Zajrzyj do /etc/procmailrc - globalnego pliku konfiguracyjnego procmaila.
  5. Napisz filtr, który wszystkie maile większe niż 100kB wrzuca do osobnego pliku.
  6. 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.
  7. Jeszcze o nagłówku: obejrzyj nagłówek i dowiedz się jakiego programu pocztowego używał wysyłający, jaki serwer poczty obsługuje jego pocztę, jak długo list szedł. Sprawdź jak długo mail na students-all czekał zanim Baggins go sforwardował :).
  8. Oto mail który kiedyś dostałem: dziwny_mail.txt (dane osobowe zawarte w mailu zostały utajnione). Co w nim dziwnego (obejrzyj daty)? Nie licząc danych osobowych nagłówek nie był sztucznie zmieniany ręcznie, czyżby aż tak długo...? Wyjaśnić.

Zajęcia 14, 19.01

Przez część ćwiczeń: rozwiązywanie zadań typu egzaminacyjnego. Materiały na górze strony.

Materiały 1. Szyfrowanie asymetryczne. 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.
2. RSA. Najbardziej znany algorytm szyfrowania asymetrycznego, opierający sie na trudności rozkładu liczb na czynniki.
3. 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. Można szyfrować dowolny plik. (Szczegóły: man gpg)
4. 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).
Ćwiczenia:
  1. Jak użyć szyfrowania asymetrycznego do uwierzytelniania (inaczej podpisywania) wysyłanych wiadomości? Jak na raz podpisywać i szyfrować wiadomości?
  2. Zapoznaj się z działaniem ssh z kluczami. W tym celu:

Zajęcia 15, 26.01

Przez chwilę: omówienie zadania laboratoryjnego 1
Przez część ćwiczeń: rozwiązywanie zadań typu egzaminacyjnego i powtórzenie przed egzaminem. Materiały na górze strony.