そんなこと知ってる:
666
ですumask
値はデフォルトのmodから削除されます。それで、なぜ「umask」を555
に設定しても、新しく作成されたファイルのパーミッションが111
に設定されないのはなぜですか?代わりに、222
に設定しています
5
を使用すると、read (4)
ビットとexecutable (1)
ビットを削除するため、write (2)
のみになります。
555
では、デフォルトの実行可能ビットをオンに設定していません。
It's wrong => (6 - 5 = 1)
これらのmodを入手しました。
5
を作成できる唯一の方法は4 + 1
からであるため、5
は実際には次のことを意味します。
4 (Read) + 1 (Executable) = 5
これは、実行可能ファイルを「削除」し、設定されている場合はmodを読み取ることを意味します。
言い換えると、umask 555
を使用すると、デフォルトのファイルモード(6)から読み取り(4)および実行可能(1)ビットを削除し、6には4と削除するには2(1ではありません):
6 = 4 + 2
削除するのは4だけなので、ファイルは222
で終わります。
バイナリで考えてください:
1 -> 001
2 -> 010
3 -> 011
4 -> 100
5 -> 101
6 -> 110
7 -> 111
ファイルのデフォルトモードは666(110 110 110)であり、umask
値は555
(101 101 101)です。
Decimal title -> 421 421 421
666 in binary -> 110 110 110
- 555 in binary -> - 101 101 101
_____________
010 010 010
2 2 2
-w- -w- -w-
見る?最終的に-w-w-w-、または222
になりました。
結果のumask値はmask&0777(bit wise and)
マスクが0555の場合
Than0555&0777結果with0222
nixCraft Understanding-linux-unix-umask-value-usage
タスク:ファイルの最終的な許可の計算
次のように、ベースパーミッションからumaskを差し引くだけで、ファイルの最終パーミッションを決定できます。
666 – 022 = 644 File base permissions : 666 umask value : 022 subtract to get permissions of new file (666-022) : 644 (rw-r–r–)
タスク:ディレクトリの最終的な許可の計算
次のように、ディレクトリの最終的な許可を決定するために、基本許可からumaskを単純に差し引くことができます。
777 – 022 = 755 Directory base permissions : 777 umask value : 022 Subtract to get permissions of new directory (777-022) : 755 (rwxr-xr-x)
touch file
とmkdir dir
の違いの原因:
注:このように指定する nix Q&A
許可ビットが標準ユーティリティにどのようにハードコードされているか。
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
(読み取り:0777)に設定します。
touch.c
はさらに明確です:int default_permissions = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
つまり、すべてのユーザーに読み取りおよび書き込み権限を付与します(読み取り:0666)。これは、もちろんファイル作成時にプロセス
umask
によって変更されます。これはプログラムでしか回避できない可能性があります。つまり、システムコールを直接行うCプログラム内から、または低レベルのシステムコールを行うことができる言語内からファイルを作成しているときです(たとえば、Perlの
sysopen
perldoc -f sysopen
)。umask()は、呼び出しプロセスのファイルモード作成マスク(umask)をmask&0777に設定します(つまり、maskのファイル許可ビットのみが使用されます)。マスクの前の値を返します。