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


9

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

$ 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=644rw-r--r--、のためにfile1、それは以前の出力とコヒーレントだそう。 777-022=755rwx-r-x-r-x、のためにdir1、また、コヒーレント。

しかし、私はからのumaskを変更した場合022021、それはもはやありません。

これはファイルの例です:

$ 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&!U

例えば:

666&!0053 = 110110110& 
            !000 101 011 
             110 110 110&  
             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 

ヒント

結果のアクセス許可をすばやく確認する簡単な方法(少なくともそれは私に役立ちました)は、3つの10進数値しか使用できないと考えることです。

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--  

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

回答:


26

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

  • モード666、マスク022:結果は666&〜022、つまり 666&755、つまり 644;
  • モード666、マスク021:結果は666&〜021、つまり 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-ます。


11

10進数ではなく2進数で考える必要があります。具体的には、3ビットの2進数が3つあります(所有者、グループ、およびその他のそれぞれに1つ)。それぞれ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

各ビットの最終値は、元の許可値(666または777)否定されたumaskの両方で1の場合にのみ1になることに注意してください。どちらかが0の場合、結果は0になります。つまり、1&1 = 1で、1&0 = 0です。


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


2
厳密に言うと、それは10進数ではなく8進数ですが、それでも答えの核心は変わりません。
David Z

@DavidZ:OPは10進数(Qの減算の例を参照)だと思っていましたが、これはおそらくcasが参照していたものです。
オービットのライトネスレース

1
@Lightness OPによって提供される減算の例は、8進数でも10進数でも機能します。ただし、桁が8に到達せず、桁上げの必要がない場合です。OPが10進数で考えていた可能性があることには同意しますが、質問の中でそれを証明するものはありません。
Stephen Kitt 2018年

@StephenKitt:calc.exeに例を書き込んでいたときに、指でキーパッドを滑らせたように見えますprove
オービットの

1
@casはい、OPが8進数ではなく10進数で計算されているというLightnessの主張だけで、私はその部分に同意しませんでした(それも私の回答の根拠です)。
Stephen Kitt 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.