一部のumask値が適用されないのはなぜですか?

一部の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=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-はい756777-021=756。したがって、この場合、結果は前の計算と一致します。

私はこの人の記事を読みましたが、この行動について何も見つかりませんでした。

誰かが理由を説明できますか?

説明する

答えで指摘したように、umaskの価値は次のとおりです。数学的減算デフォルトのディレクトリとファイルの権限。

関連する有効な演算は、AND(&) および NOT(!) ブール演算子の組み合わせです。一方:

=生成された権限
D=基本権限
ゆう=現在のumask

R = D&!U

たとえば、

第666話! 0053=110110110
            ! 000101011
             110110110 &  
             111010100
           = 110010100 = 624 = 読み書き - 読み書き -
 
777&!0022=111111111&
            !000 010 010
             111111111&  
             111101101
           = 111101101 = 755 = rwxr--xr-x

ヒント

結果の権限をすばやく理解する簡単な方法(少なくとも私には役立ちます)は、小数点以下の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--  

(グループや他のユーザーには実行権限がありません)

答え1

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

  • パターン666、マスク022:結果は666&〜022、つまり666&755は644です。
  • パターン666、マスク021:結果は666&〜021、つまり666&756、つまり646です。

関連部分を考えてみてください。パターンの 6 はビット 1 と 2 がセット、リード、ライトされることを示します。マスク マスクビット 1 の 2 は書き込みビットです。マスクの1は実行ビットであるマスクビット0です。

これを表現する別の方法は、権限をテキスト形式で表示することです。 666666 rw-rw-rw-022はい----w--w-021はい----w---x。マスクはパターンから設定されたビットを削除するので、fromはマスクになり、rw-rw-rw-fromはマスクになります。----w--w-rw-r--r------w---xrw-r--rw-

答え2

10進数ではなく2進法で考えるべきです。具体的には、所有者、グループ、その他を表す3桁の2進数が3つあります。各値の範囲は000〜111(10進数0〜7)です。

たとえば、rw-rw-rw(666) は 110110110 です。

umaskは、新しいファイルまたはディレクトリを作成するときにオンまたはオフにするビット(1または0)を指定するマスクです。たとえば、10進数022は2進数000010010、10進数021は000010001です。

許可ビットは否定された umask と AND で連結され、最終値が得られます。 「否定」とは、全てのビットが反転することを意味する。つまり、すべての1が0に変わり、その逆も同じです。例えばNOT 022 (000 010 010) = 755 (111 101 101)

例: 666 & !022 = 644。 2進数で表すと、次のようになります。

  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

各ビットの最終値が 1 の場合、最終値は 1 だけになります。両方元の権限値(666または777)そして否定的なumaskから。そのうちの1つでも0の場合、結果は0です。今すぐ:1&1=1、しかし1&0=0


厳密には、setuid、setgid、および固定ビットの4番目の3ビットバイナリがあります。これは、直前に0(または0〜7の間の別の前に数字)が割り当てられた権限とマスクを頻繁に表示する理由です。たとえば、0777 または 2755 です。

関連情報