私は許可をよりよく理解しようとしているので、いくつかの「演習」を行っています。以下は、それぞれの出力で使用している一連のコマンドです。
$ umask
0022
$ touch file1
$ ls -l file1
-rw-r--r-- 1 user group 0 Mar 16 12:55 file1
$ mkdir dir1
$ ls -ld dir1
drwxr-xr-x 2 user group 4096 Mar 16 12:55 dir1
デフォルトのファイル権限は666
(rw-rw-rw-
)であり、ディレクトリのデフォルト権限は777
(rwxrwxrwx
)であることを知っているため、これは理にかなっています。これらのデフォルトの権限からumask値を差し引くと、666-022=644
に対してrw-r--r--
、file1
が得られるため、前の出力と整合性があります。 777-022=755
のrwx-r-x-r-x
、dir1
も一貫しています。
しかし、umaskを022
から021
に変更すると、それはもうありません。
ファイルの例は次のとおりです。
$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2
-rw-r--rw-
は646
ですが、666-021=645
である必要があります。したがって、以前の計算では機能しません。
ディレクトリの例は次のとおりです。
$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2
drwxr-xrw-
は756
、777-021=756
です。したがって、この場合、結果は前の計算と整合性があります。
私はその男を読みましたが、この行動について何も見つかりませんでした。
誰かが理由を説明できますか?
[〜#〜]説明[〜#〜]
回答で指摘されているように、umask
の値は、デフォルトのディレクトリとファイルの権限から数学的に差し引かれていません。
AND(&)とNOT(!)のブール演算子の組み合わせが効果的に含まれる操作です。与えられた:
[〜#〜] r [〜#〜] =結果の権限
[〜#〜] d [〜#〜] =デフォルトの権限
[〜#〜] u [〜#〜] =現在のumask
R = D&!
例えば:
666&!0053 = 110 110 110& !000 101 011 110 110110& 111 010 100 = 110 010 100 = 624 = rw--wr-
777&!0022 = 111 111 111& !000 010 010 111 111 111& 111 101 101 = 111 101 101 = 755 = rwxr--xr-x
[〜#〜]ヒント[〜#〜]
結果のアクセス許可をすばやく知る簡単な方法(少なくともそれは私に役立ちました)は、10進数の値を3つだけ使用できると考えることです。
r = 100 = 4
w = 010 = 2
x = 001 = 1
アクセス許可は、これらの3つの値の組み合わせになります。" "
は、相対的な許可が与えられていないことを示すために使用されます。
666 = 4+2+" " 4+2+" " 4+2+" " = rw rw rw
したがって、現在のumaskが0053
の場合、グループから読み取りおよび実行(4+1)
権限を削除し、他から(2+1)
を書き込みおよび実行することになります。
4+2 " "+2+" " 4+" "+" " = 624 = rw--w-r--
(グループおよびその他には実行権限がありません)
umask
はマスクであり、減算された値ではありません。したがって:
関連するビットについて考えてください。モードの6は、ビット1と2が設定され、読み取りと書き込みが行われることを意味します。マスク内の2は、ビット1、書き込みビットをマスクします。マスク内の1は、実行ビットであるビット0をマスクします。
これを表すもう1つの方法は、権限をテキスト形式で確認することです。 666はrw-rw-rw-
です。 022は----w--w-
です。 021は----w---x
です。マスクは設定されたビットをモードから削除するため、rw-rw-rw-
によってマスクされた----w--w-
はrw-r--r--
になり、----w---x
によってマスクされた_はrw-r--rw-
になります。
10進数ではなく2進数で考える必要があります。具体的には、3つの2ビットの2進数があります。それぞれ、所有者、グループ、およびその他の番号です。それぞれ000から111(10進数では0-7)の範囲の値。
例えばrw-rw-rw(666)は110 110 110です。
umask
値は、新しいファイルまたはディレクトリを作成するときにオンまたはオフにするビット(1または0)を指定するマスクです。例えば022 10進数は000 010 010バイナリ、021 10進数は000 010 001
許可ビットは、最終値に到達するために否定されたumaskと一緒にANDされます。 「否定」とは、すべてのビットが反転することを意味します。つまり、すべての1が0に反転し、その逆も同様です。例えばNOT 022 (000 010 010) = 755 (111 101 101)
例:666 & !022 = 644
。バイナリでは、それは:
Owner Group Other mode
110 110 110 666
& 111 101 101 755 (this is the negated 022)
--- --- --- ---
110 100 100 644
また、777 & !022 = 755
:
Owner Group Other mode
111 111 111 777
& 111 101 101 755
--- --- --- ---
111 101 101 755
各ビットの最終値は、 both 元の許可値(666または777) [〜#〜]および[〜#〜] 否定されたumask内。それらのいずれかが0の場合、結果は0になります。つまり、1&1 = 1、1 &0 = 0。
厳密に言えば、setuid、setgid、stickyビット用の4番目の3ビットの2進数があります。そのため、先頭に0(または0から7までの他の先頭の数字)で指定されたアクセス許可とマスクがよく表示されます。例えば0777または2755。