Tab
sau apăsând de două ori tasta Tab
pentru a vă afișa toate posibilitățile. Vă va ajuta să rulați mai repede comenzi. În plus, vă ajută și să nu greșiți; vă completează fișierul și nu trebuie să-l scrieți voi (poate greșit) de mână.
touch
, mkdir
, rm
sau rmdir
), rulați comanda ls -l
pentru a verifica faptul că a fost creat (si a investiga permisiunile).cd
), rulați comanda ls
sau pwd
pentru a verifica faptul că ați ajuns unde doreați.chmod
, chown
sau chgrp
), rulați comanda ls -l
pentru a verifica noile permisiuni sau noua posesie.ln -s
), rulați comanda ls -l
pentru a verifia faptul că noul link pointează unde trebuie.mkfs…
), rulați comanda file -s
, cu argument partiția, pentru a verifica sistemul de fișiere de pe aceasta.mount
sau umount
), rulați comanda mount
fără parametri pentru a lista partițiile montate.ps
pentru a verifica existența procesului.adduser
, rulați comanda id user_name
, cu argument numele utilizatorului, pentru a verifica existența utilizatorului sau getent passwd user_name
pentru a vedea setarile lui.
Alt+Ctrl+t
. În terminal clonați repository-ului oficial de USO folosind comanda:
student@uso:~$ git clone https://github.com/systems-cs-pub-ro/uso
În directorul ~/uso/lab05
găsiți fișierele și directoarele necesare pentru parcurgerea exercițiilor acestui laborator.
În laboratorul precedent am aflat că într-un sistem pot exista mai mulți utilizatori. Totuși, fiecare utilizator trebuie sa poată avea fișierele lui personale care să nu poată fi modificate de un alt utilizator fără permisiunea sa, iar unele fișiere sau resurse trebuie să nu poată fi accesate decât de către utilizatorul privilegiat (root). În alte cuvinte trebuie să avem o metodă de a controla accesul utilizatorilor la diversele elemente ale sistemului.
Abordarea utilizată în Linux este de a folosi permisiuni. Acestea dictează ce operații (de scriere, citire sau executare) poate să efectueze un utilizator asupra unui fișier sau director. Ele sunt împărțite în trei categorii:
Pentru fiecare dintre cele trei categorii există trei permisiuni:
Ordinea în care se aplică aceste permisiuni este: dacă utilizatorul este deținătorul fișierului, atunci se aplică permisiunile pentru owner; dacă face parte din grupul deținător, atunci se aplică permisiunile pentru group; dacă niciuna dintre condițiile precedente nu este adevărată, atunci se aplică permisiunile pentru others.
Pentru a vedea conținutul unui director folosim comanda ls
. Dacă îi pasăm argumentul -l
atunci comanda va lista conținutul în format lung, adică va afișă informații suplimentare. Să luăm un exemplu:
student@uso:~/uso/lab05/demo$ touch a student@uso:~/uso/lab05/demo$ sudo touch b student@uso:~/uso/lab05/demo$ ls a b student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw-r-- 1 student student 0 oct 6 23:58 a -rw-r--r-- 1 root root 0 oct 6 23:58 b
Să ne uităm mai indeaproape la rezultatul rulării comenzii ls -l
:
- | rw- | rw- | r-- | 1 | student | student | 0 | oct 6 23:58 | a |
---|---|---|---|---|---|---|---|---|---|
Tipul intrării | Permisiuni | Numărul de hardlink-uri | Deținătorul | Grupul | Dimensiunea | Data ultimei modificări | Numele fișierului |
-
), director (d
) sau altceva (rulați info ls
și citiți secțiunea 10.1.2).rw-
) corespunde deținătorului (owner), al doilea (rw-
) corespunde grupului (group) și ultimul (r--
) corespunde tuturor celorlalți utilizatori (others). Primul bit din fiecare grup reprezintă dreptul de citire, al doilea reprezintă dreptul de scriere iar al treilea dreptul de execuție. Valoarea 0 (-
) pe una dintre poziții indică lipsa dreptului respectiv, pe când valoarea 1 (r
, w
sau x
) indică prezența dreptului.
Pentru a modifica permisiunile unui fișier folosim comanda chmod
. Putem să specificăm noile permisiuni în două moduri:
u
pentru deținător, g
pentru grup, o
pentru ceilalți și a
pentru toți utilizatorii), specificăm dacă să adăugăm (+
), să retragem (-
) sau să setăm exact (=
) un set de permisiuni și permisiunile ce trebuie modificate (r
pentru citire, w
pentru scriere sau x
pentru execuție).student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw-r-- 1 student student 0 oct 6 23:58 a -rw-r--r-- 1 root root 0 oct 6 23:58 b student@uso:~/uso/lab05/demo$ chmod u+x a student@uso:~/uso/lab05/demo$ ls -l total 0 -rwxrw-r-- 1 student student 0 oct 6 23:58 a -rw-r--r-- 1 root root 0 oct 6 23:58 b student@uso:~/uso/lab05/demo$ chmod o=w a student@uso:~/uso/lab05/demo$ ls -l total 0 -rwxrw--w- 1 student student 0 oct 6 23:58 a -rw-r--r-- 1 root root 0 oct 6 23:58 b
x
), bitul 1 reprezintă dreptul de scriere (w
) și bitul 2 reprezintă dreptul de citire (r
). Prezența unei permisiuni este marcată prin valoarea 1 a bit-ului respectiv iar absența prin valoarea 0 a bit-ului respectiv.r w x | r - x | r - - |
---|---|---|
1 1 1 | 1 0 1 | 1 0 0 |
7 | 5 | 4 |
student@uso:~/uso/lab05/demo$ ls -l total 0 -rwxrw--w- 1 student student 0 oct 7 21:48 a -rw-r--r-- 1 root root 0 oct 7 21:48 b student@uso:~/uso/lab05/demo$ chmod 754 a student@uso:~/uso/lab05/demo$ ls -l total 0 -rwxr-xr-- 1 student student 0 oct 7 21:48 a -rw-r--r-- 1 root root 0 oct 7 21:48 b student@uso:~/uso/lab05/demo$ chmod 664 a student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw-r-- 1 student student 0 oct 7 21:48 a -rw-r--r-- 1 root root 0 oct 7 21:48 b
Pentru acest demo avem nevoie de utilizatorul gigi
pe care îl vom crea folosind comanda adduser
și apoi îl vom verifica folosind comanda id
:
student@uso:~/uso/lab05/demo$ sudo adduser gigi [...] student@uso:~/uso/lab05/demo$ id gigi uid=1001(gigi) gid=1001(gigi) groups=1001(gigi)
Pentru a modifica utilizatorul deținător al unui fișier folosim comanda chown
.
student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw-r-- 1 student student 0 oct 7 21:48 a -rw-r--r-- 1 root root 0 oct 7 21:48 b student@uso:~/uso/lab05/demo$ sudo chown gigi a student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw-r-- 1 gigi student 0 oct 7 21:48 a -rw-r--r-- 1 root root 0 oct 7 21:48 b
Acum să verificăm faptul că utilizatorul gigi
chiar poate scrie și citi din fișierul a
. Vom schimba utilizatorul curent din student
în gigi
și vom rula o comandă de modificare și una de afișare a conținutului.
student@uso:~/uso/lab05/demo$ sudo su gigi gigi@uso:~/uso/lab05/demo$ id uid=1001(gigi) gid=1001(gigi) groups=1001(gigi) gigi@uso:~/uso/lab05/demo$ echo "ana are mere" > a gigi@uso:~/uso/lab05/demo$ cat a ana are mere gigi@uso:~/uso/lab05/demo$ exit student@uso:~/uso/lab05/demo$ id uid=1000(student) gid=1000(student) groups=1000(student)
Pentru a modifica grupul deținător al unui fișier folosim comanda chgrp
. Alternativ putem folosi tot comanda chown
, dar îi vom pasa un parametru de forma owner:group
.
student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw-r-- 1 gigi student 0 oct 7 21:48 a -rw-r--r-- 1 root root 0 oct 7 21:48 b student@uso:~/uso/lab05/demo$ sudo chgrp gigi a student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw-r-- 1 gigi gigi 0 oct 7 21:48 a -rw-r--r-- 1 root root 0 oct 7 21:48 b student@uso:~/uso/lab05/demo$ sudo chown student:student a student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw-r-- 1 student student 0 oct 7 21:48 a -rw-r--r-- 1 root root 0 oct 7 21:48 b
sudo
.
Link-urile sunt legături între două puncte ale sistemului de fișiere. În general le folosim când vrem să ne ușurăm accesul la un fișier sau director, sau pentru a uniformiza accesul.
Sistemul de fișiere folosit în Linux permite două tipuri de link-uri:
Pentru a crea un link folosim comanda ln
. Pentru a crea un link simbolic trebuie să specificăm parametrul -s
.
student@uso:~/uso/lab05/demo$ touch a student@uso:~/uso/lab05/demo$ ln -s a sym student@uso:~/uso/lab05/demo$ ls -l total 0 -rw-rw---- 1 student student 0 oct 7 22:42 a lrwxrwxrwx 1 student student 1 oct 7 22:42 sym -> a
Observați că ultima linie începe cu l
, semnificând ca intrarea este un link simbolic. Mai mult, ls -l
ne arată și către ce fișier pointează link-ul: a.
student@uso:~/uso/lab05/demo$ echo "abc" > a student@uso:~/uso/lab05/demo$ cat a abc student@uso:~/uso/lab05/demo$ cat sym abc
Link-ul se comportă ca și fișierul către care pointează. Putem să le folosim ca fiind același fișier. Ce se întamplă totuși dacă mutăm fișierul destinație?
student@uso:~/uso/lab05/demo$ mv a .. student@uso:~/uso/lab05/demo$ cat sym cat: sym: No such file or directory
Link-ul nu mai funcționează mutat fișierul către care pointa. Această problemă nu poate fi rezolvată cu link-uri simbolice. Dacă vrem să putem muta fișierul destinație, trebuie sa folosim link-uri hard.
Un sistem de fișiere reprezintă modul de organizare a fișierelor pe un mediu de stocare pentru a le face mai ușor accesibile. Sistemul de fișiere folosit, în general, pe sistemele Linux se numește ext4. Pentru a vedea ce sisteme de fișiere există în sistem folosim comanda fdisk -l
.
student@uso:~/uso/lab05/demo$ sudo fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000de65a Device Boot Start End Blocks Id System /dev/sda1 * 2048 14680063 7339008 83 Linux /dev/sda2 14682110 16775167 1046529 5 Extended /dev/sda5 14682112 16775167 1046528 82 Linux swap / Solaris
fdisk
va merge în cazul majorității calculatoarelor, iar în cazul nostru va merge pentru calculatoarele din sala EG106. Se poate totuși să aveți partiții ce folosesc GPT (GUID Partition Table), cum este cazul stațiilor din sala EG306. În acest caz trebuie să folosiți comanda gdisk
.
student@uso-eg306:~$ sudo fdisk -l /dev/sda WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted. Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0xc90ab212 Device Boot Start End Blocks Id System /dev/sda1 1 976773167 488386583+ ee GPT Partition 1 does not start on physical sector boundary. student@uso-eg306:~$ sudo gdisk -l /dev/sda GPT fdisk (gdisk) version 0.8.8 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Disk /dev/sda: 976773168 sectors, 465.8 GiB Logical sector size: 512 bytes Disk identifier (GUID): ED4BC435-E352-403E-898B-09B7A9BA2F2E Partition table holds up to 128 entries First usable sector is 34, last usable sector is 976773134 Partitions will be aligned on 2048-sector boundaries Total free space is 139800557 sectors (66.7 GiB) Number Start (sector) End (sector) Size Code Name 1 2048 400001023 190.7 GiB 8300 2 400001024 800002047 190.7 GiB 8300 3 800002048 816003071 7.6 GiB 8200 4 816003072 836974591 10.0 GiB 8300 Linux filesystem
Pentru a afla informații despre unul dintre aceste sisteme de fișiere, folosim comanda df
. Pentru a face rezultatul mai ușor de citit pentru noi, vom folosi argumentul -h
(human-readable).
student@uso:~$ df -h / Filesystem Size Used Avail Use% Mounted on /dev/sda1 6,8G 3,3G 3,2G 52% /
Pentru a afla informații despre cât spațiu ocupă pe disc un director sau fișier folosim comanda du
. Din nou vom folosi argumentul -h
. Putem folosi și argumentul -s
pentru a primi doar totalul pentru fiecare director primit ca argument.
student@uso:~/uso$ du -h lab05 0 lab05/demo 3.6M lab05/star_wars_episode_iv_a_new_hope/death_star 0 lab05/star_wars_episode_iv_a_new_hope/millenium_falcon/smuggling_compartment 0 lab05/star_wars_episode_iv_a_new_hope/millenium_falcon 512 lab05/star_wars_episode_iv_a_new_hope/tatooine/mos_eisley 512 lab05/star_wars_episode_iv_a_new_hope/tatooine 0 lab05/star_wars_episode_iv_a_new_hope/yavin/plans 0 lab05/star_wars_episode_iv_a_new_hope/yavin 3.6M lab05/star_wars_episode_iv_a_new_hope 3.6M lab05/ student@uso:~/uso$ du -hs lab05 3.6M lab05/
Un sistem de fișiere nu poate fi folosit decât dacă este montat. Comanda cu ajutorul căreia putem face asta este mount
. Fără niciun argument ne va spune ce sisteme de fișiere sunt montate și în ce directoare sunt montate.
student@uso:~/uso/lab05/demo$ mount /dev/sda1 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) [...]
Comanda returnează, pe fiecare linie, fișierul bloc, punctul din ierarhia de fișiere unde este montat, tipul sistemului de fișiere și flag-urile cu care a fost montat. Să luăm ca exemplu linia /dev/sda1 on / type ext4 (rw,errors=remount-ro)
: /dev/sda1
este fișierul bloc, /
este punctul în care este montat (chiar în rădăcina sistemului de fișiere), ext4
este tipul sistemului de fișiere și (rw,errors=remount-ro)
sunt flag-urile cu care a fost montat (read-write iar in caz de eroare va fi remontat read-only).
Pentru a putea să monteze un sistem de fișiere trebuie să îi specificăm ce tip este acesta, fișierul bloc unde se află și directorul în care să îl monteze.
student@uso:~/uso/lab05/demo$ mkdir mnt student@uso:~/uso/lab05/demo$ ls mnt student@uso:~/uso/lab05/demo$ sudo mkfs.ext4 /dev/sda4 student@uso:~/uso/lab05/demo$ sudo mount -t ext4 /dev/sda4 mnt student@uso:~/uso/lab05/demo$ ls mnt lost+found
/dev/sda4
nu avea niciun sistem de fișiere pe ea. Folosind comanda sudo mkfs.ext4 /dev/sda4
am creat un sistem de fișiere de tip ext4 pe partiția /dev/sda4
Operația opusă montării este demontarea, care se realizează cu ajutorul comenzii umount
. Acesteia nu trebuie să îi specificăm decât directorul unde este montat sistemul de fișier ce se dorește a fi demontat sau fișierul bloc.
student@uso:~/uso/lab05/demo$ sudo umount mnt student@uso:~/uso/lab05/demo$ ls mnt
sudo
.
/home/student
. Clonați repository-ului oficial de USO folosind comanda:
student@uso:~$ git clone https://github.com/systems-cs-pub-ro/uso
În directorul ~/uso/lab05
găsiți fișierele și directoarele necesare pentru parcurgerea exercițiilor acestui laborator.
Ca administratori ai infrastructurii IT a școlii de care răspundeți ați primit următorul excel cu nume de utilizatori și grupuri din care trebuie să facă parte, conform cu politica școlii.
Sarcina voastră este să adăugați în sistem grupurile și apoi utilizatorii, utilizatorii să îi înscrieți în grupuri conform cu excelul primit.
De asemenea, trebuie să configurați următoarele parole:
student
profesor007
admin1234
Pentru cei care sunt în mai multe grupuri simultan alegeți parola mai dificilă (să conțină cifre diferite).
/etc/passwd
și pentru grupuri /etc/group
. De asemenea, pentru a vedea grupurile din care face parte un anumit utilizator (să zicem dan
) și totodată existența sa în sistem mai putem folosi comanda:
student@uso~$ id dan
finger
urmată de numele utilizatorului, ca de exemplu comanda de mai jos:
student@uso~$ finger dan
În directorul /home/student/uso/lab05/cursuri/
vor trebui să lucreze atât utilizatorul alex
, cât și mihai
. Configurat permisiunile necesare astfel încât cei doi să poată modifica conținutul directorului, iar restul utilizatorilor să îl poată doar vizualiza.
alex
și mihai
sunt parte a aceluiași grup (profesori
). Va trebui
/home/student/uso/lab05/cursuri/
în grupul profesori
(folosind comanda chgrp
)chmod
)
student
în alex
și mihai
și să vedeți dacă aceștia pot face modificări în director; ceilalți utilizatori nu trebuie să poată face modificări în director.
Folosiți alte tab-uri de terminal pentru verificare.
Folosiți comanda sudo su
urmată de numele utilizatorului; apoi faceți modificări în director, delogați-vă folosind combinația de taste Ctrl+D
și repetați procesul pentru alt utilizator.
/home/student/uso/lab05/teste_curs
. În acest director se află fișierele test-1.txt
și test-2.txt
care trebuie protejate. Setați permisiunile necesare fișierelor astfel încât utilizatorii care nu se află în grupul profesor
să nu aibă nicio permisiune asupra lui./home/student/uso/lab05
. În acest director se află fișierul coduri_alarma
în care se găsesc codurile de acces la sistemele de securitate din diferite săli din facultate. Vrem ca doar profesorii și administratorii să aibă acces asupra acestui fișier, prin urmare realizați modificările necesare astfel încât doar utilizatorii alex
, mihai
, geo
și razvan
să aibă drept de citire și scriere, iar toți ceilați utilizatori să nu aibă niciun drept asupra fișierului.
coduri_alarma
.
Fiind autentificați ca utilizatorul student
, intrați în directorul /home/student/uso/lab05
. Creați un link simbolic cu numele EC
către fișierul corp_EC
din directorul cladiri
. Folosiți calea cea mai scurtă, relativă: cladiri/corp_EC
. Verificați faptul că puteți accesa linkul creat folosind comanda:
student@uso:~/uso/lab05$ cat EC EC101 EC004 EC102 EC105
Mutați fișierul EC (linkul) în directorul /home/student
și rulați din nou comanda cat
cu argumentul ~/EC
. Observați că primiți eroare datorită faptului că ați mutat linkul și, așadar, calea relativă cu care a fost el creat nu mai este corectă.
Mergeți din nou în directorul /home/student/uso/lab05/cladiri
. Acest director conține fișierul corp_EC
. Aflați acum în directorul /home/student/uso/lab05/cladiri
, creați din nou un link simbolic de la fișierul corp_EC
către directorul /home/student/uso/lab05
; numiți link-ul simbolic new_EC
. Mutați apoi linkul creat (new_EC
) în directorul home al utilizatorului student
și verificați că de această dată puteți accesa fișierul corp_EC
prin intermediul linkului, chiar dacă acesta din urmă a fost mutat.
În ciuda eforturilor de securizare a codurilor de alarmă, fișierul /home/student/uso/lab05/alarm_codes.iso
, a rămas accesibil. Inspectați întâi tipul fișierului alarm_codes.iso
folosind comanda file
. Rețineți tipul sistemului de fișiere de pe imagine și, folosind această informație, montați imaginea după procedura descrisă în secțiunea montarea sistemelor de fișiere în directorul ~/uso/lab05/coduri
.
-t iso9660
.
Adică veți folosi o comandă de forma
mount -t iso9660 /path/to/iso/file /path/to/mount/point
Accesați apoi codurile de alarmă folosind comanda:
student@uso:~/uso/lab05$ cat coduri/coduri_alarma EG106: 1234 EG306: 5678 EG208: 0208
La final, demontați sistemul de fișiere montant în directorul /home/student/uso/lab05/coduri
folosind comanda umount
. Căutați în paginile de manual care este formatul comenzii umount
.
Intrați în directorul /home/student/uso/lab05/
. Aici veți găsi fișierul restart_servers
. Setați permisiunile necesare astfel încât fișierul să poată fi executat doar de către utilizatorul geo
. După ce ați făcut aceasta lansați fișierul în execuție.
Creați în directorul home/student/uso/lab05
un director cu numele circularity
. În directorul circularity
creați 3 linkuri simbolice care să se refere unul pe celălalt, într-o manieră circulară. De exemplu: link_a
→ link_b
, link_b
→ link_c
și link_c
→ link_a
.
student@uso:~/uso/lab05/circularity$ ls -l total 0 lrwxrwxrwx 1 student student 6 nov 1 15:06 link_a -> link_b lrwxrwxrwx 1 student student 6 nov 1 15:06 link_b -> link_c lrwxrwxrwx 1 student student 6 nov 1 15:06 link_c -> link_a
Rulați acum comanda cat
pe unul dintre linkuri și observați eroarea întoarsă.
Am văzut la exercițiul 3 cum putem proceda pentru a acorda drepturi asupra unui fișier unor utilizatori din două grupuri diferite: adăugăm un grup nou, adăugăm toți utilizatorii respectivi în grupul nou și setăm grupul nou ca fiind grupul owner al fișierului. Dar ce se întâmplă dacă în viitor adăugăm un utilizator nou, ion
, în grupul profesori? Am vrea să aibă implicit și el drepturi asupra fișierului coduri_alarma
, însă acest lucru nu este posibil folosind doar permisiunile de bază.
Pentru acest task, putem folosi însă liste de acces sau ACLs (Access Control Lists). Manipularea listelor de acces se face cu comanda setfacl
. Pentru a verifica ACL-urile, putem folosi comanda getfacl
. După ce citiți informațiile de la acest link realizați modificările necesare astfel încât orice utilizator care face parte din grupul profesor
sau admin
să poată scrie și citi fișierul coduri_alarma
din directorul /home/student/uso/lab05/
, iar toți ceilalți utilizatori să nu aibă niciun drept. Verificați acest lucru adăugând încă un utilizator în oricare dintre cele două grupuri.