Comprensione delle autorizzazioni e dei tipi di file UNIX


68

Non ho mai capito come chmodfunzionasse fino ad oggi. Ho seguito un tutorial che mi ha spiegato molto.

Ad esempio, ho letto che hai tre diversi gruppi di autorizzazioni:

  • proprietario ( u)
  • gruppo ( g)
  • tutti ( o)

Sulla base di questi tre gruppi, ora so che:

  • Se il file è di proprietà dell'utente, le autorizzazioni dell'utente determinano l'accesso.
  • Se il gruppo del file è uguale al gruppo dell'utente, l'autorizzazione del gruppo determina l'accesso.
  • Se l'utente non è il proprietario del file e non è nel gruppo, viene utilizzata l'altra autorizzazione.

Ho anche imparato che hai le seguenti autorizzazioni:

  • read ( r)
  • write ( w)
  • execute ( x)

Ho creato una directory per testare le mie nuove conoscenze acquisite:

mkdir test

Poi ho fatto alcuni test:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

Dopo aver preso in giro per un po 'di tempo, penso di aver finalmente capito chmode il modo in cui hai impostato il permesso usando questo comando.


Ma...

Ho ancora alcune domande:

  • Cosa significa dall'inizio?
  • Qual è il nome e l'uso dello slot contenitore e quali altri valori può contenere?
  • Come posso impostarlo e annullarlo?
  • Qual è il valore per questo d? (Dato che hai solo 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • Perché le persone a volte usano 0777invece di 777impostare le loro autorizzazioni?

Ma poiché non dovrei porre più domande, proverò a porle in una domanda.

Nel sistema basato su UNIX come tutte le distribuzioni Linux, riguardo alle autorizzazioni, a cosa serve la prima parte ( d) e a che serve questa parte delle autorizzazioni?


3
Per favore, la prossima volta prova a porre solo una domanda, le domande multiple di solito sono dannose per il riferimento e quasi mai affrontate tutte allo stesso tempo.
Kiwy,

1
@Kiwy mi dispiace, ho pensato di farlo in questo modo perché riguarda lo stesso argomento. Se vuoi, puoi suggerire un titolo migliore per la mia domanda per migliorarne il riferimento.
Peter,

1
Per inciso, il valore per la "d" è 040000 - può essere trovato nei file di intestazione sotto il nome S_IFDIR. Non lo si utilizza quando si imposta la modalità file, ma la stat()funzione restituisce effettivamente il valore 040750 per drwxr-x---.
Casuale 832

2
@jamesqf In realtà, ora che capisco come mappano i codici ottali, è più semplice per me pensare in quel modo.
HalosGhost

4
@Peter: non ci sono domande stupide - solo stupidi che non imparano perché hanno paura di fare.
Margarciaisaia,

Risposte:


117

Risponderò alle tue domande in tre parti: tipi di file, autorizzazioni e casi d'uso per le varie forme di chmod.

Tipi di file

Il primo carattere ls -lnell'output rappresenta il tipo di file; dsignifica che è una directory. Non può essere impostato o non impostato, dipende da come è stato creato il file. Puoi trovare l'elenco completo dei tipi di file nella documentazione di ls ; quelli che probabilmente incontrerai sono

  • -: File “normale”, creato con qualsiasi programma in grado di scrivere un file
  • b: è possibile creare file speciali a blocchi, in genere dispositivi a disco o di partizione mknod
  • c: file speciale di caratteri, può anche essere creato con mknod(vedi /devper esempi)
  • d: directory, può essere creata con mkdir
  • l: collegamento simbolico, può essere creato con ln -s
  • p: named pipe, può essere creato con mkfifo
  • s: socket, può essere creato con nc -U
  • D: door , creato da alcuni processi server su Solaris / openindiana.

permessi

chmod 0777viene utilizzato per impostare tutte le autorizzazioni in un'unica chmodesecuzione, piuttosto che combinare le modifiche con u+ecc. Ciascuna delle quattro cifre è un valore ottale che rappresenta un insieme di autorizzazioni:

  • suid, sgidE “appiccicosa” (vedi sotto)
  • autorizzazioni utente
  • permessi di gruppo
  • "Altre" autorizzazioni

Il valore ottale viene calcolato come la somma delle autorizzazioni:

  • "Leggi" è 4
  • "Write" è 2
  • "Esegui" è 1

Per la prima cifra:

  • suidè 4; i binari con questo set di bit vengono eseguiti come utente proprietario (comunemente root)
  • sgidè 2; i file binari con questo set di bit vengono eseguiti come gruppo proprietario (questo è stato utilizzato per i giochi in modo da poter condividere punteggi più alti, ma spesso è un rischio per la sicurezza se combinato con vulnerabilità nei giochi) e i file creati nelle directory con questo set di bit appartengono al gruppo proprietario della directory per impostazione predefinita (è utile per creare cartelle condivise)
  • "Appiccicoso" (o "eliminazione limitata") è 1; i file nelle directory con questo set di bit possono essere eliminati solo dal loro proprietario, dal proprietario della directory o root(vedere /tmpun esempio comune di questo).

Vedi la chmodmanpage per i dettagli. Si noti che in tutto ciò ignoro altre funzionalità di sicurezza che possono alterare le autorizzazioni degli utenti sui file (SELinux, file ACL ...).

I bit speciali vengono gestiti in modo diverso a seconda del tipo di file (file o directory normale) e del sistema sottostante. (Questo è menzionato nella chmodmanpage.) Sul sistema che ho usato per testarlo (con coreutils8.23 su un ext4filesystem, con kernel Linux 3.16.7-ckt2), il comportamento è il seguente. Per un file, i bit speciali vengono sempre cancellati a meno che non siano impostati in modo esplicito, quindi chmod 0777è equivalente chmod 777ed entrambi i comandi cancellano i bit speciali e danno a tutti i permessi completi sul file. Per una directory, i bit speciali non vengono mai cancellati completamente utilizzando la forma numerica a quattro cifre, quindi in effetti chmod 0777è equivalente achmod 777ma è fuorviante poiché alcuni dei bit speciali rimarranno così come sono. (Una versione precedente di questa risposta ha ottenuto questo torto.) Per cancellare i bit speciali sulle directory è necessario utilizzare u-s, g-se / o o-tesplicitamente o specificare un valore numerico negativo, così chmod -7000sarà chiaro tutti i bit speciali in una directory.

In ls -luscita, suid, sgide “appiccicoso” appare al posto della xvoce di: suidè so Sinvece dell'utente del x, sgidè so Sal posto del gruppo di x, e “appiccicoso” è to Tal posto di altri x. Una lettera minuscola indica che sono impostati sia il bit speciale che il bit eseguibile; una lettera maiuscola indica che è impostato solo il bit speciale.

Le varie forme di chmod

A causa del comportamento sopra descritto, l'uso delle quattro cifre complete chmodpuò essere fonte di confusione (almeno risulta che ero confuso). È utile quando si desidera impostare bit speciali e bit di autorizzazione; altrimenti i bit vengono cancellati se si sta manipolando un file, conservati se si sta manipolando una directory. Quindi chmod 2750assicura che otterrai almeno sgided esattamente u=rwx,g=rx,o=; ma chmod 0750non cancellerà necessariamente i bit speciali.

L'uso delle modalità numeriche al posto dei comandi di testo ( [ugo][=+-][rwxXst]) è probabilmente più un caso di abitudine e lo scopo del comando. Una volta che sei abituato a usare le modalità numeriche, spesso è più semplice specificare la modalità completa in quel modo; ed è utile essere in grado di pensare alle autorizzazioni usando le modalità numeriche, poiché molti altri comandi possono usarle ( install, mknod...).

Alcune varianti di testo possono tornare utili: se vuoi semplicemente assicurarti che un file possa essere eseguito da chiunque, chmod a+xlo farà, indipendentemente dalle altre autorizzazioni. Allo stesso modo, +Xaggiunge l'autorizzazione di esecuzione solo se una delle autorizzazioni di esecuzione è già impostata o il file è una directory; questo può essere utile per ripristinare le autorizzazioni a livello globale senza dover ricorrere a casi speciali contro directory. Pertanto, chmod -R ug=rX,u+w,o=equivale ad applicare chmod -R 750a tutte le directory e file eseguibili e chmod -R 640a tutti gli altri file.


Tuttavia, le altre risposte sono state abbastanza buone, hai davvero passato un po 'di tempo a rispondere a questa domanda. Grazie.
Peter,

Su * Le directory BSD si comportano come se il loro sgidbit fosse sempre impostato, indipendentemente dal suo valore reale. Su FreeBSD il suidbit può essere configurato per agire in modo analogo a sgid(cioè i file e le sottodirectory create all'interno avranno lo stesso proprietario della directory), a condizione che il filesystem sottostante lo supporti e sia montato con l' suiddiropzione.
lcd047

" +Xaggiunge l'autorizzazione di esecuzione solo se una delle autorizzazioni di esecuzione è già impostata o il file è una directory" grazie @ stephen-kitt manca la documentazione "è già impostata" mi stava davvero lanciando per un loop!
Ryan Fisher,

39

Quindi, le autorizzazioni in Linux sono molto importanti. Proverò a fare una breve spiegazione.

Per pezzi di una modalità file

Ogni file Unix ha una serie di autorizzazioni che determinano se è possibile leggere, scrivere o eseguire il file. L'esecuzione di ls -l visualizza le autorizzazioni. Ecco un esempio di tale display:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Allego un'immagine di pezzi di una modalità file:

inserisci qui la descrizione dell'immagine

Il tipo può essere diverso. Per esempio:

  • d (directory)
  • c (dispositivo personaggio)
  • l (link simbolico)
  • p (chiamato pipe)
  • s (presa)
  • b (dispositivo a blocchi)
  • D (porta, non comune sui sistemi Linux, ma è stato portato)

Se si desidera impostare alcune autorizzazioni per tutte le directory, è possibile utilizzare l'attributo R, ad esempio:

chmod -R 777 /some/directory/

Per chmod 777 vs 0777

Il chmodcomando di solito prevede che l'ingresso sia un numero ottale, lo zero iniziale si riferisce al valore della tripletta del bit sticky / sgid / suid. In C, tuttavia, farebbe la differenza, poiché 777verrebbe tradotto in 01411(ottale), impostando così il bit appiccicoso (vedi la chmod(2)pagina man), leggi i permessi per il proprietario e il bit eseguibile per il gruppo e altri (che è una combinazione piuttosto strana) .

MODIFICA 1

Ho trovato altre foto sulle autorizzazioni di Linux e allego per capire più facilmente: Autorizzazioni per file UNIX


5
Ti sbagli sul 777 contro lo 0777. Entrambi sono ottali (in questo caso i decimali non hanno alcun senso), ma in forma di quattro caratteri, la prima cifra imposta i bit speciali (appiccicosi e setuidi).
Orione,

3
@orion Occasionalmente in realtà è vero, ad es. in un codice simile a C chmod(777)sarebbe effettivamente l'equivalente dell'esecuzione chmod 1411(ovvero il chmodcomando con argomento 1411).
peterph,

2
... che nel caso di syscall (o del suo wrapper) e del binario con lo stesso nome può essere un po 'confuso.
peterph,

3
Python Maestro Race ha risolto questo problema indietro vietando tutti i "numeri" che iniziano con 0, costringendo l'utente a essere esplicito, se vogliono qualcosa di diverso da decimale, esadecimale ad esempio: 0x1FF, binaria: 0b111111111o ottale: 0o777. PYTHON POWER
Nick T,

Fonte immagine?
rugk,

10

dsignifica che è una directory, se hai un file lo è -e se è un link troverai un l. Non può essere impostato / non impostato.

Se usi 0777 come permessi stai dando il pieno controllo (leggi + scrivi + esegui) a ogni utente / gruppo del sistema. È un modo pigro per risolvere i problemi quando si hanno utenti / gruppi che non possono accedere a directory / file.

Ad esempio, se si elenca il contenuto di una directory e si ottiene questo:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so è un file di proprietà dell'utente root e del gruppo root. Il proprietario ha accesso in lettura e scrittura, il gruppo ha solo accesso in lettura e qualsiasi altro utente ha accesso in lettura. Questo può essere tradotto come 644.

Se lo cambio in 777 sarà simile al seguente:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so


7

Dopo aver ottenuto la risposta alla mia domanda qui e aver fatto qualche ricerca sul risultato, ho trovato un articolo che spiega tutto molto bene. Vorrei condividere alcune parti di questo articolo qui per riferimenti futuri.

Visualizzazione delle autorizzazioni

Per poter utilizzare le chmodautorizzazioni per modificare un file o una directory, è necessario innanzitutto conoscere la modalità di accesso corrente. È possibile visualizzare il contenuto di una directory nel terminale da cdquella directory e quindi utilizzare:

$ ls -l

Il -lpassaggio è importante perché l'utilizzo lssenza di esso mostrerà solo i nomi di file o cartelle nella directory.

Di seguito è riportato un esempio di utilizzo ls -lnella mia home directory:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

Cosa significano le colonne

La prima colonna è il tipo di ciascun file:

  • - indica un file normale.
  • d indica una directory, ovvero una cartella contenente altri file o cartelle.
  • p indica una pipa denominata (aka FIFO).
  • l indica un collegamento simbolico.

Le lettere successive sono le autorizzazioni, questa prima colonna è ciò di cui saremo maggiormente interessati. La seconda è il numero di collegamenti presenti in un file, che possiamo tranquillamente ignorare. La terza colonna ha due valori / nomi: la prima (nel mio esempio 'peter') è il nome dell'utente proprietario del file. Il secondo valore ("utenti" nell'esempio) è il gruppo a cui appartiene il proprietario (Altre informazioni sui gruppi).

La colonna successiva è la dimensione del file o della directory in byte e le informazioni successive sono le date e le ore in cui il file o la directory sono stati modificati l'ultima volta, e ovviamente il nome del file o della directory.

Cosa significano le autorizzazioni

Le prime tre lettere, dopo la prima -o d, sono le autorizzazioni del proprietario. Le tre lettere successive sono autorizzazioni che si applicano al gruppo. Le ultime tre lettere sono le autorizzazioni che si applicano a tutti gli altri.

Ogni set di tre lettere è composto da r we x. rè sempre in prima posizione, wè sempre in seconda posizione ed xè sempre in terza posizione. rè l'autorizzazione di lettura, wè l'autorizzazione di scrittura ed xè l'autorizzazione di esecuzione. Se c'è un trattino ( -) al posto di una di queste lettere significa che l'autorizzazione non è concessa, e se la lettera è presente, allora è concessa.

Cartelle

Nel caso di cartelle, i bit di modalità possono essere interpretati come segue:

  • r (leggi) rappresenta la capacità di leggere il sommario della directory data,
  • w(write) indica la possibilità di scrivere il sommario di una determinata directory (creare nuovi file, cartelle; rinominare, eliminare file esistenti, cartelle) se e solo se è impostato il bit di esecuzione. Altrimenti, questa autorizzazione non ha senso.
  • x (esegui) indica la possibilità di accedere alla directory specificata con il comando cd e accedere ai file e alle cartelle in quella directory.

Modifica delle autorizzazioni utilizzando il comando chmod

chmodè un comando in Linux e altri sistemi operativi simili a Unix. Ti consente di modificare le autorizzazioni (o la modalità di accesso) di un file o di una directory.

È possibile modificare le autorizzazioni in due modi diversi: - Basato sul testo - Basato sul chmod numerochmod

Metodo di testo

Per modificare le autorizzazioni o la modalità di accesso di un file, utilizziamo il comando chmod in un terminale. Di seguito è riportata la struttura generale del comando:

chmod who=permissions filename

Where Who is any da un intervallo di lettere e ognuno indica a chi concederai il permesso. Sono i seguenti:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

Le autorizzazioni sono gli stessi già discusso ( r, we x).

Il comando chmod ci consente di aggiungere e sottrarre autorizzazioni da un set esistente usando + o - invece di =. Questo è diverso dai comandi precedenti, che essenzialmente riscrivono le autorizzazioni (ad esempio, per modificare un'autorizzazione da r--a rw-, è comunque necessario includere roltre che wdopo =il chmodcomando. Se si è perso r, si eliminerebbe l' rautorizzazione come vengono riscritti con il =. Usando + e - evitatelo aggiungendo o togliendo l'attuale serie di autorizzazioni).

Metodo numerico

chmod può anche impostare autorizzazioni usando i numeri.

L'uso dei numeri è un altro metodo che consente di modificare le autorizzazioni per tutti e tre i proprietari, i gruppi e gli altri contemporaneamente. Questa struttura di base del codice è questa:

chmod xxx file/directory

Dove xxx è un numero di 3 cifre in cui ogni cifra può essere compresa tra 1 e 7. La prima cifra si applica alle autorizzazioni per il proprietario, la seconda cifra si applica alle autorizzazioni per il gruppo e la terza cifra si applica alle autorizzazioni per tutti gli altri.

In questa notazione numerica, i valori r, w e x hanno il proprio valore numerico:

r=4
w=2
x=1

Per trovare un numero di tre cifre è necessario considerare quali autorizzazioni si desidera disporre di un proprietario, un gruppo e un utente, quindi sommare i loro valori. Ad esempio, supponiamo che volessi concedere al proprietario di una directory le autorizzazioni di lettura-scrittura ed esecuzione e che volessi raggruppare e tutti gli altri che avessero appena letto ed eseguito le autorizzazioni. Vorrei inventare i valori numerici in questo modo:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

Questo è l'equivalente dell'uso di quanto segue:

chmod u=rwx filename
chmod go=rx filename

La maggior parte delle cartelle / directory è impostata su 755 per consentire la lettura, la scrittura e l'esecuzione per il proprietario, ma nega la scrittura a tutti gli altri, e i file sono normalmente 644 per consentire la lettura e la scrittura per il proprietario, ma solo la lettura per tutti gli altri, fare riferimento all'ultimo nota la mancanza di permessi x con file non eseguibili - qui è lo stesso affare.


Copiare il testo da un altro articolo è - almeno - maleducato. Forse anche una violazione del copyright. Se non è solo copiato o hai davvero usato piccole parti (rispettoso del copyright grazie al fair use), ti preghiamo di aggiungere almeno un link all'articolo a cui stai facendo riferimento / citando.
rugk,

0

Per le domande d

Questo ti dice il tipo di file Unix. Di default Unix ha solo 3 tipi di file. Loro sono:

  • - - File normale
  • d - File di directory
  • File speciale (con 5 sottotipi):
    • b - Blocca file
    • c - File dispositivo carattere
    • p - Nome file pipe o solo file pipe
    • l - File di collegamento simbolico
    • s - File socket

Maggiori informazioni qui: i tipi di file in Linux / Unix spiegati in dettaglio

0777 vs 777

Bit appiccicoso specificato o no. Quando viene impostato il bit sticky di una directory, il filesystem tratta i file in tali directory in un modo speciale in modo che solo il proprietario del file, il proprietario della directory o l'utente root possano rinominare o eliminare il file. Senza il bit sticky impostato, qualsiasi utente con autorizzazioni di scrittura ed esecuzione per la directory può rinominare o eliminare i file contenuti, indipendentemente dal proprietario del file.

0777 imposta i permessi dei file 777 e il bit appiccicoso su 0 - nessuna modalità speciale.

777 sta impostando 777 permessi sui file, senza cambiare il bit sticky.

Maggiori informazioni: sticky bit e chmod


2
Meglio: ma non offre ancora nulla che le altre risposte non abbiano già coperto ...
jasonwryan,

1
(1) Esistono tre tipi di file di base: file semplici, directory e tutto il resto. Che cosa? Dove lo stai prendendo? Nel grande schema delle cose, i file e le directory semplici sono abbastanza simili. Le pipe denominate e i collegamenti simbolici sono più simili a file e directory semplici che a file di dispositivi o socket. (2) Pensi chmod 777che non cancella i bit setuid, setgid e sticky? Provalo.
G-Man,

Unix ha 7 tipi di file, non 3.
wjandrea,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.