web-dev-qa-db-ja.com

umaskがファイルの実行アクセス許可を変更しないのはなぜですか?

umask0000に変更すると、テキストファイルはrwxrwxrwx権限で作成されると予想されます(umaskの理解に基づいて 説明のとおり) 「可能性のある重複」の質問 )しかし、これを試してみると、次のようになります

$ umask 0000
$ touch /tmp/new.txt
$ ls -ld /tmp/new.txt 
-rw-rw-rw-  1 alanstorm  wheel  0 Jun  2 10:52 /tmp/new.txt

つまり、実行権限が省略され、ファイルの場合はrw-rw-rw-になります(ディレクトリはrwxrwxrwx)。私は自分のローカルOS Xマシン、共有ホストにある古いBSDマシン、およびlinodeで実行されているLinuxサーバーでこれを試しました。

どうしてこれなの? umaskがアクセス許可の最終決定者であるという私の理解-これに対する私の理解は正しくありませんか?もしそうなら、他に何がunixシステム上のファイルのデフォルトの権限に影響を与えますか?

18
Alan Storm

umaskは減法であり、規範的ではありません。umaskで設定された許可ビットは、プログラムで指定されたモードからデフォルトで削除されますが、umaskは許可ビットを追加できません。 touchデフォルトでモード666を指定します (リンクはGNU実装へのリンクですが、他は同じように動作します;これは POSIX )で指定されるため、結果のファイルは現在のumaskでマスクされたファイルになります。あなたの場合、umaskは何もマスクしないため、結果は666になります。

ファイルまたはディレクトリのモードは通常、それを作成するプログラムによって指定されます。関係するほとんどのシステムコールはモードを使用します(egopen(2)creat(2)mkdir(2) すべてにモードパラメータがありますが、 fopen(2) にはなく、モード666を使用します)。親ディレクトリがデフォルトのACLを指定していない限り、呼び出し時のプロセスのumaskは、指定されたモードをマスクするために使用されます(ビット単位の_mode & ~umask_;これにより、モードからumaskの各アクセス権セットが差し引かれます)。モードを減らすことはできますが、増やすことはできません。親ディレクトリがデフォルトのACLを指定している場合、それがumaskの代わりに使用されます。結果のファイルのアクセス権は、作成プログラムで指定されたモードとデフォルトのACLで指定されたモードの共通部分です。

POSIXが指定 デフォルトモードは、ファイルの場合は666、ディレクトリの場合は777である必要があります。しかし、これは単なるdocumentationdefault(ie)であり、POSIXを読み取る場合、プログラムまたは関数がファイルまたはディレクトリのモードを指定していない場合は、デフォルトが適用されます)、システムによって強制されません。一般的に言って、これはPOSIX準拠のツールがファイルを作成するときにモード666を指定し、ディレクトリを作成するときにモード777を指定し、umaskがそこから差し引かれることを意味します。ただし、他のモードを使用したり、umaskを無視したりする正当な理由が数多くあるため、システムはこれを強制できません。

  • 実行可能ファイルを作成するコンパイラは、実行可能ビットが設定されたファイルを生成しようとします(ただし、umaskを適用します)。
  • chmod(1) は、そのパラメーターに応じてモードを明示的に指定し、「who」が指定されている場合、またはモードが完全に指定されている場合、umaskを無視します(つまり、_chmod o+x_はumaskを無視します。 _chmod 777_と同様ですが、_chmod +w_はumaskを適用します);
  • 権限を保持するツールは適切なモードを適用し、umaskを無視します:例:_cp -p_ 、_tar -p_;
  • モードを完全に指定するパラメーターを取るツールも、umaskを無視します:_install --mode_、_mknod -m_...

したがって、umaskは、デフォルトで設定したくない許可ビットを指定するものと考える必要がありますが、これは単なる要求であることに注意してください。これを使用して、セットを表示したい許可ビットを指定することはできません。設定を解除したい許可ビットのみを指定してください。さらに、どのプロセスでも umask(2) システムコールを使用して、とにかくumaskを変更できます。 umask(2)システムコールは、プロセスが現在のumask(親から継承)を見つけるための唯一のPOSIX定義の方法でもあります。 Linuxでは、カーネル4.7以降、プロセスの現在のumaskは Umaskを_/proc/${pid}/status_で探す で確認できます。

(完全を期すために、setuidsetgidおよびスティッキービットに関する動作はシステム依存であり、NFSなどのリモートファイルシステムは独自の変更を加えることができることを述べておきます。)

24
Stephen Kitt

ファイルのアクセス許可を計算する式:

default_mode & ~umask

O_CREATフラグ

POSIXでも指定 、ファイルのデフォルトモードはS_IROTH | S_IWOTH | S_IRGRP | S_IWGRP | S_IRUSR | S_IWUSRまたは666、ディレクトリのデフォルトモードはS_IRWXU | S_IRWXG | S_IRWXOまたは777アプリケーションで指定されていない場合。

ファイルのデフォルトモードの実行ビットが0、ビットごとのANDを実行します&0 常に 0

そのため、アプリケーションで実行ビットが指定されていない場合、umaskの値に関係なく、新しく作成されたファイルの実行ビットはオフになります。

5
cuonglm

上記の説明は非常に良いです。 umaskと権限の明確な説明を提供します。より実用的にするために、「タッチ」によって提供されるアクセス許可はどのようなものですか。

「strace touch /tmp/new.txt」

touchが「new.txt」を作成するために使用するシステムコールを確認します

例として。 "strace touch /tmp/new.txt"のo/p(...->いくつかのコンテンツ)

...

open( "/ tmp/new.txt"、O_WRONLY | O_CREAT | O_NOCTTY | O_NONBLOCK、0666)= 3

...

参考のために strace

1
0x47-sci-tech