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ę.
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.
man bash, info coreutils, info textutils
- podręczniki systemowe do narzędzi konsolowych, basha itp.
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.
man
pwd
, man ls
, man less
,
man cat
info coreutils
1.txt
zawierający
parę linijek tekstu. 1.txt
za pomocą polecenia
cat
, a także za pomocą less
.
root
(tzn. /
). Wylistować zawartość
katalogu (polecenie ls
). Zmienić katalog na
katalog domowy (cd ~
) i wylistować go. Jeszcze raz
wylistować swój katalog domowy używając polecenia ls
-a
. Jaka jest różnica?
mc
i za jego pomocą przejrzeć zawartość
swojego katalogu domowego oraz innych katalogów.
info coreutils
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.
/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.
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
.
~/.bash_profile
, ~/.bashrc
i
~/.bash_history
. Aliasy.
Ć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?
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ść?
/etc
.
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ć.
/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.
students
?
0004
. Co to znaczy, i czy jego
właściciel może go wtedy odczytać? A skasować?
-R
" w poleceniu
chmod
i wielu tym podobnych poleceniach?
rm
żeby nie dopytywało się o
potwierdzenie usunięcia za każdym plikiem. Podobnie, zmusić do
usuwania całych katalogów z podkatalogami.
tac
? Skąd nazwa?
kill
unicestwić wszystkie
swoje procesy na raz? (Uwaga: wcześniej zachowaj wszystkie swoje
dane :) ).
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? ls -l
,
ps -ax
, rm -rf
).
man
date
).
man bash
- sekcja Przekierowania
cat, head, tail, wc, sort, uniq, cut, xargs, tr, nl, exapnd, tee
who | cut -f1 -d" " | sort | uniq | wc -l
ppc386 a.pas 2> /dev/null > a.txt
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).
find ~/ -name '*~' | xargs rm -f
<, >, >>, |,
&>
. Przetwarzanie w potokach (pipes).
n.txt
, a PESEL-e do p.txt
(jednym poleceniem).Rozwiązanie
cat a > a
" i "cat
< a >> a
" (Uwaga!)? Czym różni się "cat
a > a
" i "cat a | cat > a
" ?
~/.bash_history
?. Co dalej?)
liczby.txt
a w każdym jego wierszu
liczbę. Czy sort liczby.txt
dobrze je posortuje?
Jak to poprawić?
tail -f
?
man bash
, man test
$USER,
$HOME
. Parametry skryptu ($1, ...
),
zmienne specjalne $@, $*, $$, $?, ...
(zobacz
man bash
sekcja Special Parameters).
${parameter#word}
,
${parameter%word}
,
${parameter/pattern/string}
do wycinania z
przodu, z tyłu oraz do podmiany kawałka tekstu, np.
f="plik.txt"; mv $f ${f%txt}html
plik.txt
na plik.html
.
s="abrakadabra"; echo ${s//ab/AB}
ABrakadABra
.
man bash
.
$( )
i ` `
, np.
file `which [`
[
.
echo "Katalog /bin zajmuje $(du -sk /bin | cut -f1) kilobajtów."
/bin
.
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.
$(( ))
.
Dzisiaj jest...
po czym
nastąpi bieżąca data.
.TXT
na .txt
. tr
).
echo $10
cat $1
if [ $a == $b ] then ....
for linia in $(< plik); do echo kolejna linia
to $linia; done
echo Tekst (z kawalkiem w nawiasie)
cat $nazwa_pliku | while read wiersz; do zrób_coś_z_$wiersz; done
(while read wiersz; do zrób_coś_z_$wiersz; done) < $nazwa_pliku
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
.
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. 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
.
$1
i $2
przekracza wartość $3
$1
nie jest dowiązaniem
symbolicznym
$1
istnieje i mamy prawo
tworzyć w nim pliki
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)
$1
, który w każdym
wierszu zawiera jedno słowo, występują jakieś
powtórzenia
-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ć?
-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
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?
man grep
, man regex
, man sed
, man awk
abc*(a|d)
- słowa zaczynające się od
ab
po których następuje kilka c
a
następnie a
lub d
.
(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.
^
(daszek) początek wiersza
$
(dolar) koniec wiersza
*
(gwiazdka) dopasowuje dowolną (również
zero) ilość wzorca przed gwiazdką, np.
^abc*$
dopasuje się do ab
oraz abccc
ale nie do
abcabcabc
+
(plus) dopasowuje dowolną (ale nie
zero) ilość wzorca przed plusem, np.
^abc+$
dopasuje się do abccc
ale nie do abcabcabc
|
(pałka) alternatywa dwóch wzorców, np.
abc | def
[ ]
(nawiasy kwadratowe) klasa znaków;
dopasowuje dowolny ze znaków umieszczonych wewnątrz
nawiasów, np. [abc][0-9][a-z]
dopasuje
się do każdego ze słów a4x
,
b9d
, c0a
itp.
( )
(nawiasy okągłe) tworzy ze wzorca
wewnątrz nawiasów jedną całość, którą można,
np. (abc|def)+
dopasuje się np. do
abcabcdefabcdef
{ od, do }
(nawiasy
klamrowe) dopasowują poprzedzający wzorzec zadaną
liczbę razy, np. [0-9]{2,4}
dopasuje się
do słów składających się z 2, 3 lub 4 cyfr,
[0-9]{6}
dopasuje się do słów
składających się z dokładnie 6 cyfr.
.
(kropka) dowolny znak
grep -v "^a" *.txt
txt
cat passwd | cut -f1 -d: | egrep "^[a-z]{2}2[0-9]{5}"
who | cut -f1 -d' ' | xargs finger -s | cut -f2 -d' ' | grep -c "Marcin"
students
)
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.
sed
.
Najprostsze (i najczęstsze) użycie edytora wierszowego
sed
:
cat plik | sed 's/abc/xyz/g'
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'
wk654321 Wacław Kowalski
654321 Wacław Kowalski
.
find /home/mat/ -maxdepth 2 -type d -name '[a-z][a-z][0-9]*' | cut -f5 -d'/' | xargs finger -p | egrep '^Login' > studmat
studmat
. Wykorzystując ten plik znajdź:
info sed
, man rsync
, man exiv2
,
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
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
. conf.txt
sed
-
przetwarzania szablonów stron WWW.
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
- trzecie dopasowanie,
echo "aaaaaaababababababab" | sed -e 's/a/x/g' -e 's/b/y/g'
echo "aaaaaaababababababab" | sed -e 's/a/b/g' -e 's/b/y/g'
cat plik | sed '10,20 s/a/b/'
cat plik | sed '/POCZATEK/,/KONIEC/ s/a/b/'
cat plik | sed -n '10,20p'
cat plik | sed -n '/POCZATEK/,/KONIEC/p'
cat plik | sed '/[0-9]/ s/a/b/'
cat plik | sed '10,20 { /[0-9]/ s/a/b/ }'
set
- ustawia parametry skryptu, np.
set a b c d e
$1 == a
, $2 == b
, $3 ==
c
itd.
rsync
- synchronizacja różnych kopii tego
samego
convert, display, identify, exiv2
-
przetwarzanie zdjęć
rsync
na students.
~/tmp/public_html
,
gallery-template.xhtml
na
index.xhtml
,
~tmp/public_html
,
chmod -R u+rwX,g+rX,o+rX ~/tmp/public_html
~/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 ~
http://students.mimuw.edu.pl/~ab123456/index.xhtml
wget
.
Uwaga: to około 15MB - jeśli komuś brakuje miejsce
może ściągnąć do katalogu /tmp
.
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ść,
convert -rotate
,
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)
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).
man 2 fork
, man 2 wait
itp.
Uwaga: (dla piszących w języku C) należy załączać
pliki nagłówkowe unistd.h
, sys/types.h
,
sys/wait.h
ps
.
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.
wait()
czeka na
dowolnego, waitpid(int pid,...)
na
konkretnego. Funkcja jest blokująca.
getpid(), getppid(), halt, exit
... Ponadto, do
osiągnięcia efektu wstrzymania procesu na chwilę:
sleep(secs)
, wymaga nagłówka
unistd.h
.
errno
.
fork()
.
ps
, jeżeli dziecko się
zakończy, a rodzic działa w najlepsze i nie wykonuje
wait()
na dziecku?
man pipe, man 3 exec, man dup
man read, man 2 write, man open, man close
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.
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
.
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.
read,
write
.
man 2 kill
man sigaction
, man sigprocmask
help trap
kill(pid_t pid, int sig)
- wysyłanie sygnałów do procesów
sigaction(int numer_sygnalu, struct sigaction *
akcja, struct sigaction * poprzednia_akcja)
-
rejestrowanie procedury obsługi sygnału
sigprocmask(int jak, const sigset_t * zbior, sigset_t * stary_zbior)
- blokowanie sygnałów
pause(), sigsuspend(const sigset_t * maska)
- oczekiwanie na sygnał
int sigemptyset(sigset_t *zbior)
- zeruje zbiór sygnałów wskazywany przez parametr zbior.int sigfillset(sigset_t *zbior)
- dodaje do zbioru wszystkie dostępne sygnały.int sigaddset(sigset_t *zbior, int sygnal)
- dodaje sygnał do zbioru.int sigdelset(sigset_t *zbior, int sygnal)
- usuwa sygnal ze zbioru.int sigismember(const sigset_t *zbior, int sygnal)
- przekazuje w wyniku
wartość niezerową, jeżeli sygnał jest w zbiorze, a w przeciwnym wypadku 0.trap
.
SIGUSR1
i za każdym razem gdy dostanie ten sygnał wypisuje na ekran
komunikat "Hello!" - poza tym może nic innego nie robić.
KILL
, a STOP
?
KILL
. Co się stało?
host
i nslookup
z przykładami
by Piotr Marek, Jr.,
ifconfig
, klasy adresowe, maska
podsieci. Adresowanie IPv6.
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
/etc/resolv.conf
.
/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.
host
znajdź numer
telefonu do firmy obsługującej serwis onet.pl. Zrób to samo
przy pomocy baz whois.
80.252.0.145
. A 80.251.0.145
?
host
odpowiedni
serwer DNS (który?).
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)
telnet
-u. Szybkie wprowadzenie do protokołu
HTTP,
man mail
,
man procmail
,
man procmailrc
,
man procmailex
,
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
-a
), (blind) carbon copies
(-b, -c
), zmienić adres w polu From:
(-r
) etc.,
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
,
grep
-em,
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
.
.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"
pierwsze.txt
,
.forward
wszystkie maile do tego programu:
|procmail
.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,
:0 flagi
* wyrazenie_regularne
akcja
:0
* From:.*skola.*mimuw.*
/dev/null
:0 c
* From:.*skola.*
| grep Subject >> ~/from-skola.txt
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).
man procmailex
. Tam też
bardziej zaawansowana kontrola reguł przetwarzania (flagi) i
bardziej skomplikowane warunki.
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
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),
telnet
-u. Szybkie wprowadzenie do protokołu
HTTP.
~/Mail
,
~/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
)
formail
. W szczególności:
c
.
\
, nie trzeba
pisać wszystkiego w jednej linijce.)
man procmailex
.
Cc:
tej odpowiedzi.
man procmailex
schemat automatycznej
odpowiadaczki. Co oznaczają opcje -oi -t
przy
uruchomieniu sendmaila?
/etc/procmailrc
- globalnego pliku
konfiguracyjnego procmaila.
vacation
(sama
nazwa wskazuje jego działanie). Zapoznaj się z man
vacation
.
man gpg
)
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ą?
/etc/shadow
na swoim komputerze) Czy gdziekolwiek na dysku serwera
są faktycznie przechowywane hasła użytkowników?
man
ssh
, man ssh-keygen
)
ssh-keygen -t rsa
, pliki z kluczami
powstają w katalogu ~/.ssh
*.pub
) do pliku
~/.ssh/authorized_keys2
na maszynie na
którą będziesz się logował (np. students)
ssh students
lub
scp
. Powinno zadziałać bez hasła!
Nie udało się nawiązać bezpiecznego połączenia
mail.mimuw.edu.pl używa nieprawidłowego
certyfikatu bezpieczeństwa. Certyfikat nie jest
zaufany, ponieważ certyfikat wystawcy nie jest
zaufany.
(Kod błędu: sec_error_untrusted_issuer)
* Powodem tego może być nieprawidłowa konfiguracja serwera albo
* próba podania się za ten serwer przez podmiot nieuprawniony.
* Jeśli użytkownik łączył się wcześniej z tym serwerem, błąd może
* być tymczasowy – w tej sytuacji należy spróbować ponownie później.
Możesz także dodać wyjątek…
students.mimuw.edu.pl -> Pobierz -> Certyfikaty SSL MIM
.
man ifconfig, man route, man ping, man traceroute, man tcpdump
,
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.
/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
netmask
, broadcast
.
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
.
-i eth0
-- nasłuchuj na podanym
interfejsie,
-s len
-- ile bajtów (snaplen)
przechwycić. 0 = cały pakiet,
-w plik
-- zapisuj do pliku,
-n
-- wypisuj adresy numerycznie,
-v, -vv, -vvv
-- gadatliwość (verbosity),
ip/tcp/udp/icmp
-- wybierz protokół,
host port/port/dst port num, port nazwa
-- wybierz port, np. port smtp
,
host/src host/dst host/net
-- między
jakimi komputerami/podsieciami,
ip broadcast
-- pakiety broadcast,
IP-->TCP/UDP/ICMP-->HTTP/SSH/... (ISO/OSI)
. Interpretacja
niektórych pól z nagłówków wypisywanych przez tcpdump.
students
) Przetestuj ping do różnych
komputerów: na wydziale, w Polsce, w Australii.
www.onet.pl
? Do www.google.com
?
Gdzie to jest?
ifconfig
. Sprawdź, że działa między tymi
maszynami ping
, ssh
itp.
NAT
. Skonfiguruj teraz system
na ten maszynie tak, by autmatycznie pobierał adres IP dla tej
karty.
SYN, SYN+ACK, ..., FIN
).
Jak w tytule.
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.
e-mail: initial.lastname @ mimuw.edu.pl | Ostatnia aktualizacja: 11-01-2009 |