Procesy i uprawienia

Table of Contents

Procesy

ps

pstree

Polecenie pstree przedstawia relacje między procesami w formie drzewa. Domyślnie pokazywane jest całe drzewo, tj. poczynając od procesu init, lecz można je zawęzić.

Jeśli proces ma kilka identycznych procesów potomnych, to są one pokazywane w formie skrótowej w nawiasach kwadratowych. Jeśli proces ma wątki potomne, to są one okalane dodatkowo nawiasami klamrowymi. Poniżej ModemManager, NetworkManager oraz kilka innych procesów mają wątki potomne. systemd jest pierwotnym procesem (procesem init) i ma 5 identycznych procesów potomnych Xvnc.

pstree | head
systemd-+-ModemManager---2*[{ModemManager}]
        |-NetworkManager---2*[{NetworkManager}]
        |-5*[Xvnc]
        |-abrt-dbus---2*[{abrt-dbus}]
        |-3*[abrt-dump-journ]
        |-abrtd---2*[{abrtd}]
        |-accounts-daemon---2*[{accounts-daemon}]
        |-acpid
        |-agent---2*[{agent}]
        |-agetty

Inne programy do monitorowania

  • pgrep <wzorzec> - wyszukiwanie procesów przez dopasowanie do nazwy procesu (domyślnie) lub do pełnej ścieżki i wszystkich argumentów procesu (z opcją -f). <wzorzec> to rozszerzone wyrażenie regularne, tak jak grep z opcją -E.
  • top - pokazuje informacje zbiorcze o poziomie wykorzystania zasobów komputera oraz tabelę procesów odświeżane domyślnie co 3 sekundy. Można dopasować porządek sortowania, wysyłać sygnały do procesów, filtrować po nazwie użytkownika.
  • htop - współczesna, wygodniejsza w użyciu alternatywa do top. Program nie jest dostępny na wielu systemach, w przeciwieństwie do top.
  • iotop - pokazuje w postaci tabeli bieżące informacje of operacjach zapisu i odczytu z pamięci masowej przez procesy systemu. Wymaga uprawnień roota.

Proste programy

Pokażemy jak zarządzać procesami na przykładzie poniższych dwóch programów.

Kod źródłowy my_sleep.c:

#include <stdio.h>
#include <unistd.j>

int main(int argc, char *argv[]) {
  sleep(1000);
  return 0;
}

Kod źródłowy my_print.c:

#include <limits.h>
#include <stdio.h>
#include <unistd.j>

int main(int argc, char *argv[]) {
  for (long long int i=0;i<LLONG_MAX;++i) {
    printf("iteratioon %lld\n", i);
    sleep(1);
  }

  return 0;
}

Kody kompilujemy komendami:

gcc my_print.c -o my_print
gcc my_sleep.c -o my_sleep

Zarządzanie procesami w Bashu

Domyślnie wywołane polecenia działają na pierwszym planie. To znaczy, że standardowe wejście jest przyczepione do naszego terminala i nie możemy wywołać kolejnych poleceń dopóki obecne nie ukończy działania. Możemy zatrzymać jego działanie skrótem klawiszowym C-z. Dopiero co zatrzymany proces możemy wznowić wywołując funkcję wbudowaną fg lub nakazać mu działać w tle funkcją wbudowaną bg. Listę wszystkich zawieszonych lub działających w tle procesów zarządzanych przez obecną sesję powłoki wyświetlamy funkcją jobs.

Na działanie procesów możemy wpływać wysyłając im sygnały. Proces może zareagować na otrzymany sygnał na kilka sposobów:

  • sygnał może być zignorowany (Ign),
  • proces może zostać zamknięty (Term),
  • proces może zostać zamknięty, a jego obraz zapisany na dysku (core dump) (Core),
  • proces może zostać zawieszony (Stop),
  • proces może zostać wznowiony, jeśli był uprzednio zawieszony (Cont).

W ogólności proces może zdecydować jak zareagować na każdy z sygnałów za wyjątkiem sygnałów KILL oraz STOP, które bezwarunkowo zatrzymują lub zawieszają proces.

