Unix/Linux

Časť 4

O čom budeme hovoriť

  • opakovanie
  • oprávnenia

Opakovanie

  • 1970 (unixová epocha)
  • C, teória jazykov a programovania
  • malé jadro, malé programy, ľahko kombinovateľné (LEGO)
  • 1984: RMS zakladá GNU (zrod open source)
  • 1984: X Window System
  • 1991: Linus Torvalds vytvára Linux

Opakovanie

  • všetko je súbor
  • príkazy sú programy
  • príkazy sa dajú kombinovať
> výstup do súboru (prepíše existujúci)
>> výstup do súboru (pripojí do existujúceho)
< vstup zo súboru
2> errorový výstup do súboru
2>> errorový v ýstup do súboru
2>&1 errorový výstup na štandardný výstup
| výstup jedného programu na vstup iného

Opakovanie

Príkazy majú parametre a argumenty

Parametre:

  • začínajú pomlčkou (jednopísmenové) alebo dvoma pomlčkami (slovné)
  • jednopísmenové je možné uviesť naraz a iba s jednou pomlčkou

Argumenty:

Nezačínajú pomlčkou. Väčšinou určujú súbor, nad ktorým sa má vykonať príkaz.

Oprávnenia

Unix - OS pre viacero používateľov

  • ako zabezpečiť, že používateľ nepokazí systém?
  • ako oddeliť dáta používateľov od systému?
  • ako zabezpečiť privátne dáta pre používateľov?
  • ako rozdeliť oprávnenia pre rôznych používateľov?
  • ako efektívne prideľovať/odoberať oprávnenia?

Treba vyriešiť niekoľko otázok:

Rozdelenie používateľov na

  • administrátora (root)
  • bežných používateľov

root môže všetko a jeho oprávnenia sa nijako nekontrolujú.

Bežní používatelia majú len

nutné minimum oprávnení.

Ako zabezpečiť, že používateľ nepokazí systém?

Keďže všetko v Unixových OS je súbor, tak ku každému súboru je možné nastaviť oprávnenia určujúce:

  • kto môže súbor čítať
  • kto môže súbor upraviť
  • kto môže súbor spustiť (ak je spustiteľný)

 

Ako oddeliť dáta používateľov od systému?

Ako zabezpečiť privátne dáta používateľov?

Používatelia majú vlastné (domovské) adresáre, v ktorých majú svoje súkromné dáta a môžu nastaviť prístup iba pre seba.

Ako rozdeliť oprávnenia pre rôznych používateľov?

Ako efektívne prideľovať/odoberať oprávnenia?

 

Používateľov je možné zaraďovať do viacerých skupín a oprávnenia je možné nastavovať pre celú skupinu.

Oprávnenia na súboroch

  • každý súbor patrí jednému vlastníkovi a jednej skupine (vlastník nemusí byť členom skupiny)
  • uložené ako atribúty rozdelené do troch skupín:
    • oprávnenia pre vlastníka súboru - u
    • oprávnenia pre skupinu - g
    • oprávnenia pre ostatných - o
  • oboje sú súčasťou definície súboru na filesystéme

Vieme zobraziť pomocou príkazu ls -l

Oprávnenia na súboroch

súbor adresár
r read čítanie súboru vylistovanie obsahu adresára
w write zmena súboru vytváranie súborov v adresári
x execute spustenie súboru vstup do adresáru

Každá skupina oprávnení nastavuje tieto tri atribúty:

Hodnotou atribútu je 0 (nemá právo)

alebo 1 (má právo)

Užitočné príkazy

ls -l vypíše oprávnenia k súborom
chmod umožňuje meniť oprávnenia k súborom, ktoré vlastním
chown umožňuje zmeniť vlastníka a skupinu pre súbor (môže robiť iba root)
chgrp zmení aktívnu skupinu pre používateľa (pod ktorou bude od tej chvíle vytvárať súbory)
groups vypíše zoznam skupín, do ktorých používateľ patrí

Príkaz chmod

chmod potrebuje vedieť:

  • komu meníme atribút (user, skupina, ostatní)
  • či pridávame alebo odoberáme
  • aký atribút meníme

Dovoľuje meniť atribúty oprávnení pre súbor/adresár

Komu?

u - vlastníkovi

g - skupine

o - ostatným

a - všetkým trom

Pridávame?

+ - pridávame

- - odoberáme

Atribút?

r - právo na čítanie

w - právo na zápis

x - právo na spustenie

Príkaz chmod

Komu?

u - vlastníkovi

g - skupine

o - ostatným

a - všetkým trom

Pridávame?

+ - pridávame

- - odoberáme

Atribút?

r - právo na čítanie

w - právo na zápis

x - právo na spustenie

# odoberieme právo na zápis pre skupinu
chmod g-w súbor

# odoberieme všetky práva pre ostatných
chmod o-r,o-w,o-x súbor

# pridáme právo na vykonanie pre všetkých
chmod a+x súbor

Príkaz chmod

# čítanie a zápis pre vlastníka,
# čítanie pre zvyšok sveta
chmod 644 súbor

# všetky práva pre vlastníka,
# ale iba čítanie obsahu a vstup
# do adresáru pre zvyšok sveta
chmod 755 adresár

# úplne všetko pre úplne všetkých
# (toto nikdy nerobte)
chmod 777 súbor

Pomocou troch čísel vieme naraz špecifikovať úplne všetky oprávnenia pre všetky skupiny

