作成されたフォルダの権限に関する問題: 一時フラグ

作成されたフォルダの権限に関する問題: 一時フラグ

ディレクトリの権限に関して奇妙な問題があります。

C++ アプリ内から、次のフォルダーを作成します。 mkdir( "foldername", 777 );

しかし、そのフォルダにファイルを作成しようとしたときに問題が発生し、fopen()が返されNULL、 とerrno表示されましたPermission denied。そこで確認したところ、確かに、作成されたフォルダには次の権限がありました。dr----x--t

(ルートフォルダにはdrwxrwxr-x

調べたところ、この異常はt「一時的」という意味ですが、それが何を意味するのか全く分かりません。

chmod 777 foldernameシェルから を実行すると、属性が に設定されますdrwxrwxrwxが、毎回手動で実行することはできません。

質問: 何が起こっているのか手がかりはありますか? アプリがフォルダー属性を正しく設定しないのはなぜですか? この「一時的」属性の意味は何ですか?

(システムはUbuntu 12.04です)

答え1

t「一時的」ではない場合、スティッキー ビットが設定されていることを意味しますman ls

t [は] スティッキービットが設定され (モード 1000)、検索可能または実行可能であることを意味します。 (chmod(1) または sticky(8) を参照してください。)

スティッキービットはここで設定されているので、小数点777(8進数1411)ではなく8進数0777777 (10 進数では 511)。ではなく 8 進数を使用して記述する必要があります777

また、このmode引数の最終的な効果には、 mkdirumask に対する AND 演算も含まれることに注意してください。man 2 mkdir

引数 mode は使用する権限を指定します。これは通常どおりプロセスの umask によって変更されます。作成されたディレクトリの権限は (mode & ~umask & 0777) になります。

これが影響する場合は、モード引数を使用する代わりに、をchmod使用することをお勧めします。mkdir

最後に警告しておきますが、モード777はほぼ一度もない本当にやりたいことを明確にしてください。ディレクトリをすべてのユーザーにグローバルに公開するのではなく、ディレクトリに適切なモードと所有者/グループを設定することを検討してください。より複雑なルールが必要な場合は、ACL の使用を検討してください。

答え2

777C は 10 進数です。80777進数として扱われるように を使用する必要があります。

答え3

おそらく、モードには 10 進数ではなく 8 進数を使用することをお勧めします。

mkdir( "foldername", 0777 );

次に、umask実際にこれらの権限で inode を作成できることを確認するための設定です。

参考文献:

答え4

他の素晴らしい回答に加えて、フォルダーを作成する前に設定することumask000、必要な正しい権限を取得できます。

#include <stdio.h>                                                              
#include <sys/stat.h>                                                           

int main(void) {
    mode_t old_umask;                                                                
    old_umask = umask(0);                                                                   
    mkdir("tests", 0777);
    umask(old_umask);                                                       
}

例:

$ g++ -Wall mkdir.cpp 
$ ./a.out 
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests

注記

8 進モードを使用する代わりに、次の POSIX マクロを使用できますmkdir

mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);

関連情報