デフォルトのファイル作成許可が666なのはなぜですか?


12

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

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


どんなシステム?umask出会ったのは常に0022 だけで、デフォルトの許可644が作成されました
。– manatwork

あなたは誤解していません。Umaskは666のデフォルトのファイル許可を使用しており、独自の値(システムでは0022)を減算します。あなたが設定することができ、ほとんどの権限だからすることであるumask 0000-まだ666(しかし、どうやらフォルダが777を使用)のファイルのアクセス権に制限する
ピーター

つかまえた。今、これは良い質問です。
マナトワーク

2
ファイルの内容を表示するのに実行可能権限は必要ありません。これがためにそうであるディレクトリのディレクトリが実行権限を持つデフォルトで作成されている理由です。
ジョセフR.

1
セキュリティ上の問題を回避するために、これは仕様によるものであると確信しています(ただし、もっと確認する必要があります)。「chmod」にアクセスしないと、ファイルを実行可能にできません。umask 0000は、0666でファイルを作成し、0777でディレクトリを作成します(これは、セキュリティ上賢いデフォルト設定です!)
Olivier Dulac

回答:


10

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

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

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

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

mkdir("newdir", 0777)                   = 0

Cでファイル/ディレクトリ作成プロセスをコーディングする以外には、デフォルトのパーミッションを変更する方法がありません。ただし、デフォルトではファイルを実行可能にしないことは理にかなっているようです。ランダムなテキストをシェルコマンドと誤って解釈することは望ましくありません。

更新

許可ビットを標準ユーティリティにハードコードする方法の例を示します。次にcoreutilstouch(1)との両方のソースコードを含むパッケージ内の2つのファイルの関連行を示します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_IRWXUGOによって(read:0777)に変更されますumask_value

touch.c さらに明確です:

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

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

あなたは周りを取得することができるかもしれこのプログラムでのみ:あなたが直接、またはあなたは、低レベルのシステムコールを行うことができます言語の中から、システムの呼び出しを行うのいずれかのCプログラム内からファイルを作成中(たとえばPerlのために参照すなわちsysopenperldoc -f sysopen)。


あなたは正しいです、私は事故を望んでいません。しかし、それを変更する方法がないのはひどいです!標準値は777である必要があり、我々は必要umask fileumask dir。2つの異なるデフォルト値を設定します。しかし、現在、execパーマでファイルを作成する方法はありません。
ピーター

1
@PeterIまあ、作成時にディレクトリのモードを指定mkdir(1)する-mスイッチを提供します。ただし、ファイルの場合、ファイルの作成にはopen(2)syscallが使用されるため、ファイルの作成に使用するツールがモードビットの受け渡しを担当openし、問題について発言することはありません。install(1)デフォルトでは、ファイルを新しい場所にコピーして実行ビットを設定しますが、作成時にはまだ実行されていません。
ジョセフR.

あなたが言っていることtouch、例えばそれは正しい値を設定する責任があります。値の保存場所を知っていますか?多分それらはシステム全体に設定されているので、変更できますか?私が自由になりたいので;)
ピーター

@PeterI更新された回答を参照してください。
ジョセフR.

1
@PeterI答えをもう一度更新しました。CまたはPerlなどの別の言語のいずれかから直接syscallを作成できる場合があります。
ジョセフR.

6

まず、グローバルなデフォルトはありません。許可はファイルを作成するアプリケーションに依存します。たとえば、この小さなCプログラムは、umaskが0000の場合、パーミッション0777でファイル '/ tmp / foo'を作成します(いずれの場合もパーミッションは0777&〜umaskになります)。

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

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

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

1
セキュリティ上の理由から、x(execute)ビットを設定せずにファイルが作成されます。ファイルの不注意な実行[cw]は「悪いこと」(tm)になります。chmodプログラムを使用すると、必要に応じて許可ビットを(再)設定できます。
ChuckCottrill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.