Ich habe ein seltsames Problem mit Verzeichnisberechtigungen.
Innerhalb einer C++-App erstelle ich einen Ordner mit:
mkdir( "foldername", 777 );
Beim Versuch, eine Datei in diesem Ordner zu erstellen, trat jedoch ein Problem auf . fopen()
Es wurde zurückgegeben NULL
und errno
mir wurde angezeigt, dass Permission denied
. Also überprüfte ich es und tatsächlich hatte ich die folgenden Berechtigungen für den erstellten Ordner:dr----x--t
(Der Stammordner hat drwxrwxr-x
)
Ich habe nachgeschaut, und das t
bedeutet ungewöhnlicherweise „vorübergehend“, aber ich habe keine Ahnung, was das bedeutet.
chmod 777 foldername
aus der Shell erledigt die Arbeit und setzt Attribute auf drwxrwxrwx
, aber ich kann es nicht jedes Mal manuell tun.
Frage: Irgendeine Ahnung, was los ist? Warum setzt meine App die Ordnerattribute nicht richtig? Was bedeutet dieses „temporäre“ Attribut?
(System ist Ubuntu 12.04)
Antwort1
t
ist nicht „temporär“, es bedeutet, dass das Sticky-Bit gesetzt ist. Von man ls
:
t [bedeutet, dass das] Sticky-Bit gesetzt ist (Modus 1000) und durchsuchbar oder ausführbar ist. (Siehe chmod(1) oder sticky(8).)
Das Sticky-Bit ist hier gesetzt, weil SieDezimal777 (Oktal 1411), nichtOktal777 (Dezimalzahl 511). Sie müssen 0777
Oktalzahlen verwenden, nicht 777
.
Sie sollten auch beachten, dass die endgültige Auswirkung des mode
Arguments mkdir
auch eine AND-Verknüpfung mit Ihrer Umask beinhaltet. Von man 2 mkdir
:
Das Argument mode gibt die zu verwendenden Berechtigungen an. Es wird wie üblich durch die umask des Prozesses geändert: Die Berechtigungen des erstellten Verzeichnisses lauten (mode & ~umask & 0777).
Ich würde vorschlagen, dass Sie, wenn dies auf Sie zutrifft, chmod
nach mkdir
anstelle des Modusarguments vorgehen.
Ein letztes Wort der Warnung: Modus 777 ist fastniemalswas Sie wirklich tun möchten. Anstatt das Verzeichnis global für alle Benutzer zu öffnen, sollten Sie einen geeigneten Modus und Besitzer/Gruppe für das Verzeichnis festlegen. Wenn Sie kompliziertere Regeln benötigen, sollten Sie die Verwendung von ACLs in Betracht ziehen.
Antwort2
777
für C ist dezimal. Sie sollten es 0777
so verwenden, dass es als Oktalzahl behandelt wird.
Antwort3
Sie möchten für den Modus wahrscheinlich eine Oktalzahl statt einer Dezimalzahl verwenden:
mkdir( "foldername", 0777 );
Zweitens müssen Sie IhreumaskEinstellungen, um sicherzustellen, dass Sie tatsächlich einen Inode mit diesen Rechten erstellen können.
Verweise:
Antwort4
Zusätzlich zu den anderen netten Antworten können Sie vor dem Erstellen des Ordners Folgendes festlegen umask
, 000
damit Sie die gewünschten Berechtigungen haben:
#include <stdio.h>
#include <sys/stat.h>
int main(void) {
mode_t old_umask;
old_umask = umask(0);
mkdir("tests", 0777);
umask(old_umask);
}
Beispiel:
$ g++ -Wall mkdir.cpp
$ ./a.out
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests
Notiz
Anstelle des Oktalmodus können Sie POSIX-Makros in folgenden Formaten verwenden mkdir
:
mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);