===== Praca z plikami i poleceniami =====
==== Przygotuj się do laboratorium ====
* **Zdobądź dane dostępowe do [[https://spk.fais.uj.edu.pl/|serwera SPK]]** -- jeżeli ich nie pamiętasz (albo nie wiesz czy masz konto), pomogą w tym administratorzy ([[https://spk.fais.uj.edu.pl/contact|dane kontaktowe]])
* Zapoznaj się z poleceniem **chmod** (przejrzyj manual do polecenia **chmod** i/lub [[wp>Chmod|stronę w wikipedii]])
==== Wiedza ====
=== 1. Pomoc ===
* Znasz już manuala: **man**
* Pracę z manualem warto zacząć od ''man man''
* Jeżeli z poleceniem związanych jest więcej niż jedna strona podręcznika, można wyświetlić krótki opis każdej z nich za pomocą: man -f man
Odpowiednikiem tego wywołania jest: whatis man
* Aby obejrzeć po kolei wszystkie strony dotyczące zadanego hasła: man -a man
* Zbiór stron man można przeszukiwać według słów kluczowych: man -k manual
Powyższe polecenie jest równoważne użyciu: apropos manual
* Aby obejrzeć stronę związaną z danym hasłem z zadanej sekcji manuala: man 1 man
=== 2. Uruchamianie programów ===
* Pliki programów są przechowywane w systemie plików.
* Każdy plik programu w systemie ma nazwę (//case sensitive//).
* Program jest uruchamiany przez powłokę poprzez podanie nazwy jego pliku.
* Powłoka zapewnia mechanizmy kontroli pracy uruchamianych zadań (ang. //job//), programów.
* Powłoka zapewnia mechanizmy przekazywania wyników pracy zadań.
=== 3. Argumenty poleceń ===
* Polecenia mogą przyjmować argumenty.
* Argumenty mogą być obowiązkowe (np. nazwa pliku) lub opcjonalne (tzw. opcje).
* Niektóre opcje przyjmują dodatkowe argumenty (obowiązkowe, lub opcjonalne).
* Nazwy opcji maja format długi i krótki.
* Argumenty są //case sensitive//.
* Spis opcji programu jest podany w man lub przez opcje -h|--help
* Kolejność można zmieniać.
* Krótkie opcje można scalać.
* Przykłady wykorzystania opcji:
ls --all # format długi
ls -a # format krótki
# zmiana kolejności opcji:
ls -a -l
ls -l -a
# przekazanie argumentów
ls --ignore=\*.png # format długi
ls -I \*.png # format krótki
# scalanie opcji
ls -al # OK
ls -la # OK
ls -alI \*.png # OK
ls -Ila \*.png # ŹLE!
=== 4. Praca z plikami ===
System plików ma strukturę drzewiastą:
/
/bin
/bin/bash
/home
/home/gjn
/home/gjn/plik
/home/gjn/katalog/plik
* Jest zawsze tylko jedna taka struktura podczas pracy systemu.
* W związku z tym zawsze jest bezwzględny początek systemu plików: /////
* Inne systemy mogą być włączane jako kolejne gałęzie.
* Katalog bieżący: //.// \\ Katalog nadrzędny: //..//
* Katalog jest plikiem!
Nazewnictwo:
* Wszystkie pliki i katalogi mają nazwy będące ciągami znaków alfanumerycznych.
* Nazwy mogą być długie i są //case sensitive//.
* Katalogi rozdziela się znakiem ///// (ang. //slash//).
* Ścieżka dostępu to nazwa pliku pozwalająca na jego umiejscowienie.
* Pełna (bezwzględna) ścieżka określa jego położenie względem początku drzewa, zaczyna się od /////, np. ''/etc/init.d/cups''.
* Względna ścieżka określa położenie względem katalogu bieżącego.
* ''~user'' oznacza katalog domowy użytkownika ''user'' (mechanizm na poziomie powłoki, nie systemu plików!)
=== 5. Polecenia dotyczące plików i katalogów ===
Pliki:
* **cp** kopiowanie
* **mv** przenoszenie, zmiana nazwy
* **rm** usuwanie
* **touch** zakładanie pustego, modyfikacja daty
* **file** typ pliku
Katalogi:
* **cd** zmiana bieżącego
* **pwd** podanie bieżącego
* **mkdir** zakładanie
* **rmdir** usuwanie (pustego!)
* **ls** pokazywanie zawartości
* **du** pokazywanie objętości (również pliku)
W nazwach plików do których użytkownik odwołuje się w powłoce można używać 2 **metaznaków** (znaków specjalnych), które zastępują ciągi znaków w nazwie pliku (ścieżce dostępu):
* znak ''?'' zastępuje dokładnie jeden znak,
* znak ''*'' zastępuje ciąg znaków o dowolnej (w tym zerowej) długości.
=== 6. Prawa dostępu ===
* Każdy plik ma określone prawa dostępu regulujące jaki dostęp mają do niego użytkownicy.
* Podstawowe atrybuty pliku określają możliwości jego:
* odczytu //**r**ead//
* zapisu //**w**rite//
* uruchamiania //e**x**ecute//
* Każdy plik ma właściciela i jest przypisany do grupy właścicieli.
* Z tego punktu widzenia użytkownicy systemu dzielą się na:
* właściciela //user//
* grupę właścicieli //group//
* pozostałych użytkowników //others// (//others = all - user - group//)
=== 7. Atrybuty pliku ===
* Wynik polecenia ''ls -l'':
-rwxrwxrwx N uzytkownik grupa rozmiar data nazwa
* Prawa dostępu:
- rwx rwx rwx
TYPE USER GROUP OTHERS
* Typy plików: ''TYPE: - d b c l p s''
* Przykład:
$ ls -l cruise
-rw-r--r-- 1 tom staff 683 Jul 4 2000 cruise
$ ls -l /tmp/cruise
-rwxr-xr-x 1 tom staff 783 Jul 4 2000 /tmp/cruise
=== 8. SUID, SGID i sTicky bit ===
* SUID - //set user id// - pozwala na uruchomienie programu z prawami właściciela tego pliku
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 31704 lis 14 15:41 /usr/bin/passwd
* SGID - //set group id// - pozwala na uruchomienie danego pliku z prawami grupy tego pliku
* SGID - //set group id// - w przypadku katalogu, sprawia, że nowo-tworzone pliki, należą do tej grupy, do której należy katalog, a nie do grupy z uprawnieniami której pracuje użytkownik
* sTicky bit - pliki w katalogu z ustawionym sticky bit mogą być usuwane lub zmieniane tylko przez właściciela danego pliku lub katalogu
$ ls -l | grep tmp
drwxrwxrwt 22 root root 12288 lis 14 15:41 tmp
=== 9. Zmiana praw dostępu ===
* Prawa dostępu zmienia się przy pomocy polecenia **chmod** (ang. //change mode//): chmod prawa nazwa_pliku
* gdzie prawa: ''ugoa +-= rwx [, ugoa +-= rwx]''
* Na przykład:
chmod u+r cruise; chmod u-w cruise
chmod g+x,o-r cruise
chmod u+s,g+s,+t tmp/
* Numeryczne prawa dostępu
r=4, w=2, x=1
su=4, sg=2, t=1
chmod NNNN plik
* Na przykład:
chmod 755 plik
chmod u=rwx,g=rx,o=rx plik
chmod 644 plik
chmod u=rw,g=r,o=r plik
chmod 44 plik
chmod 0044 plik
* Administrator może zmieniać właściciela **chown** i grupę **chgrp** pliku:
chown user plik
chgrp grupa plik
=== 10. Domyślne prawa, umask ===
$ umask
0022
$ umask -S
u=rwx,g=rx,o=rx
$ touch nowy1 ; ls -l nowy1
-rw-r--r-- 1 gjn gjn 0 Feb 26 20:39 nowy1
$ umask 700 ; touch nowy2 ; ls -l nowy2
----rw-rw- 1 gjn gjn 0 Feb 26 20:40 nowy2
$ umask 077 ; touch nowy3 ; ls -l nowy3
-rw------- 1 gjn gjn 0 Feb 26 20:40 nowy3
$ umask 000 ; touch nowy4 ; ls -l nowy4
-rw-rw-rw- 1 gjn gjn 0 Feb 26 20:40 nowy4
=== 11. Prawa do katalogów ===
* //write// -> zapis do katalogu
* //read// -> odczyt zawartości (spisu plików!), możliwość wykonania **ls**
* //execute// -> dostęp do zawartości (plików), możliwość wykonania **cd**
Przykład:
$ chmod a=rx katalog
$ ls katalog
plik
$ cd katalog
$ cd ..
$ chmod a=r katalog ; ls katalog
plik
$ cd katalog
sh: cd: katalog: Permission denied
$ chmod a=x katalog ; cd katalog
$ ls
ls: .: Permission denied
=== 12. Dowiązania symboliczne ===
* są wskaźnikami, skrótami do plików,
* pozwalają na udostępnianie pliku pod różnymi nazwami, w różnych katalogach,
* tworzenie przy pomocy ''ln -s'': ln -s plik dowiazanie
* polecenie ''ls -L'' wyświetla pliki na które wskazuje link symboliczny.
* bez opcji ''-s'' -> dowiązania sztywne,
* liczba dowiązań sztywnych do pliku to ''N'' w ''ls -l''
-rwxrwxrwx N uzytkownik grupa rozmiar data nazwa
=== 13. Midnight Commander ===
Jest to program do zarządzania plikami. Obsługuje się go podobnie jak inne typu "commander". Dodatkowo:
* zmiana praw dostępu: ''C-x c''
* notacja C-x oznacza: wciśnij równocześnie C-x (więcej na [[.:lab_shell|kolejnych zajęciach]])
* dostęp do klawiszy Fn (np. F1) przez Esc-n (np. Esc-1)
* //lynx-like motion// w konfiguracji
* wiele innych możliwości...
Z MC dostępny jest edytor: **mcedit**.
==== Ćwiczenia ====
=== I. Polecenia ===
* sprawdzić w manualu opis poleceń //ls(1)// //cp(1)// //mkdir(1)// //rm(1)//
* jakie opcje tych poleceń wyświetlają opis argumentów?
* w przypadku **ls** przetestować działanie opcji ''l a A F d R'', w przypadku **mkdir** opcji ''p m'', dla **rm** ''f'' i ''R''
* dla poznanych powyżej opcji przetestować zmianę kolejności i łączenie
* znaleźć opcje **ls**, które przyjmują argumenty; przetestować je; na co należy zwrócić uwagę przy łączeniu?
* należy sprawdzić, czy nie są zdefiniowane aliasy zmieniające pracę używanych poleceń (polecenie un/alias)
* przy czytaniu manuala można przełączyć sesję na pracę w języku polskim przy pomocy ''export LANG=pl_PL.UTF-8'' (o ile jest dostępny dla danej strony), można też spróbować ustawić inne języki, np. ''fr_FR.UTF-8'', czy ''de_DE.UTF-8''.
=== II. Pliki ===
* przetestować działanie wszystkich poznanych poleceń do obsługi plików i katalogów
* jak przejść do katalogu domowego na różne sposoby?
* w katalogu domowym założyć taką strukturę katalogów i plików:
unix/
unix/lab2/
unix/lab2/alfa/
unix/lab2/alfa/one
unix/lab2/beta/
unix/lab2/beta/two
unix/lab2/beta/prima/
unix/lab2/beta/prima/three
* pliki można zakładać przy pomocy jednego z poleceń:
echo "jakis napis" > plik # tworzy plik o nazwie "plik" z zawartoscia "jakis napis"
touch plik # tworzy pusty plik o nazwie "plik"
* wynik można sprawdzić przy pomocy **tree** (o ile jest dostępne w systemie)
* poruszając się po stworzonej strukturze należy przetestować działanie poleceń **cd** i **pwd** wykorzystując bezwzględne i względne ścieżki dostępu, a tym katalogi specjalne ''.'' i ''..''
* przetestować działanie metaznaków (gwiazdka, pytajnik) z poleceniem **ls** w katalogu ''/usr/bin''
* jak przejść do katalogu poprzedniego?
* jak przejść do katalogu domowego podanego użytkownika?
=== III. Prawa dostępu ===
* przeczytać podręcznik do **chmod** i sprawdzić sposób działania polecenia
* przetestować zmiany praw dostępu na plikach stworzonych w strukturze ''unix/lab2''
* odczyt testować przy pomocy ''cat plik''
* zapis przy pomocy ''echo "cos" >> plik''
* uruchamianie przy pomocy ''./plik''
* wykonać ćwiczenia w parach (wykonanie ćwiczeń w parach uzależnione jest od aktualnej konfiguracji systemu)
* ćwiczenie podobne do powyższego, aby obserwować wpływ zmiany praw dostępu na możliwości dostępu do plików drugiej osoby
* prawa dostępu na katalogach - próbuj czytać pliki w katalogach drugiej osoby: czym różni się //read// od //execute//? sprawdzić działanie **pwd**, **ls** i cd przy różnych kombinacjach tych praw (szczególnie: tylko //read//, tylko //execute//)
* jakie muszą być spełnione warunki aby użytkownik A mógł tworzyć katalogi w katalogu, który należy do użytkownika B, a co wystarczy do zapisu plików w katalogu?
* prawa numeryczne: sposób działania i użycie; czym się różnią od symbolicznych?
* numeryczne prawa dostępu a polecenie umask, sprawdzić działanie dla różnych wartości.
* oglądnąć bity //SUIG/sTicky// na plikach/katalogach:
ls -ld /tmp
ls -l /usr/bin/passwd
=== IV. Linki ===
* przeczytać opis do //ln(1)//
* stworzyć dowiązania symboliczne do plików przy pomocy ''ln -s'': ln -s plik dowiazanie
* co się dzieje przy czytaniu, zapisywaniu, uruchamianiu dowiązania?
* co przy jego usuwaniu?, a co przy usuwaniu samego pliku?
* sprawdzić działanie dowiązań do katalogów; jak działa **pwd**, co dają opcje ''P L''
=== V. Midnight Commander ===
* Uruchomić Midnight Commander, **mc** i zmienić prawa dostępu do wybranego pliku za pomocą ''C-x c''.