Ich beantworte Ihre Fragen in drei Teilen:Dateitypen, Berechtigungen und Anwendungsfälle für die verschiedenen Formen von chmod
.
Dateitypen
Das erste Zeichen in ls -l
Ausgabe repräsentiert den Dateityp; d
bedeutet, dass es sich um ein Verzeichnis handelt. Es kann nicht gesetzt oder nicht gesetzt werden, es hängt davon ab, wie die Datei erstellt wurde. Die vollständige Liste der Dateitypen finden Sie in der ls-Dokumentation; diejenigen, denen Sie wahrscheinlich begegnen werden, sind
-
:„normale“ Datei, erstellt mit jedem Programm, das eine Datei schreiben kannb
:Spezielle Blockdateien, typischerweise Platten- oder Partitionsgeräte, können mitmknod
erstellt werdenc
:zeichenspezifische Datei, kann auch mitmknod
erstellt werden (siehe/dev
für Beispiele)d
:Verzeichnis, kann mitmkdir
erstellt werdenl
:symbolischer Link, kann mitln -s
erstellt werdenp
:Named Pipe, kann mitmkfifo
erstellt werdens
:Socket, kann mitnc -U
erstellt werdenD
:door, erstellt von einigen Serverprozessen auf Solaris/openindiana.
Berechtigungen
chmod 0777
wird verwendet, um alle Berechtigungen in einem chmod
festzulegen Ausführung, anstatt Änderungen mit u+
zu kombinieren usw. Jede der vier Ziffern ist ein Oktalwert, der einen Satz von Berechtigungen darstellt:
suid
,sgid
und „klebrig“ (siehe unten)- Benutzerberechtigungen
- Gruppenberechtigungen
- "andere" Berechtigungen
Der Oktalwert wird als Summe der Berechtigungen berechnet:
- "lesen" ist 4
- „Schreiben“ ist 2
- "Ausführen" ist 1
Für die erste Ziffer:
suid
ist 4; Binärdateien mit diesem gesetzten Bit werden als ihr Eigentümer ausgeführt (üblicherweiseroot
)sgid
ist 2; Binärdateien mit diesem Bit-Set laufen als ihre Eigentümergruppe (dies wurde für Spiele verwendet, damit Highscores geteilt werden konnten, aber es ist oft ein Sicherheitsrisiko, wenn es mit Schwachstellen in den Spielen kombiniert wird), und Dateien, die in Verzeichnissen mit diesem Bit-Set erstellt wurden, gehören zu den standardmäßig die Eigentümergruppe des Verzeichnisses (dies ist praktisch, um freigegebene Ordner zu erstellen)- „sticky“ (oder „eingeschränkte Löschung“) ist 1; Dateien in Verzeichnissen mit diesem gesetzten Bit können nur von ihrem Eigentümer, dem Eigentümer des Verzeichnisses oder
root
gelöscht werden (siehe/tmp
für ein allgemeines Beispiel dafür).
Siehe chmod
Manpage für Details. Beachten Sie, dass ich bei all dem andere Sicherheitsfunktionen ignoriere, die die Berechtigungen von Benutzern für Dateien ändern können (SELinux, Datei-ACLs ...).
Spezielle Bits werden je nach Dateityp (normale Datei oder Verzeichnis) und dem zugrunde liegenden System unterschiedlich behandelt. (Dies wird im chmod
erwähnt Manpage.) Auf dem System, mit dem ich das getestet habe (mit coreutils
8.23 auf einem ext4
Dateisystem, auf dem Linux-Kernel 3.16.7-ckt2 ausgeführt wird), ist das Verhalten wie folgt. Bei einer Datei werden die speziellen Bits immer gelöscht, sofern sie nicht explizit gesetzt sind, also chmod 0777
entspricht chmod 777
, und beide Befehle löschen die speziellen Bits und geben jedem die vollen Berechtigungen für die Datei. Bei einem Verzeichnis werden die speziellen Bits niemals vollständig gelöscht, wenn die vierstellige numerische Form verwendet wird, also chmod 0777
entspricht auch chmod 777
aber es ist irreführend, da einige der speziellen Bits unverändert bleiben. (Eine frühere Version dieser Antwort hat dies falsch verstanden.) Um spezielle Bits in Verzeichnissen zu löschen, müssen Sie u-s
verwenden , g-s
und/oder o-t
explizit oder geben Sie einen negativen numerischen Wert an, also chmod -7000
löscht alle speziellen Bits in einem Verzeichnis.
In ls -l
Ausgabe, suid
, sgid
und „sticky“ erscheinen anstelle von x
Eintrag:suid
ist s
oder S
anstelle des x
des Benutzers , sgid
ist s
oder S
anstelle des x
der Gruppe , und „sticky“ ist t
oder T
anstelle von x
anderer . Ein Kleinbuchstabe zeigt an, dass sowohl das spezielle Bit als auch das ausführbare Bit gesetzt sind; ein Großbuchstabe zeigt an, dass nur das spezielle Bit gesetzt ist.
Die verschiedenen Formen von chmod
Aufgrund des oben beschriebenen Verhaltens werden die vollen vier Ziffern in chmod
verwendet kann verwirrend sein (zumindest stellt sich heraus, dass ich verwirrt war). Es ist nützlich, wenn Sie sowohl spezielle Bits als auch Berechtigungsbits setzen möchten; Andernfalls werden die Bits gelöscht, wenn Sie eine Datei bearbeiten, und beibehalten, wenn Sie ein Verzeichnis bearbeiten. Also chmod 2750
stellt sicher, dass Sie mindestens sgid
erhalten und genau u=rwx,g=rx,o=
; aber chmod 0750
löscht nicht unbedingt die speziellen Bits.
Verwenden von numerischen Modi anstelle von Textbefehlen ([ugo][=+-][rwxXst]
) ist wohl eher Gewohnheitssache und Ziel des Befehls. Sobald Sie sich an die Verwendung numerischer Modi gewöhnt haben, ist es oft einfacher, einfach den vollständigen Modus auf diese Weise anzugeben. und es ist nützlich, sich Berechtigungen mit numerischen Modi vorstellen zu können, da viele andere Befehle sie verwenden können (install
, mknod
...).
Einige Textvarianten können sich als nützlich erweisen:Wenn Sie einfach sicherstellen möchten, dass eine Datei von jedem ausgeführt werden kann, chmod a+x
wird dies tun, unabhängig von den anderen Berechtigungen. Ebenso +X
fügt die Ausführungsberechtigung nur hinzu, wenn eine der Ausführungsberechtigungen bereits festgelegt ist oder die Datei ein Verzeichnis ist; Dies kann praktisch sein, um Berechtigungen global wiederherzustellen, ohne dass Dateien im Vergleich zu Verzeichnissen in Sonderfällen behandelt werden müssen. Also chmod -R ug=rX,u+w,o=
entspricht der Anwendung von chmod -R 750
zu allen Verzeichnissen und ausführbaren Dateien und chmod -R 640
zu allen anderen Dateien.
Daher sind Berechtigungen in Linux sehr wichtig. Ich werde versuchen, eine kurze Erklärung abzugeben.
Für Teile eines Dateimodus
Jede Unix-Datei hat eine Reihe von Berechtigungen, die bestimmen, ob Sie die Datei lesen, schreiben oder ausführen können. Runningls -l zeigt die Berechtigungen an. Hier ist ein Beispiel für eine solche Anzeige:
-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile
Ich hänge ein Bild von Teilen eines Dateimodus an:
Typ kann unterschiedlich sein. Zum Beispiel:
- d (Verzeichnis)
- c (Zeichengerät)
- l (symlink)
- p (benannte Pipe)
- s (Buchse)
- b (Gerät blockieren)
- D (Tür, auf Linux-Systemen nicht üblich, wurde aber portiert)
Wenn Sie einige Berechtigungen für alle Verzeichnisse festlegen möchten, können Sie das R-Attribut verwenden, zum Beispiel:
chmod -R 777 /some/directory/
Für chmod 777 vs. 0777
Der chmod
Der Befehl erwartet normalerweise, dass die Eingabe eine Oktalzahl ist, die führende Null bezieht sich auf den Wert des sticky/sgid/suid-Bit-Tripletts. In C würde es jedoch einen Unterschied machen, da 777
würde zu 01411
übersetzt werden (oktal) und setzt damit das Sticky-Bit (siehe chmod(2)
Manpage), Leseberechtigungen für Besitzer und ausführbares Bit für Gruppe und andere (was eine ziemlich seltsame Kombination ist).
BEARBEITEN 1
Ich habe ein anderes Bild über Linux-Berechtigungen gefunden und werde es anhängen, um es einfacher zu verstehen:
d
bedeutet, es ist ein Verzeichnis, wenn Sie eine Datei haben, ist es -
und wenn es sich um einen Link handelt, finden Sie einen l
. Es kann nicht aktiviert/deaktiviert werden.
Wenn Sie 0777 als Berechtigungen verwenden, geben Sie jedem Benutzer / jeder Gruppe des Systems die volle Kontrolle (Lesen + Schreiben + Ausführen). Es ist ein fauler Weg, Probleme zu lösen, wenn Sie Benutzer/Gruppen haben, die nicht auf Verzeichnisse/Dateien zugreifen können.
Wenn Sie beispielsweise den Inhalt eines Verzeichnisses auflisten und Folgendes erhalten:
-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so
preloadable_libintl.so ist eine Datei, die dem Benutzer root und der Gruppe root gehört. Der Eigentümer Lese- und Schreibzugriff hat, die Gruppe hat nur Lesezugriff und alle anderen Benutzer Lesezugriff hat. Dies kann als 644 übersetzt werden.
Wenn ich es auf 777 ändere, sieht es so aus:
-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so