Do wysyłania sygnałów służy komenda kill, której przekazujemy identyfikator sygnału oraz listę PID-ów, do których chcemy wysłać sygnał. Podstawowe sygnały to:

  • TERM, sygnał zamykający proces, wysyłany skrótem C-d,
  • KILL, sygnał zamykający proces bezwarunkowo,

Pełna lista sygnałów oraz ich domyślne działanie są opisane w podręczniku man signal(7).

tmux

Uprawnienia

Odczyt (4), zapis (2), wykonanie (1).

Nie potrzebujemy uprawnień odczytu żeby wykonać plik binarny.

Żeby bezpośrednio wykonać skrypt powłoki potrzebujemy zarówno uprawnienie odczytu jak i wykonywania. Możemy również wykonać skrypt powłoki niebezpośrednio i wtedy nie potrzebujemy uprawnień wykonywania.

echo "echo test" > /tmp/plik.sh
/tmp/plik.sh                       # Permission denied, ale...
bash /tmp/plik.sh                  # ...ta linijka działa!

Prawo wykonania dla katalogów oznacza możliwość ustawienia katalogu jako bieżącego katalogu i sprawdzenie własności plików w tym katalogu, do których mam uprawnienia odczytu.

setuid (4), setgid (2) - dla plików wykonywalnych sprawiają, że proces jest wykonywany z uprawnieniami użytkownika właściciela lub grupy właściciela.

setgid (2) dla katalogów sprawia, że nowo utworzone pliki w katalogu dziedziczą grupę właściciela katalogu, katalogi ponadto dziedziczą bit setgid (2). W niektórych systemach setuid (4) ma analogiczne działanie, tzn. sprawia że pliki i katalogi dziedziczą własność po właścicielu katalogu. Bez tych bitów nowo utworzone pliki są własnością użytkownika oraz grupy procesu tworzącego, niezależnie od tego kto jest właścicielem katalogu nadrzędnego!

sticky bit (1) - ma sens dla katalogów; plik w katalogu może być usunięty (lub jego nazwa zmieniona) tylko przez właściciela danego pliku. To znaczy, samo posiadanie uprawnienia zapisu dla katalogu nie jest wystarczające.

Maska ogranicza uprawienia przypisywane nowym plikom.

Zadania

SIGUSR2

Uruchomić drugą sesję basha. Złapać sygnał SIGUSR2. Po złapaniu zapisać ciąg znaków ‘SIGUSR2 złapany’ do pliku $HOME/łapanie_sygnałów.log. Sprawdzić działanie wysyłając odpowiedni sygnał z innej sesji.

Zarządzanie procesami

Uruchom w tle 3 procesy my_sleep. Zmień priorytet jednego z nich na +15, a innego na +20. Znajdź ich identyfikatory PID i wyślij im sygnał KILL poleceniem kill.

Podstawy uprawnień (1)

Utwórz katalog test_upr, a w nim 50 plików o rozszerzeniu txt. Nadaj tym plików następujące uprawnienia:

  • dla grupy oraz pozostałych - odczyt i zapis,
  • dla właściciela - odczyt, zapis, wykonanie.

Na katalog test_upr nadaj uprawnienie setGID oraz sticky bit korzystając z zapisu ósemkowego.

Podstawy uprawnień (2)

Nadaj uprawnienia 777 na wszystkie pliki z poprzedniego zadania. Katalogowi test_upr nadaj uprawnienia 555. Usuń pliki txt z katalogu. Wytłumacz zachowanie komendy.

Częściowo tajne pliki

Utwórz w swoim katalogu domowym podkatalog TAJNE, a w nim plik publiczne.txt. Niech wszyscy użytkownicy systemu mogą odczytywać i zapisywać w pliku publiczne.txt, ale bez możliwości wyświetlania pozostałej zawartości katalogu TAJNE. Zweryfikuj działanie z kolegą lub koleżanką obok.

Pliki z bitem setuid

Znajdź wszystkie pliki w katalogu /bin, które mają ustawiony bit setUID. Podpowiedź: użyj grep z odpowiednim wyrażeniem regularnym, aby przefiltrować wyjście ls -l.