文件權(quán)限
Linux 系統(tǒng)是一種典型的多用戶系統(tǒng),不同的用戶處于不同的地位,擁有不同的權(quán)限。為了保護(hù)系統(tǒng)的安全性,Linux 系統(tǒng)對(duì)不同的用戶訪問同一文件(包括目錄文件)的權(quán)限做了不同的規(guī)定。在 Linux 中我們可以使用 ll 命令或者 ls –l 命令來顯示一個(gè)文件的屬性以及對(duì)應(yīng)的文件權(quán)限,如:
[root@localhost vincent]# ll
total 96
-rw-rw-r-- 1 vincent vincent 40960 Apr 17 21:12 doucument.tar
drwxrwxr-x 3 vincent vincent 4096 Mar 13 15:28 package
-rw-rw-r-- 1 vincent vincent 53 Mar 7 09:14 result1
-rw-rw-r-- 1 vincent vincent 107 Mar 7 09:20 result2
-rw-rw-r-- 1 vincent vincent 664 Mar 9 17:06 result3
-rwxrw-r-- 1 vincent vincent 49 Mar 2 15:45 script1
-rwxrw-r-- 1 vincent vincent 85 Mar 5 13:49 test2
-rwxrw-r-- 1 vincent vincent 109 Mar 5 14:27 test3
-rw-rw-r-- 1 vincent vincent 41 Mar 13 09:55 test3.txt
-rwxrw-r-- 1 vincent vincent 119 Mar 6 16:18 test4
-rw-rw-r-- 1 vincent vincent 64 Mar 1 21:00 test.txt
文件都有一個(gè)特定的所有者,也就是對(duì)該文件具有所有權(quán)的用戶。同時(shí),在 Linux 系統(tǒng)中,用戶是按組分類的,一個(gè)用戶屬于一個(gè)或多個(gè)組。文件所有者以外的用戶又可以分為文件所有者的同組用戶和其他用戶。因此,Linux 系統(tǒng)按文件所有者、文件所有者同組用戶和其他用戶來規(guī)定了不同的文件訪問權(quán)限。 每個(gè)文件的屬性由左邊第一部分的 10 個(gè)字符來確定(如下圖)。

