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?
- Powerline - bash, zsh, fish... tmux, vim...
- https://ohmyz.sh/ - Oh My Zsh
Ďakujem za pozornosť
Unix/Linux, časť 4
By Milan Herda
Unix/Linux, časť 4
- 578