Problem mit den Berechtigungen für erstellte Ordner: temporäres Flag

Problem mit den Berechtigungen für erstellte Ordner: temporäres Flag

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 NULLund errnomir 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 tbedeutet ungewöhnlicherweise „vorübergehend“, aber ich habe keine Ahnung, was das bedeutet.

chmod 777 foldernameaus 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

tist 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 0777Oktalzahlen verwenden, nicht 777.

Sie sollten auch beachten, dass die endgültige Auswirkung des modeArguments mkdirauch 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, chmodnach mkdiranstelle 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

777für C ist dezimal. Sie sollten es 0777so 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, 000damit 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);

verwandte Informationen