Bash

什麼是屏蔽模式?

  • February 3, 2020

我知道在 GNU/Linux 中,文件權限也稱為文件模式,並且術語遮罩至少可以表示以下不同的含義:

  1. umask shell 內置(通常的含義)。
  2. umask shell 內置的相應系統呼叫
  3. umask shell 內置的相應命令umask
  4. shell 程序值也稱為文件創建遮罩,以及位遮罩或只是遮罩
  5. 特定於使用者的文件創建遮罩影響該使用者獨有的程序(然後稱為使用者遮罩→ 使用者的文件創建遮罩)。

umask shell內置

可以通過執行帶有適當參數的命令來使用內置的umask shell : 通過這樣做,我們為目前shell 程序樹設置遮罩; 要麼針對目前 shell 程序樹中的所有使用者,要麼只針對我們自己的使用者; 然而,一般來說,任何此類更改都將被繼承到新程序,可能是另一個 shell)。umask

數理邏輯基礎

我知道數學邏輯包括連接AKA anding ( ) 的操作,這是內置umask shell 的基礎。因此:

一組操作數的 and 為真,當且僅當,它的所有操作數都為真

我進一步了解,有一個基於該邏輯的同名按位運算。Anding 與數字相加 ( x + y → z) 或字元串串聯 ( x alongside y → xy) 不同。

我的問題

我知道人們可以通過這種方式“屏蔽模式”:

 OCTAL  BINARY       HUMAN-READABLE
 0666   0110110110  -rw-rw-rw-
∧ 0555   0101101101  -r-xr-xr-x
 0444   0100100100  -r--r--r-- 

但我不確定這是否正確。

我的問題

什麼是屏蔽模式(以及為什麼0666 ∧ 0555 → 0444)?

umask,shell 命令和umask函式,都設置文件創建遮罩,也稱為umask.

您已將其改寫為

Aumask表示 shell 內置命令和 shell 函式,該命令基於該命令並包含通常稱為文件創建遮罩的變數,其值稱為位遮罩或僅遮罩

這在許多方面是不正確的:

  • umask函式不是 shell 函式;見上面的連結;
  • 該函式不包含變數;它設置目前程序的文件創建遮罩;
  • 作用的值不只是通常稱為“文件創建遮罩”,它文件創建遮罩(其值不稱為“位遮罩”或“遮罩”)。

遮罩會影響目前程序樹中的某些實用程序,包括可以更改的其他 shell(因此 shell Y 不一定具有 shell X 的遮罩)。

面具一般不會影響任何事情。文件創建遮罩影響目前程序,並被所有新創建的子程序繼承。子程序可以自由地再次自行更改。

此文件創建遮罩作用於新創建文件的權限。文件權限,也稱為文件模式,是一組十二位編碼文件的所有者、組和其他使用者的訪問權限;有關詳細資訊,請參閱此規範答案。它們通常表示為四位或三位八進制值。它們不是比特流。

新創建文件的權限要麼由正在創建給定文件的程序指定,要麼由預設指定(由它們用於創建文件的函式指定)。前者的範例包括使用openorcreat或來創建文件(或目錄)的程序mkdir,這些程序必須明確指定他們想要的模式。後者的範例包括使用fopen, 文件以預設 0666 模式結束的程序。目前umask值屏蔽此模式。

您將其改寫為

  1. 一些實用程序,例如mkdir創建具有獨立模式的文件(忽略遮罩)。
  2. 一些實用程序使用該fopen()功能,其中文件首先使用預設的 0666 模式創建,但在umask創建後立即將其模式更改為遮罩的模式。

這在許多方面是不正確的:

  • 在創建文件之前將遮罩應用於請求的模式,而不是之後;
  • mkdir(這裡是一個函式,不是一個實用程序,但同樣適用於同名的實用程序)當然不會忽略文件創建遮罩。

umask考慮到時,結果模式是將 umask 作為位遮罩應用於請求模式的結果:在請求模式中設置的每個位都與 中的相應位進行檢查,umask並且僅在後者未設置時才保留。在二進制運算方面,請求的模式是與umask. 因此umask0022 的 a 與 0666 的模式導致 0644;不是通過減法,而是因為 0666 和 0755(0022 的補碼)是 0644。同樣,umask0011 的 a 和 0666 的模式會導致 0666。

讓我們更詳細地看一下計算。它通常表示為減法,包括在您連結到的答案中,但重要的是要了解它不是;umask用作遮罩。因此應用 0022 的值:

      Octal Binary
Mode   0666  000110110110
Mask   0022  000000010010  Bits set here mask bits above
Result 0644  000110100100

      Octal Binary
Mode   0644  000110100100
Mask   0022  000000010010
Result 0644  000110100100

這通常是通過將模式與遮罩的補碼進行按位與運算來計算的:

      Octal Binary
Mask   0022  000000010010
Compl. 7755  111111101101
Mode   0666  000110110110
Result 0644  000110100100

chmod應用在其命令行上指定的模式而不考慮umask。其他工具也這樣做,即使在創建文件時也是如此;因此cptar,當被指示保留權限時,將複製權限或恢復權限而不考慮umask

這個答案更詳細。

你最後的問題是

我的理解夠準確嗎?0666 ∧ 0555 → 0444 怎麼來的?

第一個的答案顯然不是。第二個的答案是因為這就是按位和工作的方式。用二進制重寫操作數:

Octal  Binary
0666   000110110110
0555   000101101101

現在對每個位位置執行按位和。這意味著獲取每個垂直對齊的位對,以及它們(在上面的範例中,0 ∧ 0 三次,然後 1 ∧ 1、1 ∧ 0、0 ∧ 1、1 ∧ 1 等):

      000100100100

(0 ∧ 0 為 0,0 ∧ 1 為 0,1 ∧ 0 為 0,1 ∧ 1 為 1)。將上面的內容轉換回八進制,最終得到 0444。

引用自:https://unix.stackexchange.com/questions/479452