衆所周知,Linux之所以更加安全,其根源在于對文件權限有着非常嚴格的控制。本文将簡單介紹一下Linux的文件權限及其相關操作。
一、相關概念
1.1 權限簡介
執行“ls -l”命令後就可以查看某一個目錄文件的目錄項以及對應的權限,如下圖所示:
示例内容
對于上圖中的結果而言,每列均代表不同的含義。
(1)第一列由10個字符組成,首個字符用于表示該文件的類型。對于該字符而言,每個字符對應的含義如下所示:
第一個字符 |
目錄 |
d |
目錄 |
- |
普通文件 |
l |
鍊接文件 |
b |
塊文件 |
c |
字符文件 |
s |
socket文件 |
p |
管道文件 |
接下來的屬性中,每3個字符為一組,每組分别代表不同的含義。其中,第2~4個字符代表該文件所有者(user)的權限,第5~7個字符代表該文件所屬組(group)的權限,第8~10個字符代表其他用戶(others)能夠擁有的權限。
對于每組而言,都由rwx這三個字符組合。其中,r表示讀權限,位于首個字符;w表示寫權限,位于第二個字符;x表示執行權限,位于最後一個字符。若無對應的權限,則對應位置處會用 " - " 代替。
(2)第二列表示"連接數”。若文件為非目錄文件,則連接數為1。若該文件為目錄文件,則其連接數是該目錄中所有直接子目錄的總個數 2,假如目錄A中包含目錄B和C,則目錄A的連接數為4。
(3)第三列表示該文件所屬的用戶
(4)第四列代表該文件所屬的用戶組。
(5)第五列表示該文件的大小。
(6)第六列到第八列表示文件的創建時間或最近修改時間,每列依次表示為:月份、日期和時刻。
(7)第九列為文件名。
1.2 隐藏屬性
查看文件的隐藏屬性需要使用lsattr命令,默認情況下,文件的隐藏屬性不會進行設置。下面給出對應的例子:
從上述結果中可知,第一列是13個小短橫,其中每一個小橫線都是一個屬性,如果當前位置上設置了該屬性就會顯示相對應的字符。
如果要設置文件的隐藏屬性,需要使用chattr命令。這裡介紹幾個常用的隐藏屬性,第一種就是 a 屬性。擁有這種屬性的文件隻能在尾部增加數據而不能被删除。比如下面的例子:
還有一種比較常用的屬性,也就是 i 屬性。當一個文件被設置了i屬性後,将無法進行寫入、重命名、删除等操作,即便該用戶是root用戶也依然不會被允許。這種屬性常用于系統或者關鍵服務中相關配置文件的設置,可以在一定程度上提升系統的安全性。
參數 |
作用 |
i |
禁止對文件進行修改;如果設置該屬性的文件是目錄,則僅能修改其子文件的内容,而不能新建或删除文件 |
a |
僅允許追加内容,而無法覆蓋或删除對應的内容 |
S |
文件内容變更後會立即同步到硬盤(Sync) |
s |
徹底從硬盤中删除,不可進行恢複(将原文件所在地硬盤區域用0進行填充) |
A |
不能再修改該文件或目錄的最後訪問時間 |
b |
不能再修改該文件或目錄的最後存取時間 |
d |
使用dump命令備份時忽略該文本或目錄 |
D |
檢查壓縮文件中的錯誤 |
如果需要了解更多的隐藏屬性,可以使用man chattr來查詢。
1.3 默認權限和遮罩值
所有的文件在創建時都被系統分配默認的權限,下面給出一個例子。
首先使用root用戶登錄系統,并執行如下命令:
touch root_file1 root_file2
mkdir root_dir1 root_dir2
接着使用如下命令來查看創建文件的默認權限:
ls -ld root_*
執行結果如下所示:
從上面可以得知,創建的root_file1、root_file2文件的權限都是644;而創建的root_dir1、root_dir2目錄的權限都是755。此時好像可以得出一個結論:文件的權限默認是644,目錄的默認權限是755。
為了驗證這個結論是否正确,我們需要切換另一個普通用戶再次進行嘗試,執行的命令如下所示:
touch u_file1 u_file2
mkdir u_dir1 u_dir2
接着使用如下命令來查看創建文件的默認權限:
ls -ld u_*
執行結果如下所示:
這裡創建的u1_file1、u1_file2文件的權限都是664;而創建的u1_dir1、u1_dir2目錄的權限都是775。
此時就會産生一個疑問,這個默認權限是從何而來的?為何root用戶和普通用戶的默認權限會有所不同?
此時就需要引入umask概念,中文翻譯為:遮罩。在Linux下,目錄創建後的默認權限的值是“被umask遮罩777後的權限”;而對于文件而言,其創建後的默認權限是“umask遮罩666後的權限”。系統在/etc/profile文件中,設置了不同用戶的遮罩值。因此,我們使用cat命令查看/etc/profile如下所示:
從上面可以看出,UID大于199的用戶設置的umask值為002,相反,小于199的用戶則設置為022。也就是說,umask值對于root用戶來說是022,對于普通用戶則是002。不同用戶設置不同的遮罩值,這導緻root用戶和普通用戶創建出來的文件和目錄默認權限也有所不同。
那麼如何使用遮罩計算權限呢?
777可以表示為:rwxrwxrwx,如果遮罩值是022,用字符串表示為:----w--w-,那麼前者第五位和第八位的w被遮罩掉,權限變為rwxr-xr-x,用數字表示就是755。如果遮罩值是002,用字符串表示為:-------w-,那麼第八位的w被遮罩掉,權限變為rwxrwxr-x,用數字表示就是775。
666用字符串表示為:rw-Rw-rw-,如果遮罩值是022,用字符串表示為:----w--w-,那麼前者第五位和第八位的w被遮罩掉,權限變為rw-r--r--,用數字表示就是644。如果遮罩值是002,用字符串表示為:-------w-,那麼第八位的w被遮罩掉,權限變為rw-rw-r--,用數字表示就是664。
二、相關操作
對于文件的權限的操作有三種,分别是:改變權限、改變文件擁有者和改變文件擁有組。
2.1 改變文件權限
改變文件權限對應命令為:chmod。在Linux下,每個文件都會定義對應的文件創建者(user)、擁有組(group)以及其他用戶(others)的權限,用字母u(user)、g(group)、o(other)來分别代表擁有者、擁有組和其他人,而對應的具體權限則使用rwx的組合來定義。如果是增加權限,則使用 号;如果是删除權限,則使用-号;如果是設置為某個權限,則使用=号。
如果要給用戶組或其他人添加或删除相關權限,隻需要将上面的u相應地更換成g或o即可。但是正如大家看到的,這種方式在同一時刻隻能給文件擁有者、文件擁有組或是其他所有人設置權限,如果要想同時為所有用戶設置權限就需要使用數字表示法。需要說明的是,r為4,w為2,x為1。如果權限是rwx,則用數字7表示;如果權限是r-x,則用數字5表示。假設想設置一個文件的權限是:擁有者的權限是讀、寫、執行(rwx),擁有組的權限是讀、執行(r-x),其他人的權限是隻讀(r--),那麼可以使用命令chmod 754 somefile來進行設置。
下面給出對應的例子。
[root@localhost src]# ll
總用量 0
-rw-r--r--. 1 root root 0 5月 20 17:54 test.txt
# 為test.txt所屬的用戶增加執行權限
[root@localhost src]# chmod u x test.txt
[root@localhost src]# ll
總用量 0
-rwxr--r--. 1 root root 0 5月 20 17:54 test.txt
# 為test.txt所屬用戶組增加寫入權限
[root@localhost src]# chmod g w test.txt
[root@localhost src]# ll
總用量 0
-rwxrw-r--. 1 root root 0 5月 20 17:54 test.txt
# 為test.txt文件設置權限:776表示所屬用戶和所屬用戶組有讀取、寫入和執行權限,而其他用戶隻有讀取和寫入權限
[root@localhost src]# chmod 776 test.txt
[root@localhost src]# ll
總用量 0
-rwxrwxrw-. 1 root root 0 5月 20 17:54 test.txt
此外,如果需要修改的對象是一個目錄而非文件,并且需要對該目錄下所有的文件、子目錄、以及子目錄下所有的文件和目錄都進權限設置,此時需要使用-R參數,也就是chmod -R 754 somedir。
2.2 改變文件擁有者
更改文件擁有者的命令為:chown,該命令也具備更改文件擁有組的功能。默認情況下,當前登錄系統的用戶即為新創建文件或目錄的擁有者。下面給出對應的示例:
[root@localhost src]# ll
總用量 0
-rwxrwxrw-. 1 root root 0 5月 20 17:54 test.txt
# 将test.txt的文件擁有者修改為user1
[root@localhost src]# chown user1:user2 test.txt
[root@localhost src]# ll
總用量 0
# 此時發現文件的擁有者已經變為了user1
-rwxrwxrw-. 1 user1 user2 0 5月 20 17:54 test.txt
需要說明的一點,如果修改的對象不是一個文件而是一個目錄時,且需要對該目錄下所有的文件、子目錄以及子目錄下所有的文件和目錄都需要進行修改時,就需要使用-R參數。
2.3 改變文件擁有組
改變文件擁有者使用的命令為:chgrp,下面給出對應的例子:
[root@localhost src]# ll
總用量 0
-rwxrwxrw-. 1 user1 user2 0 5月 20 17:54 test.txt
# 将test.txt的所屬組修改為user1用戶組
[root@localhost src]# chgrp user1 test.txt
[root@localhost src]# ll
總用量 0
-rwxrwxrw-. 1 user1 user1 0 5月 20 17:54 test.txt
到此,關于Linux文件權限的接收就已經完畢,希望對大家有所幫助。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!