デフォルトのファイル作成権限が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です。

答え2

まず、グローバルデフォルトはなく、権限はファイルを生成したアプリケーションによって異なります。たとえば、umaskが0000の場合、この小さなCプログラムは、0777の権限を持つ「/tmp/foo」ファイルを生成します(とにかく、0777&〜umaskです)。

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

つまり、多くのアプリケーションは0666権限でファイルを生成します。これには2つの理由があります。

  1. セキュリティ:ランダムファイルを実行したくありません。
  2. 利便性:ほとんどのファイルは実行可能である必要はありません。多数の異なるファイルに対して実行ビットを設定解除するよりも、選択した少数のファイルに実行ビットを設定する方がはるかに簡単です。もちろん、umask 0133はこの問題を解決することができますが、何も得られず、望んでもプログラムが実行可能ファイルを生成することはできません。

関連情報