文件權限
在linux中一切都是文件,但是每個文件的類型不盡相同,linux系統使用不同的字符來加以區分,常見的字符如下:
字符 | 含義 |
---|---|
- | 普通文件 |
d | 目錄文件 |
l | 鏈接文件 |
b | 塊設備文件 |
c | 字符設備文件 |
p | 管道文件 |
每個文件都有所有者和所有組,並且有各自的權限,讀(r)寫(w)執行(x),對於文件和目錄rwx含義是不用的
- 文件:
r 讀取文件內容的權限
w 修改文件內容的權限
x 執行文件內容的權限 - 目錄:
r 查看目錄下文件的權限
w 穿件、刪除、修改目錄下文件的權限
r 進入目錄的權限
示例如下:
lrwxrwxrwx. 1 root root 7 Feb 7 19:53 bin -> usr/bin
dr-xr-xr-x. 3 root root 4096 Feb 7 12:08 boot
文件的特殊權限
SUID
SUID是一種對二進制程序進行設置的特殊權限,可以上二進制程序的執行者臨時擁有屬主的權限(僅對擁有執行權限的二進制程序有效)
命令是chmod u+s 文件名
,將所有者的權限由rwx變成rws,其中x變成s表示擁有了SUID權限,如果原本所有者的權限是rw-就會變成rwS,其中-會變成大寫的S
例如passwd命令:
[root@localhost /]# ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 30 2014 /bin/passwd
SGID
SGID主要實現兩種功能:
- 讓執行者臨時擁有屬組的權限(對擁有執行權限的二進制程序進行設置)
- 在某個目錄中創建的文件自動繼承改目錄的用戶組
命令是chmod g+s 文件名
,將所有組的權限由rwx變成rws,其中x變成s表示擁有了SGID權限,如果原本所有組的權限是rw-就會變成rwS,其中-會變成大寫的S
示例:
創建一個目錄test,屬主和屬組是test,將目錄的權限設置爲777,其他用戶都可以在test目錄下創建自己的文件,屬主和屬組都是用戶自己
設置SGID後,其他用戶在test目錄下創建的文件,屬組將會變成test[root@localhost /]# chmod 777 /test [root@localhost /]# ls -l /test drwxrwxrwx. 2 test test 6 Feb 7 20:36 test [root@localhost /]# su -l developer -c "touch /test/a.txt" [root@localhost /]# chmod g+s /test [root@localhost /]# ls -l /test drwxrwsrwx. 2 test test 6 Feb 7 20:36 test [root@localhost /]# su -l developer -c "touch /test/b.txt" [root@localhost /]# ls -l test/ -rw-r--r--. 1 developer developer 0 Feb 7 20:37 a.txt -rw-r--r--. 1 developer test 0 Feb 7 20:37 b.txt
SBIT
對一個目錄設置了SBIT權限後,改目錄中的文件只能被其所有者執行刪除操作,其他用戶沒有刪除權限。
命令是 chmod o+t 目錄名
,文件的其他人權限部分的x執行權限會被替換成t或者T,原本有x執行權限則會寫成r,原本沒有x執行權限則會被寫成T。
例如系統中的/tmp目錄,所有用戶都可以在/tmp目錄下創建文件,但是不能刪除其他用戶創建的文件。
文件的隱藏屬性
chattr命令
chattr命令用於設置文件的隱藏權限,格式爲“chattr [參數] 文件名” 。如果想要把某個隱藏功能添加到文件上,則需要在命令後面追加 "+參數" ,如果想要把某個功能移除文件,則需要追加 "-參數"。命令參數如下表:
示例:
對一個普通文件進行操作,創建、覆蓋、追加、刪除都是可以的:
[root@localhost ~]# touch aa.txt
[root@localhost ~]# echo "hello" >aa.txt
[root@localhost ~]# echo "hello" >>aa.txt
[root@localhost ~]# rm -f aa.txt
對一個文件加上隱藏權限a,只能追加文件,不能覆蓋和刪除文件
[root@localhost ~]# touch bb.txt
[root@localhost ~]# chattr +a bb.txt
[root@localhost ~]# echo "hello" >bb.txt
-bash: bb.txt: Operation not permitted
[root@localhost ~]# echo "hello" >>bb.txt
[root@localhost ~]# rm -f bb.txt
rm: cannot remove ‘bb.txt’: Operation not permitted
lsattr 命令
lsattr命令用於顯示文件的隱藏權限,格式爲"lsattr [參數] 文件"。在linux系統中,文件的隱藏權限必須使用lsattr命令來查看
[root@localhost ~]# lsattr bb.txt
-----a---------- bb.txt
[root@localhost ~]# ls -l bb.txt
-rw-r--r--. 1 root root 6 Feb 10 11:00 bb.txt
文件訪問控制列表
上面講的一般權限、特殊權限、隱藏權限的一個共性---權限是針對某一類用戶設置的,如果想對一個指定的用戶進行單獨的權限控制,就需要用到文件的訪問控制列表(ACL)。給予普通文件或者目錄設置ACL其實就是針對指定的用戶或者用戶組設置文件或者目錄的操作權限。如果針對某個目錄設置了ACL,則目錄中的文件會繼承其ACL;如果對文件這事了ACL,則文件不再繼承其所在目錄的ACL。
例如:
使用普通用戶linuxprobe進入root用戶的家目錄中,會提示沒有權限
[linuxprobe@localhost ~]$ cd /root
-bash: cd: /root: Permission denied
[linuxprobe@localhost ~]$
setfacl 命令
setfacl 命令用戶管理文件的ACL規則,格式爲"setfacl [參數] 文件名"。文件的ACL提供的是在所有者、所有組、其他人的讀、寫、執行權限之外的特殊權限控制,使用setfacl命令可以針對單一用戶或用戶組、單一文件或目錄來進行讀、寫、執行權限的控制。針對目錄需要使用 -R 參數;針對文件使用 -m 參數;如果要刪除某一個文件的ACL,則使用 -b 參數。
示例:
設置用戶在/root目錄上的權限,使普通用戶linuxprobe可以進入/root目錄:
[root@localhost ~]# setfacl -Rm u:linuxprobe:rwx /root
[root@localhost ~]# su - linuxprobe
Last login: Mon Feb 10 11:10:08 CST 2020 on pts/2
[linuxprobe@localhost ~]$ cd /root/
[linuxprobe@localhost root]$ ls
anaconda-ks.cfg bb.txt initial-setup-ks.cfg
刪除ACL權限:
setfacl -b /root
getfacl 命令
getfacl命令用戶顯示文件上設置的ACL信息,格式爲"getfacl 文件名"。
[root@localhost ~]# getfacl /root/
getfacl: Removing leading '/' from absolute path names
# file: root/
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---