デフォルトのファイル作成権限が666の理由は何ですか?

デフォルトのファイル作成権限が666の理由は何ですか?

私が見つけた限り、umaskを使用するときにファイルに付与できる最高の権限は666です。umask 0000これは、私が知っているすべてのシステムでデフォルトのファイル作成権限が666に設定されているためです。

ファイルの内容を表示するには実行権限が必要であることがわかります。
しかし、なぜデフォルトのファイル作成権限を666に制限したいのですか?

ベストアンサー1

私が知っている限り、これは標準ユーティリティにハードコードされています。新しいファイルと新しいディレクトリの両方をstrace作成しました。touchmkdir

追跡touch結果は次のとおりです。

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

そしてmkdir追跡結果は次のとおりです。

mkdir("newdir", 0777)                   = 0

Cのファイル/ディレクトリ生成プロセスのコードが不足しているため、デフォルトの権限を変更する方法はありません。しかし、基本的にファイルを実行可能にしないのが合理的だと思います。任意のテキストが誤ってシェルコマンドとして誤って解釈されることを望まない。

修正する

標準ユーティリティに許可ビットをハードコードする方法の例を示します。以下は、何よりも、coreutilsソースコードを含むパッケージの2つのファイルのいくつかの関連行です。touch(1)mkdir(1)

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

つまり、モードが指定されていない場合はS_IRWXUGObyに設定されますumask_value

touch.cさらに明確になりました。

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

つまり、全員に読み取りおよび書き込み権限(読み取り:0666)を付与します。umaskこれはもちろんファイル生成プロセスによって修正される。

この問題はプログラムでのみ解決できます。つまり、Cプログラムでファイルを生成するときにシステムコールを直接作成したり、低レベルのシステムコールを許可する言語でファイルを生成したりできます(参照)。 、例えば例sysopenperldoc -f sysopen)のPerlです。

おすすめ記事