Laboratorium 2¶
Podstawy wykorzystania infrastruktury chmurowej - Unix, Shell¶
W trakcie zajęć laboratoryjnych będziemy pracować z różnymi narzędziami stosowanymi przy przetwarzaniu danych masowych. Wykorzystamy je, aby krok po kroku zbudować rozproszoną aplikację do zbierania i przetwarzania większych wolumenów danych, pochodzących z różnych źródeł. Będziemy również wdrażać tę aplikację na produkcyjnym środowisku.
Zarówno na etapie rozwoju aplikacji, jak i jej późniejszego wdrożenia będziemy korzystać z usług chmurowych, a dokładniej z maszyn wirtualnych. Taki tryb pracy wymaga zapoznania się z podstawowymi mechanizmami w systemie Linux, który będzie używany na serwerach (maszynach wirtualnych). Jednymi z pierwszych aspektów, które poruszymy na tym laboratorium, jest obsługa powłoki (shell) Bash oraz praca z edytorami tekstowymi (tutaj: Vim).
1. Powłoka Bash¶
Najczęściej spotykaną powłoką w systemach z rodziny GNU/Linux jest Bash (ang. Bourne-Again Shell). Dostarcza ona wiele komend pozwalających na przeprowadzanie podstawowych operacji oraz interakcję z systemem (np. \(\texttt{cd}, \texttt{pwd}, \texttt{echo}\)).
Komendy można łączyć w większe programy, zwane w Bashu skryptami. Skrypty mają najczęściej rozszerzenie \(\texttt{.sh}\), ale jest to konwencja a nie wymaganie. Bash pozwoli uruchomić skrypt w pliku nie posiadającym żadnego rozszerzenia. Skrypty można uruchamiać na m.in. dwa sposoby:
bash plik.sh
./plik.sh
W drugim przypadku wymagane jest dopisanie w pierwszej linii skryptu informacji jak uruchomić taki skrypt, tzw. shebang:
#!/usr/bin/env bash
lub
#!/bin/bash
Przy uruchamianiu skryptów za pomocą komendy bash plik.sh
nie jest to wymagane, ale dopisywanie shebanga stanowi dobrą praktykę.
Więcej szczegółowych informacji na temat Basha można znaleźć w jego oficjalnej dokumentacji: https://www.gnu.org/software/bash/manual/bash.html
Zadanie 1.1 (1 pkt)¶
Napisz skrypt Bashowy, który uruchomi w tle komendę podaną jako argument do skryptu, tzn.
$ ./run-background.sh <command-to-run>
np.
$ ./run-background.sh "sleep 10"
$ ./run-background.sh "du -sh /home"
W implementacji wykorzystaj polecenie &
.
Plik run-background.sh
, w którym należy zaimplementować ten skrypt znajdziesz w repozytorium do tego laboratorium.
Zadanie 1.2 (1 pkt)¶
Napisz skrypt Bashowy, który wyszuka i zakończy działanie komendy podanej jako argument do skryptu, tzn.
$ ./kill.sh <command-to-kill>
np.
$ ./kill.sh "sleep 10"
$ ./kill.sh "du -sh /home"
W implementacji wykorzystaj jedno lub kilka z następujących poleceń: kill
, killall
, pidof
.
Plik kill.sh
, w którym należy zaimplementować ten skrypt znajdziesz w repozytorium do tego laboratorium.
Zadanie 1.3 (1 pkt)¶
Napisz skrypt Bashowy, który będzie filtrować dane pochodzące z losowego strumienia danych. Wykorzystaj strumień /dev/urandom
oraz komendy sed
lub tr
. Zaimplementuj filtrowanie w taki sposób, aby zwracać tylko znaki alfanumeryczne oraz wybrane 2-3 dodatkowe znaki.
$ ./filter.sh
2. Połączenia SSH¶
W celu połączenia się ze zdalnym serwerem (maszyną wirtualną) najczęściej wykorzystuje się protokół SSH (ang. secure shell). Podstawowa składnia stosowana do połączenia się z maszyną to:
ssh <użytkownik>@<adres-maszyny>
W przypadku adresu maszyny możemy podać zarówno adres IP maszyny, jak i adres domeny, który wskazuje na IP maszyny.
Po wykonaniu komendy zostaniemy poproszeni o podanie hasła użytkownika na zdalnym serwerze. Bezpieczniejszą alternatywą jest wykorzystanie kluczy SSH, które możemy wskazać za pomocą argumentu -i
do komendy ssh
.
Wykorzystując protokół ssh możemy nie tylko połączyć się do zdalnej maszyny, ale również kopiować pliki, np. z lokalnej maszyny na zdalny serwer. Wykorzystujemy w tym celu komendę scp
(ang. secure copy).
Zadanie 2.1 (2 pkt)¶
Napisz skrypt Bashowy, który skopiuje pliki podane jako argumenty skryptu z jednego serwera na drugi. Powinna być możliwość opcjonalnej zmiany nazwy pliku. Składnia skryptu powinna być następująca:
$ ./copy.sh <użytkownik1@IP-maszyny-źródłowej:/ścieżka/do/plików/> <użytkownik2@IP-maszyny-docelowej:/ścieżka/do/plików> <plik-1>:<nowa-nazwa-pliku-1?> <plik-2>:<nowa-nazwa-pliku-2?> ... <plik-N>:<nowa-nazwa-pliku-N?>
Przykładowe wywołanie:
$ ./copy.sh bob@192.168.0.1:/home/bob alice@192.168.0.2:/tmp/ log.txt config.yaml:configuration.yaml
Powyższe polecenie skopiuje dwa pliki z maszyny o adresie 192.168.0.1
(logując się jako użytkownik bob
) z katalogu /home/bob
na maszynę o adresie 192.168.0.2
(logując się jako użytkownik alice
) do katalogu /tmp
. Pierwszy plik - log.txt
- zostanie skopiowany bez zmian, natomiast w przypadku drugiego pliku - config.yaml
- nazwa pliku powinna zostać zmieniona na configuration.yaml
.
Pamiętaj, aby skrypt obsługiwał zmienną liczbę nazw plików, tzn. można skopiować 1 plik, ale również 50.
3. Edytory tekstowe¶
W trakcie pracy na zdalnym serwerze będziemy często mieli potrzebę edycji zawartości plików tekstowych. Zamiast kopiować te pliki z serwera na lokalny komputer, edytować je lokalnie i następnie zmienione pliki z powrotem umieszczać na serwerze, możemy je edytować bezpośrednio na zdalnej maszynie. Nie będziemy mieć dostępu do aplikacji okienkowych, a jedynie będziemy w stanie wykorzystać edytory tekstowe działające w terminalu.
Popularnymi edytorami tekstu są: nano
, vi
oraz vim
. O ile nano
uchodzi za najprostszy edytor, o tyle vim
oferuje największy komfort pracy. Edytor ten działa w kilku trybach:
tryb poleceń (ang. normal mode) - włączony domyślnie po uruchomieniu vim’a; pozwala: (a) przechodzić w pozostałe tryby, (b) poruszać się po dokumencie (strzałki lub klawisze h, j, k, l), (c) usuwać, przenosić oraz kopiować tekst,
tryb wprowadzania (ang. insert mode) - w ten tryb wchodzimy za pomocą klawisza
i
, a wychodzimy za pomocąEsc
; w tym trybie możemy normalnie wprowadzać/wpisywać tekst,tryb wizualny (ang. visual mode) - pozwala wybierać fragmenty tekstu i wykonywać na nich polecenia
Istnieją jeszcze dodatkowe tryby (select, command-line, ex-mode) jednak na razie je pominiemy.
Zadanie 3.1 (1 pkt)¶
Uruchom edytor vim
na dowolnum pliku tekstowym, a następnie wykonaj poniższe polecenia:
znajdź podane wyrażenie w tekście
przejdź do podanej linii
podmień pojedynczy znak
podmień podane wyrażenie na inne
zapisz zmiany
wyjdź z vim’a (na dwa sposoby)
Zadanie to przećwicz wybierając sobie dowolne wyrażenia, znaki i linie w tekście, przy czym podczas oddawania zadania prowadzący poda własne przykłady.