Príkaz chmod

Atribúty sú rozdelené v skupinkách po tri, ich hodnotou môže byť iba 0 alebo 1. Z toho vyplýva, že sa jednoducho dajú reprezentovať ako čísla v osmičkovej sústave

atribúty binárne oktálovo
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7

Spustené programy bežia pod právami používateľa, ktorý ich spustil

Výnimkou sú programy, ktoré majú nastavený SUID alebo SGID bit

SUID/SGID - špeciálny príznak pre "execute" právo, ktoré hovorí, že súbor po spustení bude bežať s oprávneniami vlastníka súboru a/alebo skupiny

ls -l /usr/bin/sudo

-rwsr-xr-x 1 root root ... /usr/bin/sudo

root

  • účet administrátora systému
  • jeho oprávnenia sa nekontrolujú (môže všetko)
  • jeho ID je na každom systéme 0
  • jeho domovský adresár je /root

Pod týmto kontom by sme mali byť prihlásení len výnimočne (ideálne vôbec)

root

Ako vykonať príkaz ako root?

  • prihlásiť sa do systému ako root
  • prepnúť sa do root konta príkazom su
  • príkazom sudo

Príkaz su

Skratka od "substitude user"

Po spustení si vypýta heslo a po jeho správnom zadaní môžeme v danom termináli pracovať pod kontom špecifikovaného používateľa, až kým neskončíme (príkazom exit, CTRL+D, zatvorením okna/tabu terminálu)

V novších systémoch sa nedá zadať samostatne a je potrebné ho spúšťať pomocou sudo

# chcem pracovať ako root
su

# chcem pracovať ako milan
su milan

# na novších systémoch

# chcem pracovať ako root
sudo su

# chcem pracovať ako milan
sudo su milan

Príkaz sudo

Vykoná jeden(!) príkaz ako špecifikovaný používateľ

Používateľ musí byť členom skupiny sudo, alebo mať záznam v súbore /etc/sudoers, aby mohol spustiť tento príkaz.

# spustenie príkazu ako root
sudo vim /etc/hosts

# spustenie príkazu ako user www-data
sudo -u www-data bin/console

Bežný používateľ

  • oprávnenia sa kontrolujú
  • môže byť členom viacerých skupín (predvolená je väčšinou zhodná s názvom jeho konta)
  • ID zvyčajne začínajú na 1000
  • domovský adresár je štandardne v /home/{login} alebo v /Users/{login}
  • používateľ zvyčajne nemá práva na zápis inde, ako do svojho domovského adresáru, /tmp a ním primontovaných zariadení (usb, externé disky...)
  • vie inštalovať programy, ale len do svojho adresáru

Shell

Shell

Interpreter príkazov, ktoré píšeme do terminálu.

V každom okne/tabe terminálu musí bežať shell, ktorý čaká na príkazy a interpretuje ich

  • zisťuje, či sú zadané príkazy spustiteľné súbory
  • zahajuje ich vykonávanie
  • poskytuje prostredie (environment) programom
  • interpretuje operátory a presmerovania
  • pozná podmienené vykonávanie
  • umožňuje skriptovanie

Shell

tcsh

Skriptovanie v shelli

Po zadaní príkazu shell zisťuje, či je príkaz (súbor) spustiteľný.

Spustiteľný binárny formát

  • ELF na Linuxe
  • Mach-O na MacOS
  • ak áno, spustí

Textový súbor

  • obsahuje shebang?
  • ak áno, spustí interpret

Shebang

Sharp Bang

#!

  • #!/bin/bash
  • #!/usr/bin/env php
  • #!/usr/bin/env node
#!/bin/bash

COMMAND=$1
SESSION_NAME=hrad
WINDOW_NAMES=(src gatsby deploy)

source ~/.local/share/tmux-functions/tmux-functions.sh

start_project() {
    cd ~/projects/perunhq.org/hrad.perunhq.org

    start_session_and_open_windows $SESSION_NAME "${WINDOW_NAMES[@]}"

    tmux send-keys -t $SESSION_NAME:src "cd web" Enter "nvim" Enter
    tmux send-keys -t $SESSION_NAME:gatsby "cd web" Enter "yarn develop" Enter
    tmux send-keys -t $SESSION_NAME:deploy "cd deploy" Enter

    tmux attach -t $SESSION_NAME:src
}

case "$COMMAND" in
    "stop")
        tmux kill-session -t $SESSION_NAME
        ;;

    *)
        start_project
        ;;
esac

Ako si prispôsobiť shell?

Konfigurácia

shell kde je konfiguračný súbor
bash ~/.bashrc
zsh ~/.zshrc
fish ~/.config/fish/config.fish

Premenné prostredia

Príkaz Význam
env vypísanie zoznamu a hodnôt
echo $PREMENNA vypísanie hodnoty konkrétnej premennej
PREMENNA=hodnota priradenie novej hodnoty (bez medzier okolo "=")

Ovplyvňujú správanie programov.

Sú to premenné, takže ich vieme meniť podľa potreby

Premenné prostredia

$USER

Login aktuálneho používateľa

$PWD

Aktuálny pracovný adresár

$PATH

Cesty, v ktorých bude shell hľadať príkazy

$SHELL

Aktuálny shell (cesta k nemu)

$HOSTNAME

Názov aktuálneho počítača

Pekný shell?

Ďakujem za pozornosť