Un director este o listă de fișiere și subdirectoare (mai precis, pentru fiecare intrare: un nume de fișier sau un nume de subdirector, utilizator deținător, grup deținător, biți de permisiune, permisiuni extinse, un pointer către locația de pe disc a fișierului/subdirectorului și suplimentar metadate ezoterice). Un director are un proprietar și un grup. Permisiunile directorului controlează ce utilizatori citesc, scriu și CD
în acel director. Dacă doriți să creați un fișier într-un director, trebuie să aveți permisiunea de a scrie în director. Dacă doriți să eliminați un fișier dintr-un director, trebuie să aveți permisiunea de a scrie în director. Dacă doriți să redenumiți un fișier, trebuie să aveți permisiunea de a scrie în director. Dacă doriți să modificați permisiunile unui fișier, trebuie să aveți permisiunea de a scrie în director. Toate acestea sunt modificări ale directorului, deci folosiți permisiunile directorului. (Există excepții legate de permisiunile extinse, pe care le-am lăsat deoparte aici.)
În cele ce urmează, voi continua să scriu „intrarea de director pe care o utilizați pentru a o accesa” deoarece pot exista mai multe intrări de director, deci nume potențial diferite, pentru un fișier din sistemul de fișiere. De fapt, mai multe intrări dintr-un singur director (având în mod necesar nume diferite) pot indica același fișier de pe disc, iar diferitele intrări pot avea utilizator, grup proprietar și permisiuni diferite.
O intrare de fișier dintr-un director are utilizator proprietar, grup proprietar și permisiuni. Dacă doriți să citiți conținutul unui fișier, intrarea din director pe care o utilizați pentru a-l accesa trebuie să vă permită accesul de citire. Dacă doriți să scrieți conținutul unui fișier, intrarea de director pe care o utilizați pentru a-l accesa trebuie să vă permită accesul la scriere. Dacă doriți să executați conținutul unui fișier, intrarea de director pe care o utilizați pentru a-l accesa trebuie să vă permită accesul de execuție.
Așa că haideți să analizăm exemplul dvs.
- Directorul de lucru actual este
~/tmp/
, deci utilizatorul curent este utilizatorul proprietar, grupul proprietar și are permisiuni de citire+scriere+execuție pentru director.
sudo touch c.txt
Aceasta creează un fișier cu utilizatorul proprietar rădăcină
având permisiuni de citire+scriere, grup rădăcină
având permisiuni de scriere și permisiuni de scriere pentru alți utilizatori. (4 = citiți, 2 = scrieți, 1 = executați; 6 = 4+2 = citiți + scrieți)
rm c.txt
are avertismentul/promptul "rm: eliminați fișierul gol obișnuit protejat la scriere „c.txt”?
„Acest avertisment înseamnă: utilizatorul actual are permisiuni de scriere în directorul curent, deci poate șterge acest fișier, dar utilizatorul actual are doar permisiuni de citire pentru conținutul acestui fișier, ceea ce sugerează că utilizatorul actual dorește să păstreze acest fișier împotriva modificărilor. Aceste două intenții sunt incompatibile, așa că se solicită îndrumări suplimentare.
- Selectați
y
și c.txt
este eliminat. Da. Aveți permisiunea de a șterge intrarea din director, deci atunci când răspundeți y
, intrarea este ștearsă din director. Conținutul fișierului nu este scris sau executat în niciun moment (care este ceea ce permisiunile de introducere a fișierului ar interzice).
Al doilea scenariu funcționează și el, dar nu pentru motivul pe care îl așteptați. vim
și mulți, mulți alți editori (inclusiv, ca exemplu aleatoriu, Microsoft Word), nu editează fișierul original. Ei copiază fișierul, apoi editează copia. Dacă editările nu sunt salvate, copia poate fi ștearsă. Dacă editările sunt salvate, fișierul original este șters din director și copia este redenumită cu numele originalului. Deci, să vedem ce se întâmplă.
testul mkdir
test cd
ls -laF
total 8
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 11:40 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:40 ../
Vedem că utilizatorul meu, neclară
și grupul meu, neclară
deține directorul curent, .
, iar 775 de permisiuni sunt setate (user neclară
: rwx, grup neclară
: rwx, altele: rx).
sudo vim d.txt
[furnizează parola]
[începe sesiunea vim]
[inserați modul]Bună.
Acum să trecem la un alt shell și să vedem ce se întâmplă în director.
[alt shell, nu sudo...]
test cd
ls -laF
total 20
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 11:44 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:44 ../
-rw------- 1 rădăcină rădăcină 12288 Oct 31 11:44 .d.txt.swp
Vedem că sudo vim
a creat un fișier temporar numit .d.txt.swp
cu proprietarii rădăcină.rădăcină
și modul 600
. Acum întoarceți-vă și salvați fișierul în sudo vim
sesiune și verificați din nou.
ls -laF
total 12
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 11:48 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:48 ../
-rw-r--r-- 1 rădăcină rădăcină 4 oct 31 11:48 d.txt
Vedem că intrarea în directorul fișierului temporar a fost modificată pentru a avea un nou nume și noi permisiuni. Utilizatorul actual este aici neclară
, care are doar permisiuni de citire pentru d.txt
, dar asta-i tot neclară
trebuie să deschidă fișierul într-un editor.
[prima sesiune, observați nu sudo...]
vim d.txt
[mergi la sfârșitul primului rând]
[adăuga. avertizat: „W10: Avertisment: modificarea unui fișier numai în citire”]
[introduceți un singur spațiu după „Bună.”]
De îndată ce am atașat
după Bună.
fișierul temporar vim a apărut în director.
[a doua sesiune]
ls -laF
total 16
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 11:53 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:52 ../
-rw-r--r-- 1 rădăcină rădăcină 4 oct 31 11:48 d.txt
-rw------- 1 fuzzy fuzzy 4096 Oct 31 11:53 .d.txt.swp
Acest director are permisiuni rwx pentru utilizator neclară
, deci crearea acestei intrări este permisă. Ca de obicei, vim
menține permisiunile fișierelor temporare foarte stricte.
[prima sesiune]
[ieșiți din modul de inserare]
[Esc]:w
[obține eroare: „E45: opțiunea „numai citire” este setată (adăugați ! pentru a înlocui)”]
Aceasta înseamnă că intrarea inițială a directorului nu are permisiuni de scriere pentru utilizatorul curent, neclară
. Aceasta are în mod normal semantica că fișierul nu trebuie modificat, deci vim
poate respecta acea semantică sau le poate suprascrie (deoarece permisiunile directorului permit neclară
pentru a elimina d.txt
intrare și redenumiți .d.txt.swp
la d.txt
). Pe care vrei?
[prima sesiune]
[Esc]:w!
Tu alegi să suprascrii.
Să vedem ce se întâmplă în director acum.
[a doua sesiune]
ls -laF
total 28
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 12:01 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 31 oct 12:00 ../
-rw-r--r-- 1 fuzzy fuzzy 5 oct 31 12:01 d.txt
-rw-r--r-- 1 fuzzy fuzzy 4 Oct 31 11:48 d.txt~
-rw------- 1 fuzzy fuzzy 12288 Oct 31 12:01 .d.txt.swp
Este posibil să nu vezi d.txt~
fişier. Poate am activat un vim
opțiunea de a salva întotdeauna o copie de rezervă a fișierului original. Nu-mi amintesc care este comportamentul implicit vim
este cu privire la această opțiune.
Acum există trei fișiere:
d.txt
-- versiunea modificată pe care tocmai am salvat-o. Conține „Bună.”. Salvările ulterioare vor înlocui acest fișier.
d.txt~
-- o copie de rezervă a fișierului original. Conține „Bună”. Această intrare de director a fost creată de un proces care rulează ca neclară
, la fel si neclară
proprietățile și permisiunile implicite ale lui.
.d.txt.swp
-- dosarul curent de lucru. Editările ulterioare vor fi periodic salvate automat în acest fișier.
Acum să terminăm cu asta vim
sesiune.
[prima sesiune]
[Esc]:q
și vezi din nou ce se întâmplă în sistemul de fișiere.
[a doua sesiune]
ls -laF
total 16
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 12:05 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 12:05 ../
-rw-r--r-- 1 fuzzy fuzzy 5 oct 31 12:01 d.txt
-rw-r--r-- 1 fuzzy fuzzy 4 Oct 31 11:48 d.txt~
Ambele fișiere au fost create de neprivilegiați neclară
, așa că au neclară
proprietățile și permisiunile implicite ale lui. neclară
a putut crea și șterge aceste intrări de director deoarece neclară
are permisiuni de scriere în directorul curent, .
.