umask
を0000
に変更すると、テキストファイルは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システム上のファイルのデフォルトの権限に影響を与えますか?
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を無視したりする正当な理由が数多くあるため、システムはこれを強制できません。
chmod(1)
は、そのパラメーターに応じてモードを明示的に指定し、「who」が指定されている場合、またはモードが完全に指定されている場合、umaskを無視します(つまり、_chmod o+x
_はumaskを無視します。 _chmod 777
_と同様ですが、_chmod +w
_はumaskを適用します);cp -p
_ 、_tar -p
_;install --mode
_、_mknod -m
_...したがって、umaskは、デフォルトで設定したくない許可ビットを指定するものと考える必要がありますが、これは単なる要求であることに注意してください。これを使用して、セットを表示したい許可ビットを指定することはできません。設定を解除したい許可ビットのみを指定してください。さらに、どのプロセスでも umask(2)
システムコールを使用して、とにかくumaskを変更できます。 umask(2)
システムコールは、プロセスが現在のumask(親から継承)を見つけるための唯一のPOSIX定義の方法でもあります。 Linuxでは、カーネル4.7以降、プロセスの現在のumaskは Umask
を_/proc/${pid}/status
_で探す で確認できます。
(完全を期すために、setuid
、setgid
およびスティッキービットに関する動作はシステム依存であり、NFSなどのリモートファイルシステムは独自の変更を加えることができることを述べておきます。)
ファイルのアクセス許可を計算する式:
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
の値に関係なく、新しく作成されたファイルの実行ビットはオフになります。
上記の説明は非常に良いです。 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