web-dev-qa-db-ja.com

666がデフォルトのファイル作成権限であるのはなぜですか?

私が知ったように、umaskを使用する場合、ファイルに与えることができる最も高い権限は666です。これはumask 0000によって行われます。それは、私が知っているすべてのシステムで666のように見える、デフォルトのファイル作成許可のためです。

内容を表示するために実行権限が必要なファイルは知っています。
しかし、なぜデフォルトのファイル作成許可を666に制限するのですか?

12
Peter

私の知る限り、これは標準ユーティリティにハードコーディングされています。 stracedは、touchで新しいファイルを作成し、mkdirで新しいディレクトリを作成します。

touchトレースはこれを生成しました:

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

mkdirトレースはこれを生成しました:

_mkdir("newdir", 0777)                   = 0
_

Cでのファイル/ディレクトリ作成プロセスのコーディングが不足しているため、デフォルトの権限を変更する方法がわかりません。ただし、デフォルトではファイルを実行可能にしないことが理にかなっているように思えます。ランダムなテキストを誤ってシェルコマンドと誤解したくない場合です。

更新

アクセス許可ビットが標準ユーティリティにハードコードされる方法の例を示すため。 touch(1)mkdir(1)の両方のソースコードを含む、coreutilsパッケージの2つのファイルからの関連する行を以下に示します。

_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_IRWXUGO_によって変更された_umask_value_(read:0777)に設定します。

_touch.c_はさらに明確です:

_int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
_

つまり、すべてのユーザーに読み取りと書き込みのアクセス許可(読み取り:0666)を付与します。これはもちろん、ファイルの作成時にumaskプロセスによって変更されます。

プログラムでのみこれを回避できる場合があります。つまり、システムコールを直接実行するCプログラム内から、または低レベルのsyscallを実行できる言語内からファイルを作成するとき(たとえば、Perlのsysopenを参照) _perldoc -f sysopen_)の下にあります。

10
Joseph R.

まず、グローバルなデフォルトはありません。権限は、ファイルを作成するアプリケーションによって異なります。たとえば、次の小さなCプログラムは、umaskが0000の場合、パーミッション0777のファイル「/ tmp/foo」を作成します(いずれの場合も、パーミッションは0777&〜umaskになります):

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

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

  1. セキュリティ:任意のファイルを実行可能にしたくない。
  2. 利便性:ほとんどのファイルは実行可能である必要はありません。選択したいくつかのファイルに実行可能ビットを設定する方が、大量の他のファイルに設定を解除するよりも簡単です。もちろん、umask 0133はこれを解決しますが、何も勝ちませんし、望んでもプログラムに実行可能ファイルを作成させることはできません。
6
Adaephon