web-dev-qa-db-ja.com

一部のumask値が有効にならないのはなぜですか?

私は許可をよりよく理解しようとしているので、いくつかの「演習」を行っています。以下は、それぞれの出力で使用している一連のコマンドです。

$ 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

デフォルトのファイル権限は666rw-rw-rw-)であり、ディレクトリのデフォルト権限は777rwxrwxrwx)であることを知っているため、これは理にかなっています。これらのデフォルトの権限からumask値を差し引くと、666-022=644に対してrw-r--r--file1が得られるため、前の出力と整合性があります。 777-022=755rwx-r-x-r-xdir1も一貫しています。

しかし、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-756777-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--  

(グループおよびその他には実行権限がありません)

9
ikeDiM

umaskマスクであり、減算された値ではありません。したがって:

  • モード666、マスク022:結果は666&〜022、つまり 666&755、つまり644です。
  • モード666、マスク021:結果は666&〜021 i.e。 666&756、つまり646です。

関連するビットについて考えてください。モードの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-になります。

26
Stephen Kitt

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 = 11 &0 = 0


厳密に言えば、setuid、setgid、stickyビット用の4番目の3ビットの2進数があります。そのため、先頭に0(または0から7までの他の先頭の数字)で指定されたアクセス許可とマスクがよく表示されます。例えば0777または2755。

11
cas