示例中,文件的第一個(gè)屬性表示文件類型,所有可用的值如下:
- 當(dāng)為 [d] 則表示目錄。
- 當(dāng)為 [-] 則表示文件。依照文件的內(nèi)容,Linux 下的文件又大略可以分為:
- 二進(jìn)制文件(binary file):以純二進(jìn)制形式存儲(chǔ)的文件。像 ls、cat 等可執(zhí)行的命令,以及壓縮文件都是二進(jìn)制文件??梢砸允M(jìn)制的形式查看文件的二進(jìn)制內(nèi)容。一般固定類型的二進(jìn)制文件都有其特定的文件簽名頭,可以根據(jù)文件簽名頭來確定二進(jìn)制文件的實(shí)際類型(根據(jù)文件名中類型后綴區(qū)分文件類型一點(diǎn)也不靠譜,因?yàn)槲募愋秃缶Y是可以隨意修改的,僅用于表明其文件類型)。
- 文本文件(text file):文本文件雖然最終也是按也是按二進(jìn)制存儲(chǔ)的,但其內(nèi)容是我們?nèi)祟惪梢灾苯幼x到的數(shù)據(jù),例如數(shù)字、字母等等。幾乎只要我們可以用來做為設(shè)置的文件都屬于這一種文件類型。
- 數(shù)據(jù)文件(data file):有些程序在運(yùn)作的過程當(dāng)中會(huì)讀取某些特定格式的文件,那些特定格式的文件可以被稱為數(shù)據(jù)文件(data file)。舉例來說,我們的 Linux 在使用者登入時(shí),都會(huì)將登錄的數(shù)據(jù)記錄在
/var/log/wtmp那個(gè)文件內(nèi),該文件就是一個(gè)數(shù)據(jù)文件,可以通過last指令讀取該文件,但是使用 cat 讀取該文件內(nèi)容時(shí)會(huì)出現(xiàn)亂碼,因?yàn)樗且环N特殊格式的文件。
除了以上常規(guī)類型以外,還有以下特殊文件類型:
- 若是 [l] 則表示為符號(hào)鏈接(symbolic link file)。類似 Windows 系統(tǒng)中的快捷方式。更多解釋請參考
ln命令的文檔; - 若是 [b] 則表示塊文件(block file)。塊文件表示與儲(chǔ)存相關(guān)的一些設(shè)備文件,提供系統(tǒng)隨機(jī)存取的接口設(shè)備,比如硬盤與軟盤等。此類文件通常都集中在
/dev這個(gè)目錄中。比如,執(zhí)行ls -l /dev/sd*命令會(huì)發(fā)現(xiàn)第一個(gè)屬性為 [b]。 - 若是 [c] 則表示字符文件(character file)。字符文件表示一些提供串行輸入或輸出的設(shè)備和終端,比如,聲卡、顯卡、鍵盤、鼠標(biāo)、
tty終端等。這些設(shè)備的特性就是一次性讀取,不能夠截?cái)噍敵?。舉例來說,你不可能讓鼠標(biāo)跳到另一個(gè)畫面,而是連續(xù)性滑動(dòng)到另一個(gè)地方。此類文件通常都集中在/dev這個(gè)目錄中。 - 若是 [s] 則表示套接字文件(socket file)。套接字文件用于在應(yīng)用程序之間傳遞信息以進(jìn)行通信,通常被用在網(wǎng)絡(luò)上的數(shù)據(jù)發(fā)送接收。我們可以啟動(dòng)一個(gè)程序來監(jiān)聽客戶端的要求,而客戶端就可以通過這個(gè)套接字文件來進(jìn)行數(shù)據(jù)的溝通了。通??梢栽?
/run或/tmp這些目錄中看到這種文件類型??梢允褂?socket()系統(tǒng)調(diào)用創(chuàng)建一個(gè)套接字文件。 - 當(dāng)為 [p] 則表示網(wǎng)絡(luò)設(shè)備(pipe file 或 named pipe file)。管道文件或命名的管道文件表示存取文件時(shí)進(jìn)出的字節(jié)順序是相同的,它的主要目的在解決多個(gè)程序同時(shí)存取一個(gè)文件所造成的錯(cuò)誤。命名的管道文件的 name 實(shí)際上是文件系統(tǒng)內(nèi)的文件名。有時(shí)這種文件也稱為 FIFO 文件,其中, FIFO 是
First-In, First Out的縮寫。
接下來的字符中,以三個(gè)為一組,且均為 rwx 的三個(gè)參數(shù)的組合。其中:
- [r]代表可讀(read);
- [w]代表可寫(write);
- [x]代表可執(zhí)行(execute);
- [-]代表沒有對(duì)應(yīng)的權(quán)限。
文件屬性從左至右用 0-9 這些數(shù)字來表示。第 0 位確定文件類型(前面已經(jīng)說過可以為哪些文件類型),第 1-3 位確定屬主(即該文件的所有者)擁有該文件的權(quán)限。第 4-6 位確定所屬群組(所有者的同組用戶)對(duì)該文件的權(quán)限,第 7-9 位確定其他用戶對(duì)該文件的權(quán)限。其中,第 1、4、7 位表示讀權(quán)限,如果用 r 字符表示,則有讀權(quán)限,如果用 - 字符表示,則沒有讀權(quán)限;第 2、5、8 位表示寫權(quán)限,如果用 w 字符表示,則有寫權(quán)限,如果用 - 字符表示沒有寫權(quán)限;第 3、6、9 位表示可執(zhí)行權(quán)限,如果用 x 字符表示,則有執(zhí)行權(quán)限,如果用 - 字符表示,則沒有執(zhí)行權(quán)限。
對(duì)于 root 用戶來說,一般情況下,文件的權(quán)限對(duì)其不起作用,即 root 用戶對(duì)所有文件擁有所有權(quán)限。
權(quán)限對(duì)目錄和文件含義
文件是實(shí)際含有數(shù)據(jù)的地方,包括一般文本文件、數(shù)據(jù)庫內(nèi)容文件、二進(jìn)制可執(zhí)行文件(binary program)等等。 因此,權(quán)限對(duì)于文件來說,它的意義是這樣的:
-
r (read):可讀取此文件的實(shí)際內(nèi)容,如讀取文本文件的文字內(nèi)容等; -
w (write):可以編輯、新增或者是修改該文件的內(nèi)容(但不代表可以刪除該文件); -
x (eXecute):該文件具有可以被系統(tǒng)執(zhí)行的權(quán)限。
那個(gè)可讀(r)代表可以讀取文件內(nèi)容。在 Windows 中一個(gè)文件是否具有執(zhí)行的能力是借由擴(kuò)展名(如 .exe、.bat、.com 等)來判斷的。但是在 Linux 中,文件是否能被執(zhí)行,則是借由是否具有 x 這個(gè)權(quán)限來決定的,跟文件名沒有絕對(duì)的關(guān)系。當(dāng)你對(duì)一個(gè)文件具有 w 權(quán)限時(shí),你可以具有寫入/編輯/新增/修改文件的內(nèi)容的權(quán)限, 但并不具備刪除該文件本身的權(quán)限。對(duì)于文件的 rwx 來說,主要都是針對(duì)文件的內(nèi)容而言,與文件名沒有關(guān)系,因?yàn)槲募涗浀氖菍?shí)際的數(shù)據(jù) 。
目錄主要的內(nèi)容在于記錄其中的文件名列表,所以 rwx 對(duì)目錄含義如下:
r(read contents in directory):表示具有讀取目錄中文件列表的權(quán)限,所以當(dāng)對(duì)一個(gè)目錄具有r權(quán)限時(shí),表示可以查詢該目錄下的文件列表。即可以利用ls這個(gè)命令將該目錄的內(nèi)容列表顯示出來。-
w(modify contents of directory):表示具有改動(dòng)該目錄中文件列表的權(quán)限,也就是下面這些權(quán)限:- 建立新的文件與目錄;
- 刪除已經(jīng)存在的文件與目錄(不論該文件的權(quán)限是什么);
- 將已存在的文件或目錄進(jìn)行更名;
- 移動(dòng)該目錄內(nèi)的文件、目錄位置。
總之,目錄的
w權(quán)限就與該目錄下的文件名改動(dòng)有關(guān)。 x(access directory):目錄只是記錄文件名而已,但不可以被執(zhí)行,目錄的x權(quán)限僅表示可以進(jìn)入該目錄使其成為工作目錄(work directory),如果你在某目錄下不具有 x 的權(quán)限, 那么你就無法切換到該目錄下,也就無法執(zhí)行該目錄下的任何指令,即使你具有該目錄的 r 或 w 的權(quán)限。
Linux 中的文件名限制
長度限制
在 Linux 底下,使用傳統(tǒng)的 ext2/ext3/ext4 文件系統(tǒng)以及近來被 CentOS 7 當(dāng)作預(yù)設(shè)文件系統(tǒng)的 xfs 而言,針對(duì)文件的文件名長度限制為:單一文件或目錄的最大容許文件名為 255 字節(jié),以一個(gè) ASCII 英文占用一個(gè)字節(jié)來說,則大約可達(dá) 255 個(gè)字符長度。若是以每個(gè)中文字占用 2 字節(jié)來說, 最大檔名就是大約在 128 個(gè)中文字之多。
字符限制
因?yàn)橐恍?Linux 文字操作指令的關(guān)系,一般來說,在為文件和目錄命名時(shí)最好可以避免一些特殊字符:\、*、?、>、<、;、&、!、[、]、|、\、'、"、(、)、{、}。
有一些 Linux 命令可用于修改文件權(quán)限,比如 chmod、chown、chgrp 等命令。
chmod 命令
chmod 命令用來變更文件或目錄的權(quán)限。設(shè)置方式采用文字或數(shù)字代號(hào)皆可。符號(hào)鏈接的權(quán)限無法變更,如果用戶對(duì)符號(hào)連接修改權(quán)限,其改變會(huì)作用在被鏈接的原始文件。
語法
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
選項(xiàng)
-c, --changes:類似 verbose,但僅在已變化之后報(bào)告;
-f, --silent, --quiet:不輸出多數(shù)錯(cuò)誤信息;
-v, --verbose:輸出每個(gè)文件處理的診斷信息;
--no-preserve-root:不特別處理根目錄 `/`;
--preserve-root:不遞歸處理根目錄 `/` ;
--reference=RFILE:使用 RFILE 的屬性而不是 MODE 值;
-R, --recursive:遞歸處理文件和目錄;
--help:顯示幫助信息并退出;
--version:顯示版本信息并退出。
參數(shù)
MODE:文件權(quán)限模式。可以是數(shù)值,也可以是字符格式;
FILE:待變更的文件。
指定的變更格式 [ugoa...][[+-=][rwxXst]...][,...]。文件權(quán)限范圍的表示法如下:
-
uUser,即文件或目錄的擁有者; -
gGroup,即文件或目錄的所屬群組; -
oOther,除了文件或目錄擁有者或所屬群組之外,其他用戶皆屬于這個(gè)范圍; -
aAll,即全部的用戶,包含擁有者,所屬群組以及其他用戶; -
+表示添加權(quán)限; -
-表示去除權(quán)限; -
=表示重新分配權(quán)限; -
r讀取權(quán)限,數(shù)字代號(hào)為“4”; -
w寫入權(quán)限,數(shù)字代號(hào)為“2”; -
x執(zhí)行或切換權(quán)限,數(shù)字代號(hào)為“1”。-替換 r、w、x位置時(shí)表示沒有對(duì)應(yīng)的權(quán)限,對(duì)應(yīng)數(shù)字為 0; -
X表示如果對(duì)象是目錄或者它已有執(zhí)行權(quán)限,賦予執(zhí)行權(quán)限 ; -
s運(yùn)行時(shí)重新設(shè)置 UID 或 GID ; -
t設(shè)置粘著位(sticky bit),防止文件或目錄被非屬主刪除。
示例
$ chmod u+x file # 給file的屬主增加執(zhí)行權(quán)限
$ chmod 751 file # 給file的屬主分配讀、寫、執(zhí)行(7)的權(quán)限,給file的所在組分配讀、執(zhí)行(5)的權(quán)限,給其他用戶分配執(zhí)行(1)的權(quán)限
$ chmod u=rwx,g=rx,o=x file # 上例的另一種形式
$ chmod =r file # 為所有用戶分配讀權(quán)限
$ chmod 444 file # 同上例
$ chmod a-wx,a+r file # 同上例
$ chmod -R u+r directory # 遞歸地給directory目錄下所有文件和子目錄的屬主分配讀的權(quán)限
$ chmod 4755 # 設(shè)置用ID,給屬主分配讀、寫和執(zhí)行權(quán)限,給組和其他用戶分配讀、執(zhí)行的權(quán)限。
chown 命令
chown 命令改變某個(gè)文件或目錄的所有者和所屬的組,該命令可以向某個(gè)用戶授權(quán),使該用戶變成指定文件的所有者或者改變文件所屬的組。用戶可以是用戶或者是用戶D,用戶組可以是組名或組id。文件名可以使由空格分開的文件列表,在文件名中可以包含通配符。
只有文件主和超級(jí)用戶才可以便用該命令。
語法
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
選項(xiàng)
-c, --changes:類似 verbose,但僅在已變化之后報(bào)告;
-f, --silent, --quiet:不輸出多數(shù)錯(cuò)誤信息;
-v, --verbose:輸出每個(gè)文件處理的診斷信息;
--dereference:影響每個(gè)符號(hào)鏈接的參照(默認(rèn)),而不是符號(hào)鏈接本身;
-h, --no-dereference:影響符號(hào)鏈接而不是符號(hào)鏈接的參照(在可以改變符號(hào)鏈接的屬主的系統(tǒng)上有用);
--from=CURRENT_OWNER:CURRENT_GROUP:改變能匹配到指定屬主和/或?qū)俳M的每個(gè)文件的屬主和/或?qū)俳M。屬主和屬組都可以省略,就不用匹配省略的屬性;
--no-preserve-root:對(duì)根目錄 `/` 不做特殊處理;
--preserve-root:不處理根目錄 `/`(默認(rèn));
--reference=RFILE:使用 RFILE 的屬性而不是 MODE 值;
-R, --recursive:遞歸操作目錄和文件;
# 下面的選項(xiàng)可修改 -R 選項(xiàng)遍歷的層級(jí)。如果指定了多個(gè)這樣的選項(xiàng),僅最后一個(gè)有效。
-H:如果命令行參數(shù)是一個(gè)符號(hào)鏈接,則遍歷它;
-L:遍歷每個(gè)出現(xiàn)的符號(hào)鏈接;
-P:不遍歷任何符號(hào)鏈接(這是默認(rèn)行為);
--help:顯示幫助信息并退出;
--version:輸出版本信息并退出。
參數(shù)
OWNER:指定文件的所有者和;
GROUP:指定文件的所屬工作組;
FILE:指定要改變所有者和工作組的文件列表。支持多個(gè)文件和目標(biāo),支持 shell 通配符。
示例
將目錄 /usr/meng 及其下面的所有文件、子目錄的文件屬主改成 liu。
chown -R liu /usr/meng
chgrp 命令
chgrp 命令用來改變文件或目錄的所屬群組。其中,組名可以是用戶組的 id,也可以是用戶組的組名。文件名可以是由空格分開的要改變屬組的文件列表,也可以是由通配符描述的文件集合。如果用戶不是該文件的屬主或超級(jí)用戶(root),則不能改變該文件的屬組。
語法
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
選項(xiàng)
-c, --changes:類似 verbose,但僅在已變化之后報(bào)告;
-f, --silent, --quiet:不輸出多數(shù)錯(cuò)誤信息;
-v, --verbose:輸出每個(gè)文件處理的診斷信息;
--dereference:影響每個(gè)符號(hào)鏈接的參照(默認(rèn)),而不是符號(hào)鏈接本身;
-h, --no-dereference:影響符號(hào)鏈接而不是符號(hào)鏈接的參照(在可以改變符號(hào)鏈接的屬主的系統(tǒng)上有用);組都可以省略,就不用匹配省略的屬性;
--no-preserve-root:對(duì)根目錄 / 不做特殊處理;
--preserve-root:不處理根目錄 /(默認(rèn));
--reference=RFILE:使用 RFILE 的屬性而不是 MODE 值;
-R, --recursive:遞歸操作目錄和文件;
# 下面的選項(xiàng)可修改 -R 選項(xiàng)遍歷的層級(jí)。如果指定了多個(gè)這樣的選項(xiàng),僅最后一個(gè)有效。
-H:如果命令行參數(shù)是一個(gè)符號(hào)鏈接,則遍歷它;
-L:遍歷每個(gè)出現(xiàn)的符號(hào)鏈接;
-P:不遍歷任何符號(hào)鏈接(這是默認(rèn)行為);
--help:顯示幫助信息并退出;
--version:輸出版本信息并退出。
參數(shù)
- GROUP:指定的新的屬組名;
- FILE:要改變屬組的文件列表。多個(gè)文件或者目錄之間使用空格隔開。
示例
將 /usr/meng 及其子目錄下的所有文件的用戶組改為 mengxin。
chgrp -R mengxin /usr/meng
文件目錄的默認(rèn)權(quán)限與 umask 命令
Windows 系統(tǒng)中,新建的文件和目錄時(shí)通過繼承上級(jí)目錄的權(quán)限獲得的初始權(quán)限,而在 Linux 和其他類 Unix 的操作系統(tǒng)中, 是通過使用 umask 命令來給所有新建的文件和目錄賦予初始權(quán)限的。umask 命令用來設(shè)置新建文件的權(quán)限的掩碼,或者獲取它當(dāng)前的值。所謂掩碼,就是 umask 的數(shù)值指的是該默認(rèn)值需要減掉的權(quán)限。比如,r、w、x 分別是 4、2、1,當(dāng)要去掉寫權(quán)限,就輸入 2,而如果要去掉讀權(quán)限,也就是輸入 4,要去掉讀與寫的權(quán)限,就輸入 6,而要去掉執(zhí)行權(quán)限與寫權(quán)限,就輸入 3,而 5 就是去掉讀權(quán)限與執(zhí)行權(quán)限。
在默認(rèn)權(quán)限的屬性上,目錄與文件是不一樣的。默認(rèn)情況下:
- 如果創(chuàng)建的是目錄,則對(duì)一般用戶來說,
umask默認(rèn)值為 0002,對(duì)應(yīng)的實(shí)際文件權(quán)限為 775,對(duì)于 root 用戶來說,umask默認(rèn)值為 0022,對(duì)應(yīng)的實(shí)際文件權(quán)限為 755。 - 如果創(chuàng)建的是文件,則對(duì)一般用戶來說,
umask默認(rèn)值為 0113,對(duì)應(yīng)的實(shí)際文件權(quán)限為 664,對(duì)于 root 用戶來說,umask默認(rèn)值為 0133,對(duì)應(yīng)的實(shí)際文件權(quán)限為 644。
第一個(gè)零是一個(gè)特殊的權(quán)限數(shù)字,可以忽略,即 0002 與 002 相同。umask 默認(rèn)輸出的也是針對(duì)新建目錄的權(quán)限掩碼,而不是新建文件的權(quán)限掩碼。
語法
umask [-p] [-S] [mode]
選項(xiàng)
-p:如果提供了-p選項(xiàng),將忽略mode,輸出的內(nèi)容可以當(dāng)作輸入重新使用。-S:接受或返回一個(gè)代表掩碼的符號(hào)而不是一個(gè)八進(jìn)制數(shù)字(默認(rèn)值)。mask:如果指定了一個(gè)合理的掩碼,這個(gè)umask就將被設(shè)置為這個(gè)值。如果沒有指定掩碼,返回當(dāng)前的掩碼值。-
mode:如果mode以數(shù)字開頭,則將 mode 轉(zhuǎn)換為八進(jìn)制。否則,將按照與chmod相似的權(quán)限符號(hào)處理。指定的權(quán)限符號(hào)格式為[ugoa...][[+-=][rwxXst]...][,...]。文件權(quán)限范圍的表示法如下:uUser,即文件或目錄的擁有者;gGroup,即文件或目錄的所屬群組;oOther,除了文件或目錄擁有者或所屬群組之外,其他用戶皆屬于這個(gè)范圍;aAll,即全部的用戶,包含擁有者,所屬群組以及其他用戶;+表示添加權(quán)限;-表示去除權(quán)限;=表示重新分配權(quán)限;r讀取權(quán)限,數(shù)字代號(hào)為“4”;w寫入權(quán)限,數(shù)字代號(hào)為“2”;x執(zhí)行或切換權(quán)限,數(shù)字代號(hào)為“1”。-替換 r、w、x位置時(shí)表示沒有對(duì)應(yīng)的權(quán)限,對(duì)應(yīng)數(shù)字為 0;X表示如果對(duì)象是目錄或者它已有執(zhí)行權(quán)限,賦予執(zhí)行權(quán)限 ;s運(yùn)行時(shí)重新設(shè)置 UID 或 GID ;t設(shè)置粘著位(sticky bit),防止文件或目錄被非屬主刪除。
如果省略了
mode,將打印出當(dāng)前的umask值。如果mode設(shè)置成功或者沒有提供mode,則返回狀態(tài)為0,否則返回false。
示例
查看當(dāng)前用戶創(chuàng)建文件的默認(rèn)權(quán)限。
# root 用戶默認(rèn)值為 0022,對(duì)應(yīng)的文件權(quán)限為 755
[root@localhost ~]# umask
0022
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx
[root@localhost ~]# umask -p
umask 0022
[root@localhost ~]# umask -p -S
umask -S u=rwx,g=rx,o=rx
[root@localhost ~]# mkdir test_dir
[root@localhost ~]# touch test.txt
[root@localhost ~]# ll
# 目錄默認(rèn)為 755(umask 為022),文件默認(rèn)為 644(133)
drwxr-xr-x. 2 root root 6 Nov 23 23:45 test_dir
-rw-r--r--. 1 root root 0 Nov 23 23:45 test.txt
[root@localhost ~]#
# 一般用戶默認(rèn)值為 0002,對(duì)應(yīng)的文件權(quán)限為 775
[root@localhost ~]$ su vincnet
[vincent@localhost ~]$ umask
0002
[vincent@localhost ~]$ umask -p
umask 0002
[vincent@localhost ~]$ umask -S
u=rwx,g=rwx,o=rx
[vincent@localhost ~]$ umask -p -S
umask -S u=rwx,g=rwx,o=rx
[vincent@localhost ~]# mkdir test_dir
[vincent@localhost ~]# touch test.txt
[vincent@localhost ~]$ ll
# 目錄默認(rèn)為 775(umask 為002),文件默認(rèn)為 664(113)
drwxrwxr-x. 2 vincent vincent 6 Nov 23 23:40 test_dir
-rw-rw-r--. 1 vincent vincent 0 Nov 23 23:40 test.txt
修改新建目錄和文件的默認(rèn)權(quán)限。
# 新增其他用戶對(duì)新建文件和目錄的寫權(quán)限
[vincent@localhost ~]$ umask o+w
# 查看 umask 的當(dāng)前值,發(fā)現(xiàn)已經(jīng)改變,不是 0002 了
[vincent@localhost ~]$ umask
0000
# 新建文件測試
[vincent@localhost ~]$ touch test2.txt
# 發(fā)現(xiàn)其他用戶默認(rèn)對(duì)新建文件具有寫權(quán)限了
[vincent@localhost ~]$ ll
-rw-rw-rw-. 1 vincent vincent 0 Nov 23 23:55 test2.txt
drwxrwxr-x. 2 vincent vincent 6 Nov 23 23:40 test_dir
-rw-rw-r--. 1 vincent vincent 0 Nov 23 23:40 test.txt
# 去除其他用戶對(duì)新建文件和目錄的讀權(quán)限和寫權(quán)限
[vincent@localhost ~]$ umask o-rw
# 查看 umask 的當(dāng)前值,發(fā)現(xiàn)已經(jīng)改變
[vincent@localhost ~]$ umask
0006
# 新建目錄測試
[vincent@localhost ~]$ mkdir test2_dir
[vincent@localhost ~]$ ll
# 發(fā)現(xiàn)其他用戶默認(rèn)對(duì)新建目錄已不具備讀權(quán)限和寫權(quán)限了
drwxrwx--x. 2 vincent vincent 6 Nov 24 00:00 test2_dir
-rw-rw-rw-. 1 vincent vincent 0 Nov 23 23:55 test2.txt
drwxrwxr-x. 2 vincent vincent 6 Nov 23 23:40 test_dir
-rw-rw-r--. 1 vincent vincent 0 Nov 23 23:40 test.txt
[vincent@localhost ~]$
文件隱藏權(quán)限
lsattr 命令
lsattr 命令用于列出 Linux 第二擴(kuò)展文件系統(tǒng)上的文件屬性。
語法
lsattr [ -RVadv ] [ files... ]
選項(xiàng)
-
-a:顯示所有文件和目錄,包括以.為名稱開頭的當(dāng)前目錄.與上層目錄..。 -
-d:顯示目錄的屬性,而非其每個(gè)文件列表項(xiàng)目的屬性。 -
-R:遞歸處理,將指定目錄下的所有文件及子目錄一并處理。 -
-v:顯示文件或目錄版本。 -
-V:顯示程序的版本信息。
chattr 命令
chattr 命令用于更改 Linux 文件系統(tǒng)上的文件屬性。
語法
chattr [ -RVf ] [ -v version ] [ -p project ] [ mode ] files...
選項(xiàng)
-
-R:遞歸地更改目錄以及其中所有內(nèi)容屬性。 -
-V:詳細(xì)記錄chattr的輸出并打印程序版本。 -
-f:抑制大多數(shù)錯(cuò)誤消息。 -
-v version:設(shè)置文件的 version/generation number。 -
-p project:設(shè)置文件的 project number。
屬性
符號(hào)模式的格式為 +-=[aAcCdDeFijmPsStTux]。其中,
-
+運(yùn)算符用于向文件的現(xiàn)有屬性添加新的屬性。 -
-運(yùn)算符用于從文件的現(xiàn)有屬性中移除指定的屬性。 -
=運(yùn)算符用于將當(dāng)前文件屬性設(shè)置指定指定的屬性。
aAcCdDeFijmPsStTux 字母表示選擇屬性。chattr 命令的屬性只能在 Ext2/Ext3/Ext4 的 Linux 傳統(tǒng)文件系統(tǒng)上面完整生效,其他的文件系統(tǒng)可能就無法完整的支持該命令的屬性了。請參考 btrfs、ext4、和 xfs 文件系統(tǒng)的文檔。
a:具有a屬性集的文件只能在追加模式下打開以進(jìn)行寫入。只有超級(jí)用戶或擁有CAP_LINUX_IMMUTABLE功能的進(jìn)程可以設(shè)置或清除此屬性。A:當(dāng)訪問具有A屬性集的文件時(shí),其atime記錄不被修改。這避免了筆記本電腦系統(tǒng)上的一些的磁盤 I/O。c:內(nèi)核會(huì)在磁盤上自動(dòng)壓縮設(shè)置了c屬性的文件。讀取此文件將返回未壓縮的數(shù)據(jù)。寫入此文件會(huì)在將數(shù)據(jù)存儲(chǔ)到磁盤之前壓縮數(shù)據(jù)。注意:對(duì)于btrfs文件系統(tǒng),如果設(shè)置了c,則無法設(shè)置C標(biāo)志。還與btrfs掛載選項(xiàng)nodatasum沖突。-
C:設(shè)置了C屬性的文件將不會(huì)進(jìn)行寫時(shí)復(fù)制(copy-on-write)更新。此標(biāo)志僅在執(zhí)行寫時(shí)復(fù)制(copy-on-write)的文件系統(tǒng)上受支持。注意:對(duì)于
btrfs文件系統(tǒng),應(yīng)在新文件或空文件上設(shè)置C標(biāo)志。如果在已具有數(shù)據(jù)塊的文件上設(shè)置了C,則在分配給該文件的塊完全穩(wěn)定時(shí),該標(biāo)志未定義。如果在目錄上設(shè)置了C標(biāo)志,則該標(biāo)志對(duì)該目錄沒有影響,但在該目錄中創(chuàng)建的新文件將具有No_COW屬性。如果設(shè)置了C標(biāo)志,則無法設(shè)置c標(biāo)志。 d:運(yùn)行dump程序時(shí),具有d屬性集的文件不是備份的候選文件。D:當(dāng)修改設(shè)置了D屬性的目錄時(shí),更改會(huì)同步寫入磁盤;這相當(dāng)于應(yīng)用于文件子集的dirsync掛載選項(xiàng)。e:e屬性表示文件正在使用擴(kuò)展數(shù)據(jù)塊映射磁盤上的塊。不能使用chattr將其刪除。E:文件系統(tǒng)對(duì)具有E屬性集的文件、目錄或符號(hào)鏈接進(jìn)行加密。雖然可以通過lsattr顯示該屬性,但不能使用chattr設(shè)置或清除該屬性。F:設(shè)置了F屬性的目錄表示該目錄中的所有路徑查找都是以不區(qū)分大小寫的方式進(jìn)行的。此屬性只能在啟用casefold功能的文件系統(tǒng)上的空目錄中更改。i:無法修改具有i屬性的文件。無法刪除或重命名該文件,無法創(chuàng)建到此文件的鏈接,無法修改該文件的大部分元數(shù)據(jù),并且無法在寫入模式下打開該文件。只有超級(jí)用戶或具有CAP_LINUX_IMMUTABLE功能的進(jìn)程才能設(shè)置或清除此屬性。I:htree代碼使用I屬性來指示正在使用哈希樹對(duì)目錄進(jìn)行索引。雖然可以通過lsattr顯示,但不能使用chattr設(shè)置或清除該值。j:如果文件系統(tǒng)使用data=ordered或data=writeback選項(xiàng)掛載,并且文件系統(tǒng)具有日志,則具有j屬性的文件在寫入到文件本身之前,其所有數(shù)據(jù)都已寫入 ext3 或 ext4 日志。當(dāng)使用data=journal選項(xiàng)掛載文件系統(tǒng)時(shí),所有文件數(shù)據(jù)都已記錄,并且此屬性無效。只有超級(jí)用戶或擁有CAP_SYS_RESOURCE功能的進(jìn)程才能設(shè)置或清除此屬性。m:在支持逐個(gè)文件壓縮的文件系統(tǒng)上,具有m屬性的文件將被排除在壓縮范圍之外。N:設(shè)置了N屬性的文件表示該文件在inode本身內(nèi)以 inline 方式存儲(chǔ)了數(shù)據(jù)。雖然可以通過lsattr顯示,但不能使用chattr設(shè)置或清除該值。P:具有P屬性集的目錄將強(qiáng)制項(xiàng)目 id 的層次結(jié)構(gòu)。這意味著在目錄中創(chuàng)建的文件和目錄將繼承目錄的項(xiàng)目 id,重命名操作受到約束,因此當(dāng)文件或目錄移動(dòng)到另一個(gè)目錄中時(shí),項(xiàng)目 id 必須匹配。此外,只有當(dāng)文件的項(xiàng)目 id 與目標(biāo)目錄匹配時(shí),才能創(chuàng)建指向文件的硬鏈接。s:刪除具有s屬性集的文件時(shí),其塊將歸零并寫回磁盤。S:當(dāng)修改屬性設(shè)置為S的文件時(shí),更改將同步寫入磁盤;這相當(dāng)于應(yīng)用于文件子集的sync掛載選項(xiàng)。t:具有t屬性的文件在與其他文件合并的文件末尾不會(huì)有部分塊片段(對(duì)于支持尾部合并的文件系統(tǒng))。這對(duì)于像 LILO 這樣的應(yīng)用程序是必需的,它們直接讀取文件系統(tǒng),并且不理解尾部合并文件。注意:在撰寫本文時(shí),ext2、ext3 和 ext4 文件系統(tǒng)不支持尾部合并。T:對(duì)于Orlov塊分配器(block allocator),具有T屬性的目錄將被視為目錄層次結(jié)構(gòu)的頂部。這是對(duì) ext3 和 ext4 所使用的塊分配器的一個(gè)提示,即該目錄下的子目錄不相關(guān),因此應(yīng)該分開以進(jìn)行分配。例如,在/home目錄上設(shè)置T屬性是一個(gè)非常好的主意,這樣/home/john和/home/mary就被放置在單獨(dú)的塊組中。對(duì)于未設(shè)置此屬性的目錄,Orlov塊分配器將嘗試盡可能將子目錄分組在一起。u:刪除具有u屬性集的文件時(shí),將保存其內(nèi)容。這允許用戶請求取消刪除。x:可以在目錄或文件上設(shè)置x屬性。如果在現(xiàn)有目錄上設(shè)置了該屬性,則隨后在該目錄中創(chuàng)建的所有文件和子目錄都將繼承該屬性。如果現(xiàn)有目錄包含一些文件和子目錄,則修改父目錄上的屬性不會(huì)更改這些文件和子目錄上的屬性。V:具有V屬性集的文件已啟用 fs-verity。它無法寫入,文件系統(tǒng)將根據(jù)覆蓋整個(gè)文件內(nèi)容的加密散列(例如通過 Merkle 樹)自動(dòng)驗(yàn)證從中讀取的所有數(shù)據(jù)。這使得有效地對(duì)文件進(jìn)行身份驗(yàn)證成為可能。雖然可以通過lsattr顯示該屬性,但不能使用chattr設(shè)置或清除該屬性。
在當(dāng)前的主線 Linux 系統(tǒng)中實(shí)現(xiàn)的 ext2、ext3 和 ext4 文件系統(tǒng)不支持 c、s 和 u 屬性內(nèi)爾斯。j 選項(xiàng)僅對(duì) ext3 和 ext4 文件系統(tǒng)有用。D 選項(xiàng)僅在 Linux 內(nèi)核2.5.19 及更高版本上有用。
示例
最重要的當(dāng)屬 +i 與 +a 這個(gè)屬性了。+i 可以讓一個(gè)文件無法被更改,對(duì)于需要強(qiáng)烈的系統(tǒng)安全的人來說很重要。
[root@localhost vincent]# lsattr test.txt
---------------- test.txt
[root@localhost vincent]# chattr +i test.txt
[root@localhost vincent]# lsattr test.txt
----i----------- test.txt
[root@localhost vincent]# chattr -i test.txt
[root@localhost vincent]# lsattr test.txt
---------------- test.txt
文件系統(tǒng)特殊權(quán)限:SUID、SGID、SBIT
我們再來看一下 /tmp 和 /usr/bin/passwd 文件的權(quán)限。
[vincent@localhost ~]$ ls -ld /tmp; ls -l /usr/bin/passwd
drwxrwxrwt. 15 root root 4096 Nov 23 21:14 /tmp
-rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd
s 與 t 這兩個(gè)權(quán)限的意義與系統(tǒng)的賬號(hào)及系統(tǒng)的進(jìn)程相關(guān)。暫且先說明一下如何使用這兩個(gè)權(quán)限。
SUID
在 Linux 系統(tǒng)中,所有賬號(hào)的密碼都記錄在 /etc/shadow 這個(gè)文件里面,這個(gè)文件的權(quán)限為:---------- 1 root root,意思是這個(gè)文件僅有 root 可讀且僅有 root 可以強(qiáng)制寫入而已。那么一般賬號(hào)為什么可以修改自己的密碼呢?passwd 的擁有者是 root 這個(gè)賬號(hào),而一般用戶在執(zhí)行 passwd 的過程中,會(huì)“暫時(shí)”獲得 root 的權(quán)限,/etc/shadow 就可以被一般用戶所執(zhí)行的 passwd 所修改。而一般用戶如果使用 cat 去讀取 /etc/shadow ,則會(huì)提示 Permission denied,因?yàn)?cat 不具有 SUID 的權(quán)限。
當(dāng) s 這個(gè)標(biāo)志出現(xiàn)在文件擁有者(owner)的 x 權(quán)限位置上時(shí)被稱為 Set User ID,簡稱為 SUID 的特殊權(quán)限。SUID 有這樣的限制與功能:
-
SUID 權(quán)限僅對(duì)二進(jìn)制程序(binary program)有效,對(duì)一般不可執(zhí)行的文件無意義。當(dāng)文件所有者權(quán)限的第三位是一個(gè)大寫的
S時(shí),則表示原先的x權(quán)限位置內(nèi)容為-。SUID 也不能夠用在 shell script 上面,因?yàn)?shell script 只是將多個(gè)二進(jìn)制程序組合在一起執(zhí)行而已,所以 SUID 的權(quán)限部分,還是得要看 shell script 中的程序是否具有 SUID 權(quán)限而定,而不是 shell script 本身。
SUID 對(duì)于目錄也是無效的。
程序執(zhí)行者需要對(duì)該程序具有可執(zhí)行權(quán)限。如果文件所有者沒有可執(zhí)行權(quán)限,則此處將顯示為大寫字母 S。
在默認(rèn)情況下,如果用戶發(fā)起一個(gè)進(jìn)程,則該進(jìn)程的屬主是發(fā)起者而并非是文件的擁有者,此時(shí)進(jìn)程是以發(fā)起者的身份去運(yùn)行。但是,如果給可執(zhí)行的二進(jìn)制程序文件添加了 SUID 權(quán)限后,當(dāng)調(diào)用該程序時(shí),則對(duì)應(yīng)進(jìn)程的屬主為程序文件的擁有者而并非是發(fā)起者。可以看作調(diào)用者暫時(shí)獲得該文件擁有者的權(quán)限,所獲的權(quán)限僅在執(zhí)行該二進(jìn)制程序的過程中有效。
SGID
當(dāng) s 這個(gè)標(biāo)志出現(xiàn)在文件群組(group)的 x 權(quán)限位置上時(shí)被稱為 Set Group ID,簡稱為 SGID。與 SUID 不同的是,SGID 可以對(duì)于文件或目錄來說均有效。看下面的文件。
[vincent@localhost ~]$ ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 Apr 11 2018 /usr/bin/locate
對(duì)文件來說, SGID 有如下的功能:
- SGID 僅對(duì)可執(zhí)行二進(jìn)制程序有用。如果在瀏覽文件時(shí),當(dāng)文件群組權(quán)限的第三位是一個(gè)大寫的
S時(shí),則表示原先的x權(quán)限位置內(nèi)容為-。 - 程序執(zhí)行者需要對(duì)該程序來具備
x的權(quán)限。 - 在執(zhí)行該文件時(shí),程序執(zhí)行者將獲得該文件所屬組的權(quán)限。
在看下面的文件。
[vincent@localhost ~]$ sudo -i
[root@localhost ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40520 Apr 11 2018 /usr/bin/locate
-rw-r-----. 1 root slocate 2831122 Nov 23 21:14 /var/lib/mlocate/mlocate.db
與 SUID 非常的類似,若使用一般賬號(hào)去執(zhí)行 locate 命令時(shí)將會(huì)取得 slocate 群組的權(quán)限,因此一般用戶就能夠去讀取 mlocate.db 文件了。
除了可執(zhí)行二進(jìn)制程序之外,SGID 也能夠用在目錄上。當(dāng)一個(gè)目錄設(shè)定了 SGID 的權(quán)限后,它將具有如下的功能:
- 當(dāng)用戶若對(duì)于此目錄具有
r與x的權(quán)限時(shí),該用戶能夠進(jìn)入此目錄。 -
用戶在該目錄下的有效群組(effective group)將會(huì)變成該目錄所屬的群組。所以,當(dāng)用戶對(duì)該目錄具有
w的權(quán)限(可修改該目錄下的文件列表),則使用者所建立新文件的群組與該目錄所屬的群組相同。
Sticky Bit
SBIT 全稱 Sticky Bit(粘滯位),它出現(xiàn)在其他用戶(other)的 x 權(quán)限位置上,只能用來修飾一個(gè)目錄。當(dāng)某一個(gè)目錄擁有 SBIT 權(quán)限時(shí),用戶在這個(gè)目錄下所建立的文件和目錄只有該用戶自己和 root 可以刪除,其他用戶均不可以。
當(dāng)其他用戶(other)對(duì)某個(gè)目錄具有可執(zhí)行權(quán)限時(shí)則顯示為 -t,當(dāng)其他用戶(other)對(duì)某個(gè)目錄不具有可執(zhí)行權(quán)限時(shí)則顯示為 -T。
SBIT 對(duì)于 /var/tmp 和 /tmp 等共享目錄很有用,因?yàn)橛脩艨梢詣?chuàng)建文件、讀取和執(zhí)行其他用戶擁有的文件,但不允許刪除其他用戶擁有的文件。
SUID、SGID 和 SBIT 的設(shè)置
可以通過數(shù)字方式來設(shè)置這三個(gè)特殊權(quán)限。三個(gè)權(quán)限對(duì)應(yīng)的數(shù)字分別是:
SUID:4
SGID:2
SBIT:1
假設(shè)要為一個(gè)文件設(shè)置權(quán)限 -rwsr-xr-x 時(shí),由于 s 在所有者權(quán)限的執(zhí)行位上,所以是 SUID,因此在原先的 755 之前加上 4 即可,即使用 chmod 4755 filename 來設(shè)置。
此外,也可以通過符號(hào)法來設(shè)置三個(gè)特殊權(quán)限,其中 SUID 為 u+s,SGID 為 g+s,SBIT 則是 o+t,來看看如下的范例:
[root@localhost ~]# chmod u=rwxs,go=x test
[root@localhost ~]# ll test
-rwsr-sr-t 1 root root 0 Feb 14 15:51 haha
總結(jié)如下:

如果本來在 x 位上設(shè)置了 x,設(shè)置這些位將會(huì)顯示小寫字幕,否則會(huì)顯示為大寫字母,即無效。這三位如果轉(zhuǎn)化為 8 進(jìn)制表示的話,分別對(duì)應(yīng)的是 4(SUID),2(SGID)、1(sticky bit)、0(什么也不是)。