umask
*nix 作業系統中指令的實際用途是什麼?
其工作機制和用途如何?例如
$ umask 022
之前非常感謝
答案1
umask
是大多數 shell 的內建命令,它只是系統調用的接口umask()
,您可以在 shell 的文檔中找到它的描述(注意man umask
可能會指向umask()
系統調用的文檔或umask
shell 的內置命令)除了您的之外)。
使用者遮罩是進程的屬性(從父進程繼承到子進程並在命令執行時保留),用於確定建立檔案時預設自動授予檔案的權限。
此umask
實用程式可讓您設定 shell 進程的使用者掩碼,以控制 shell 會話中執行的任何命令所建立的檔案的權限。
所有 shell的 都umask
將遮罩視為八進制數,而在某些 shell(包括所有 POSIX shell)上,它也可以以符號形式指定,例如 for chmod
。
掩碼決定了權限的哪些位元應該是已清除當文件被創建時。例如umask 777
,其中 0777 是 511 或 0b111_111_111 將導致在沒有權限的情況下建立文件,因為 Unix 文件權限的所有 91 位元(3(r
讀取、w
寫入、執行x
)使用者, 3 為團體, 3 為其他)將被清除。
符號形式指定哪些位元應該不是被清除。也會umask 777
如此umask u=,g=,o=
。
一般來說,您至少希望 umask 包含w
其他位,o
因為您不希望您建立的檔案是全域可寫的(umask 002
或umask u=rwx,g=rwx,o=rx
)。
您可能希望至少在使用者的主要群組不是個人群組(與其他使用者共用)的系統上也設定w
群組位元:或。g
umask 022
umask u=rwx,g=rx,o=rx
Aumask 077
或umask u=rwx,g=,o=
確保您建立的所有檔案都是您私有的(其他任何人都無法存取)。您經常在建立臨時檔案的腳本中看到這一點,有時在子 shell 中,如下所示:
(umask 077; echo test > "$tmpfile")
設定umask
伺服器位元u
可能會導致問題,因為您最終可能會建立甚至無法開啟的檔案。
請注意,應用了使用者掩碼在上面open()
應用程式或creat()
檔案所請求的權限。如果他們在is ( )creat("file", 0666)
時這樣做,則權限最終將為( )。應用程式仍然可以調用或之後根據需要更改權限(並且 umask 在那裡不起作用)。umask
022
u=rwx,g=rx,o=rx
0644
u=rw,g=r,o=r
fchmod()
chmod()
umask
不帶參數以八進位形式報告目前使用者遮罩。umask -S
在某些 shell 中以符號形式報告它。umask -p
或輸出 shell 程式碼bash
,fish
該程式碼一旦解釋就會設定相同的使用者遮罩。
修改後可用於恢復先前的 umask:
previous_umask=$(umask)
umask 077
# create some private files
umask "$previous_umask"
1 從技術上講,有 12 位權限,其中 3 個額外的權限是特殊位,根據文件類型用於各種目的,有時與其他權限位結合使用(例如用於可執行文件的 setuid、setgid 位、t
用於目錄的位元.. .)。在某些系統上,當在open()
/中請求時,這些位元會被忽略creat()
,無論如何,當它們由應用程式設定時(通常是通過chmod()
之後),這是有充分理由的,因此將它們包含在/ 中umask
通常沒有用,umask()
系統呼叫將忽略它們反正。