目錄
文件屬性
chown更改所有者
chgrp更改所屬組
文件權限rwx
chmod修改權限
默認權限umask
權限判定的順序
特殊權限SUID,SGID,sticky
隱藏權限chattr,lstattr
ACL
在說權限之前,我們應該簡單的了解文件的屬性,和如何更改文件屬性:
通過我們上面的圖片我們可以看出來文件的一些基本屬性,有權限,鏈接數,所有者和所屬組,文件大小,修改時間,文件名等,我們先來介紹兩個用來更改所有者和所屬組的命令,然后對權限的管理展開討論。
修改文件所有者
命令:chown
格式:chown [option] newuser filename
選項:
-R 遞歸更改
--reference source target 參照source修改target
對於chown來說,既可以更改所有者其實也可以更改所屬組,我們可以利用chown user:group filename直接更改所有者和所屬組,或者chown :group filename來更改所屬組,只不過,前者只能由root來完成,后者可以是普通用戶,但是用戶必須是文件的所有者,並且還要是已經加入了目標組才可以。我們做一個簡單的演示:
接下來是chgrp用來修改所屬組的,這個命令是所有用戶都可以使用的,但是,用戶必須是文件的所有者,並且屬於目標組才可以,否者不能更改,基本和上圖一樣,不在做演示。
修改所屬組
命令:chgrp
格式:chgrp [option] group filename
選項:
-R 遞歸更改
--reference source target 參照source修改target
接下來才是最重要的,權限!我們知道每個文件都有所有者,所屬組和其他人,而每一位都是有對應的權限的,這樣的設計目的試問了保證隱私和文件的安全,所有者對應的是u,所屬組對應的是g,其他人對應的是o,而每個文件針對每一類訪問者都有三種基本權限:r:Readable;w:Writable;x:eXcutable,我們通過對三類訪問者設定不同的rwx值就可以控制訪問者對文件的權限。
無論是對於文件還是目錄,都是有rwx權限,但是,目錄的rwx權限卻和文件的rwx權限是不一樣的,此外對於目錄的設置還有一個X權限,我們會在后面說到。我們先說一下,rwx權限所對應的數字意義:
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
在一般情況下,我們會選擇使用數字來更改權限,例如742 = -rwxr--w-;621 = -rw--w---x
有權限,自然可以修改權限,下面我們來說一個更改文件權限的命令chmod。
修改文件權限
命令:chmod
格式:chmod [option] mode[,mode] filename
格式:
mode:修改一類權限
u= g= o= ug= uo= go= ugo=
mode:修改一些用戶的某個權限
u+ u- g+ g- o+ o-
--reference source target參照source修改target
-R遞歸修改權限
我們可以通過上面的方式對文件權限進行修改,為了方便,我們也可以通過使用數字來對權限進行修改,比如:chmod 744 test1.txt。
我們剛才說,還有一個針對於目錄的大X權限,這是啥嘞,這是由於我們我們會修改目錄權限至少為x,但是,我們如果進行遞歸修改的話,會把文件也設置成x權限,由於x對於文件來說是可執行權限,很不安全,所以我們在遞歸修改目錄權限時,可以使用X權限,這樣就不會將目錄下面的文件加上x權限了,可是如果我們目錄下的某一個文件無論所有者所屬組還是其他人只有有一個用於x權限,使用X修改目錄權限時依然會將此文件所有者所屬組和其他人都加上x權限。但是一般情況下我們可以不用X權限的,因為給目錄的默認權限是有x權限的,什么是默認權限,我們在下面來講。
我們無論是新建文件還是目錄,當我們建好后都會有一些默認的權限,(root的默認權限和普通用戶的不同),這些默認權限是哪里來的呢,為什么要這樣設定默認權限?首先我們先說哪里來的,我們可以使用umask查看當前用戶的默認權限,如果你是一般用戶,你會發現默認權限是0002 root用戶是0022,后三位是普通權限位,第一位是特殊權限位,我們先來說普通權限位。當umask中全部是偶數時,可以直接減,當umask中包含奇數時,對於目錄直接減,對於文件,在奇數所在的位減完后加一。默認全局配置文件在/etc/bashrc中:(個人配置在~/.bashrc)
這時候我們會感覺很奇怪,為啥呢,以root用戶來說,我們默認的權限是022,但是我們的創建的目錄權限是755:rwxr-xr-x,這是為啥嘞,我們先說一下,文件的最高權限是666,即:rw-rw-rw-,目錄的最高權限是777即:rwxrwxrwx,當我們用777-755 我們發現正好是022,正好是默認權限,默認權限正是最高權限-實際權限的。
接下來,我們來說作用於目錄和文件的權限都有什么作用:
普通文件
r: 可以讀取文件的內容
cat less more nano vim 執行腳本
w: 可以修改文件的內容
nano vim > >> tee gedit
x: 可以執行該文件
執行腳本
目錄文件
r: 用戶可以列出目錄下有哪些文件(不能查看文件的詳細信息)
w: 只有w無意義。
x: 用戶可以進入該目錄(如果知道文件名,且有相對應的文件權限 ,可以執行對應的操作)
rx: 用戶可以進入目錄,且可以長列出。
rw:等於只有r
wx: 能進入,能創建能刪除,不能列出。故用戶能否刪除文件與文件自身權限無關。
rwx: 全部權限。
---:null
我們可以看出,文件和目錄的權限的作用是有很大區別的,我們即便對文件有全權限,如果對它的目錄沒有足夠的權限的話,我們還是無法對文件進行增刪查改,更何況他們還是有所有者,所屬組和其他人的區別。比如:當我們想查看一個目錄下的某一個文件內容時,我們至少要對目錄有什么權限,對文件有什么權限?由我們上面的總結我們知道,我們對目錄至少有一個x權限,對文件至少有r權限,這樣雖然我們無法看到目錄下有什么文件,但是我們知道有一個我們知道的文件就在該目錄下,我們依舊可以使用工具查看:
權限判斷的順序
先判斷是否是文件的所有人,如果是,則執行所屬人的權限后結束,如果不是所有人,則判斷是否所屬組(可以是主組也可以是輔助組),如果是,則執行所屬組的權限后結束,如果不是則執行其他人的權限后結束。
所有人->所有組->其他人
特殊權限
除了普通權限外,我們的文件還是有特殊權限的,比如我們常見的文件/etc/shadow文件,我們發現它的權限是---------,可是我們作為普通用戶還是可以進行修改自己的密碼,這就意味着我們修改了shadow的內容,這是為什么呢,我們知道root這個大變態即便對文件沒有任何權限,依舊可以修改查看它,所以,這會不會和root有關呢?我們在修改密碼時不是直接對文件修改,而是使用命令passwd對shadow進行修改的,而passwd這個程序所屬組和所有者都是root,這是意味着我們可能是臨時借用了root這個上帝之手對我們的密碼進行修改的,我們在看看passwd的權限:
我們看到了什么東西?在root所有者的x位居然變成了s,這是什么呢,這就是特殊權限之一SUID權限。suid 當對一個可執行的二進制文件作用了SUID權限之后,任何擁有執行該文件權限的人,在執行的過程時都臨時擁有該文件所屬人的權限。這下我們就該知道為什么我們可以用passwd命令修改對於我們沒有任何權限的shadow了吧。因為我們臨時獲取了passwd的root所有者的權限,我們是在以root的身份在修改我們的密碼呀!!!
除了SUID還有SGID。sgid 當對一個可執行的二進制文件作用了SGID權限之后,任何擁有執行該文件權限的人,在執行的過程時都臨時擁有該文件所屬組的權限。 當對一個目錄作用了SGID權限之后,任何對該目錄有wx權限的用戶在該目錄下創建的文件及目錄的所有屬均為該目錄的所有組。對於第二個作用,我們做一個測試:
Html目錄屬於HTML組,而redhat用戶也有HTML附加組,然后我們在HTML中創建文件:
此時我們發現如果僅作為一個組用戶進入改組,創建的文件所屬組依然是自己的,作為同組的其他用戶還是無法修改,接下來我們加上SGID權限chmod 2770 html:
這時候我們發現,Redhat用戶創建的文件所屬組變成了HTML,這就是SGID的作用之一,作為同組的人員,我們可以對此文件進行修改,團隊合作起來更方便。
接下來我們看特殊權限的最后一個sticky,它的作用是當對一個目錄使用了sticky之后(只限制組用戶,目錄的owner不受影響),該目錄下的文件僅其所屬人才能刪除。屬於這個組的其他成員可以對目錄下的文件查看,修改,就是無法刪除。
我們之前說默認權限有4位比如root的默認權限是0022,最前面的那個是特殊權限,由於特殊權限默認是什么都沒有,所以是0,我們剛剛的演示其實也可以看出,設置特殊權限是SUID對應的是4,SGID對應的2,sticky對應的是1,還有就是我們發現特殊權限居然有大寫的,這是為什么呢,我們可以看到,三個特殊權限都是在x位上,為了區分權限,如果在某一位有x權限,對應的特殊權限就是小寫的,如果沒有x權限,對應的特殊權限就是大寫的,三個權限分別是sS,sS,tT。
隱藏權限
對於隱藏權限,我們不會說太多,說兩個我們平時最常用的選項:
設置:
命令:chattr
格式:chattr [option] filename
格式:
+i 不能刪除不能改
+a 不能刪除,只能追加
這設置就厲害了,就連我們的root也無法改變,其實他就是為了防止root誤操作而刪除文件的,我們還可以利用lsattr進行查看:
ACL權限管理
為了滿足我們對細化權限的設置,在linux系統中添加了ACL權限,用於對單個用戶或者單個組進行經典的rwx權限設置,在centOS6中創建了新的分區后需要我們單獨進行ACL功能的添加才可以使用,我們也不能將一個具有ACL權限的文件或目錄拷貝到還沒有使用ACL的分區上面,centOS7的xfs文件系統時自動啟動ACL功能的。
ACL權限的設置與取消
如何設置ACL權限,我們需要知道ACL是針對於用戶和組進行設置的,對其他人無效,並且ACL目標是文件或目錄。
對於用戶設置,我們使用的命令是:setfacl –m u:username:rwx /path/filename,在我們針對目錄或文件設置完ACL權限以后,我們可以通過getfacl命令查看我們設置的ACL權限。
我們可由上圖看到,在設置完ACL權限時,其他人的權限位后多了有個“+”,這就是ACL權限的標志。在我們顯示出的tty.txt的ACL權限里,我們看到#號后面的是我們本文件的原本信息,並且,設置完ACL權限以后,mask就會占領g位,所以我們要是直接設置
setfacl –m g::rw filename的話其實就是在設置mask,所以,當我們在設置完ACL權限后,除非我們刪除全部的ACL權限,否則,無法在對用戶的g位設置任何權限。
我們在針對某一目錄設置完ACL權限之后,能不能在目錄下創建文件讓它也具有相同的ACL權限呢?我們看一下:
我們以實際行動說明了使用setfacl –m u:username:rwx /path/filename設置完權限后,我們對其目錄一下的文件都不能繼承父目錄的ACL權限,咋辦?好辦,我們可以使用setfacl –mR d:u:username:rw /path/filename來對目錄設置這個權限,這樣的話,目錄下面的文件和新目錄也能繼承父目錄的ACL權限了,但是有一點需要注意,我們使用setfacl –m u:username:rwx /path/filename和設置它下面的文件的ACL權限是有一點不一樣的,因為我們需要進入目錄后查看修改子文件,所有我們在設置目錄的ACL權限時,一定要注意,如果需要進入目錄的話ACL權限應該加上x;
對用戶的ACL權限設置我們已經看到了,對組的ACL設置同樣是如此:
setfacl –m g:username:rwx /path/filename
setfacl –mR g:u:username:rw /path/filename
ACL權限判斷的順序
先判斷是否是文件的OWNER,如果是,則執行OWNER的權限后結束,如果不是OWNER,則判斷是否是ACL的USER,如果是則執行USER權限后結束,如果不是ACL的USER, 則判斷是否屬於GROUP或ACL GROUP,如果是,則取最大權限。如果不屬於任何GROUP,則執行OTHER。
所有人->所有組->其他人
還有剛才那個mask,他是對最大權限的設置,我們一般不會管他,我們在設定ACL權限時,它是默認隨着我們ACL權限的設置而變化的,保證我們設置的每個權限都能生效,如果我們想限定最大權限,我們可以在設置完所有ACL權限時,對它進行設置。
設置命令:setfacl -m mask:rwx f1
ACL權限的其他參數和取消設置
base ACL 不能刪除
setfacl -k dir 刪除默認ACL權限
setfacl --set u::rw,u:wang:rw,g::r,o::- file1
setfacl -M acl.txt f1[dir1]
acl.txt 內容來自getfacl f1 > acl.txt,如下
# file: fstab
# owner: root
# group: root
user::rw-
user:zhangfei:rwx
group::r--
mask::rwx
other::r—
setfacl -x u:liubei f1 單獨去除一條ACL權限
setfacl -X aclrm.txt f1[ f2 f3 *]
aclrm.txt 內容如下
u:liubei
g:shuguo
setfacl -b f1 去除該文件上ACL屬性。
備份和恢復ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 參數。但是tar等常見的備份工具是不會保留目錄和文件的ACL信息
備份ACL權限信息
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1(刪除ACL權限)
還原ACL權限信息
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt