文件權限——Linux基本命令(8)
1.文件權限
(1)權限分類
文件的權限主要針對三類對象進行定義:
owner: 屬主, u
group: 屬組, g
other: 其他, o
每個文件針對每類訪問者都定義了三種權限:
r: Readable
w: Writable
x: eXcutable
(2)權限定義
普通文件和目錄文件對於權限的定義不太相同:
普通文件:
r: 可以讀取文件的內容
cat less more nano vim 執行腳本
w: 可以修改文件的內容
nano vim > >> tee gedit
x: 可以執行該文件
執行腳本
目錄文件:
r: 用戶可以列出目錄下有哪些文件(不能查看文件的詳細信息)
w: 只有w無意義。
x: 用戶可以進入該目錄(如果知道文件名,且有相對應的文件權限 ,可以執行對應的操作)
rx: 用戶可以進入目錄,且可以長列出。
rw:等於只有r
wx: 能進入,能創建能刪除,不能列出。故用戶能否刪除文件與文件自身權限無關。
rwx: 全部權限。
---:null
(所以一般都是rx,
X 當文件本身沒有x權限時,則跳過,一般用於批量修改多個文件、目錄的權限時,自動跳過沒有執行權限的文件。(只給目錄x權限,不給文件x權限)
(3)權限判斷的順序
先判斷是否是文件的所有人,如果是,則執行所屬人的權限後結束,如果不是所有人,則判斷是否所屬組(可以是主組也可以是輔助組),如果是,則執行所屬組的權限後結束,如果不是則執行其他人的權限後結束。
所有人->所有組->其他人
2.修改文件的屬主和屬組
(1)chown
chown : change owner
owner.group(同時修改屬主屬組 .也可以替換成:)
以上只有root才能修改文件的所有人
:group或 .group 文件的owner也可以使用chown修改文件的所屬組(owner必須屬於目標組)
-R 遞歸 (可以直接將目錄以及子目錄中所有文件都修改掉)
--reference sourcefile tarfile(可以將tarfile文件的屬主屬組改成與sourcefile一樣)
如圖,將text的權限也改成了keke,lky。
(2)chgrp
chgrp : change group
文件的owner可以修改文件的所屬組(owner必須屬於目標組)
-R 遞歸
--reference sourcefile tarfile
3.文件權限
rwx三位用二進制來計算轉換,有則為1,沒有則為0
因此,權限一共就可以用三個數字來表示
例如:
640: rw-r-----
755: rwxr-xr-x
4.修改文件權限
chmod
只有所屬人和root可以更改文件的權限
(1)使用字符修改
人物 動作 行為
ugo +-= rwx (u:owner g:group o:other )
可以一次修改很多個人物,如果每個人需要修改的內容不一致,可以分開改,用,隔開。
u=....,g=...,o=...
chmod ugo+rwx 如果需要修改的內容一致,就可以放在一塊修改
a=rwx a代表ugo三個一起
(2)使用數字修改
也可以根據文件權限的數字來直接修改多個人物的權限。
例如:想要修改成r w x r w - r - -
1 1 1,1 1 0,1 0 0
7 6 4
得出三位數字764
使用764即可修改成功
同理,777和000分別表示全部填滿和全部為空。
(PS:如果只輸入3,則會默認為003,同理輸入43即為043)
5.默認權限
(1)umask
當我們建立一個目錄或檔案時,它都會帶一個默認的權限:
如圖,目錄默認為755,文件默認為644。那麽,為什麽默認值是這樣的呢?其實是由umask控制的。
使用umask命令查詢umask值,為022。(暫時先不看第一位)
我們知道對於一個目錄來說,最高權限為777,對於文件來說,最高權限為666。(因為文件有x是一個有風險是事情,所以默認生成時沒有x)。
由此我們可以得出結論了,生成文件或目錄時,默認值就是由最高權限減去umask值得到的。755=777-022;644=666-022
那麽我們來試著修改一下umask。
如圖將umask修改為642,那我們再創建目錄時發現權限果然默認為135,文件的默認權限為024。
值得註意的是:當umask中全部是偶數時,可以直接減,當umask中包含奇數時,對於目錄直接減,對於文件,在奇數所在的位減完後加一。
(因為文件沒有x位,而所有奇數一定都帶x,因此沒法減,每次必定多減了一個x,所以應該加回去,即加一)
如圖,可以看到權限確實為756和646.
(2)模式方式顯示
umask –S 可以直接模式方式顯示,不顯示數字的方式
也可以使用-S修改umask,此時設置的為最終權限,不需要減
如圖,修改成功
(3)復制時的權限
當我們創建文件時,文件權限為最大權限減umask值,但是當我們復制時,復制出來的文件權限為原文件減umask值。
如圖,testfile1的權限為testfile-022.
(4)永久設置umask
用戶設置:
如果只用命令umask設置umask的值,在退出登錄之後又會恢復原來的默認值022。如果想永久的設置umask的值,需要修改.bashrc文件。
如圖,在文件中加入代碼,保存後即可設置成功。
(註意:設置後不會立即生效,需要重新登錄才能生效。如果想讓它立即生效,可以輸入. .bashrc或者source .bashrc即可生效)
還有一種方法可以一次設置所有用戶的umask值,修改/etc/bashrc文件
找到這幾行,這一塊的意思是普通用戶umask值為002,root用戶umask值為022,因此將002的值修改為需要的值即可。
6.關於命令的權限
(1)命令權限
有的時候能否使用命令作用於對象的時候,並不只取決於對象是否有權限,還應考慮命令的權限。
命令的屬主屬組都是root,在正常情況下,命令的權限都是755,因此任何用戶都可以使用。如:touch,cat這類的命令。
但是有些命令,如groupmems,它的權限為750,因此它只能由root執行。
如圖,切換到普通用戶下,不能執行groupmems命令。
(2)三個特殊權限
但是,我們發現/etc/shadow文件的權限為000,理論上僅僅只有root用戶能讀寫(root是天神,沒有特殊說明任何文件都在root的管轄之下),那我們是怎麽使用其他用戶修改密碼的呢?
我們在修改密碼時需要使用passwd命令,讓我們查看一下此命令:
我們發現,在u的第三位上不是x而是s,這就是原因所在了。
這個s代表SUID權限,它的作用是:當對一個可執行的二進制文件作用了SUID權限之後,任何擁有執行該文件權限的人,在執行的過程時都臨時擁有該文件所屬人的權限。
也就是說我們在執行passwd時,其實是暫時把我們當做root來運行這個命令,因此可以修改/etc/shadow文件了。
同理,在g的第三位也會有s替代x的時候,那個s代表SGID權限,當對一個可執行的二進制文件作用了SGID權限之後,任何擁有執行該文件權限的人,在執行的過程時都臨時擁有該文件所屬組的權限。當對一個目錄作用了SGID權限之後,任何對該目錄有wx權限的用戶在該目錄下創建的文件及目錄的所有屬組均為該目錄的所有組。
同樣的,在o的第三位可以加上t,這個t代表Sticky權限,當對一個目錄作用了sticky之後(只限制組用戶,目錄的owner不受影響),該目錄下的文件僅其所屬人才能刪除。
(3)特殊權限數字法
SUID SGID STICKY
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
前面我們只說了umask值裏看後三位,那麽第一位代表的就是特殊權限。所以根據上面的表,如果想要只加入SUID權限,即100為4,所以第一位應該填4。
如圖所示,設成了SUID權限。
(4)特殊權限的表示
特殊權限雖然占據了x的位置,但是並不代表替換了x(只是因為沒有地方表示了),所以我們需要區分既有x又有特殊權限時怎麽區分。
映射表如下:
SUID: user,占據屬主的執行權限位
s: 屬主擁有x權限
S:屬主沒有x權限
SGID: group,占據屬組的執行權限位
s: group擁有x權限
S:group沒有x權限
Sticky: other,占據other的執行權限位
t: other擁有x權限
T:other沒有x權限
如圖,本身ug上都沒有x位和s位,分別加上SUID和SGID權限,發現它們的S都是大寫的,我們試著在u上加上x權限,發現u上的s果然變成了小寫。
7.隱藏屬性
(1)查看屬性
linux下的文件還有一些隱藏的屬性,我們可以用lsattr命令來查看:
(2)修改屬性
用chattr命令可以改變一個文件的隱藏屬性。
chattr
+i 不能刪除不能改
+a 不能刪除,只能追加
8. 訪問控制列表ACL
(1)ACL
ACL:AccessControl List,可以用來實現靈活的權限管理。除了文件的所有者,所屬組和其它人,可以對更多的用戶設置權限。
(2)開啟方式
CentOS7當中,無論是操作系統安裝時還是之後手工創建的文件系統(xfs、ext4)均會開啟ACL功能。
CentOS6及之前的版本,僅操作系統安裝時創建的文件系統才會默認開啟ACL,手工創建的文件系統,需要手工開啟ACL功能。
開啟方式:
方法一:mount -o acl /dev/sda7
取消的方式,重新掛載時不指定即可
方法二:tune2fs -o acl /dev/sda7
取消的方式 tune2fs -o ^acl /dev/sda7
(3)ACL權限判斷的順序
先判斷是否是文件的OWNER,如果是,則執行OWNER的權限後結束,如果不是OWNER,則判斷是否是ACL的USER,如果是則執行USER權限後結束,如果不是ACL的USER, 則判斷是否屬於GROUP或ACL GROUP,如果是,則取最大權限。如果不屬於任何GROUP,則執行OTHER。
所有人->所有組->其他人
(4)查看ACL權限
getfacl file|directory 查看ACL
-R 作用在目錄上,遞歸顯示目錄裏每一個文件的ACL權限
(5)設置ACL權限
setfacl參數
-m:設置後續acl參數
如圖,設置完之後最後一位會變成+
u:[用戶名]:[rwx] 設置某個用戶的權限
g:[用戶組]:[rwx] 設置某個組的權限
-R 同樣表示遞歸(可以一次性修改目錄以及目錄下所有文件的ACL權限)
setfacl -m mask:rwx f1 設置MASK值
或 chmod g=rwx f1 一旦設置了ACL權限後,原有的文件GROUP不可再更改,使用chmod即修改ACL MASK
mask只影響除所有者和other的之外的人和組的最大權限Mask需要與用戶的權限進行邏輯與運算後,才能變成有限的權限(Effective Permission)
用戶或組的設置必須存在於mask權限設定範圍內才會生效
Mask值會限制最大權限。
ACL MASK隨著新的ACL設置會被重置,重置的標準是讓該文件上的所有ACL及文件原GROUP上的權限都有效。
因為MASK隨著ACL的設置會變化,因此應該最好最後設置MASK。
setfacl -m d:u:user:rwx d1 設置ACL默認權限,目錄新創建的文件都會被設置成默認權限,當前已創建的文件不變。
setfacl -k d1 刪除全部默認權限
setfacl -M acl.txt f1[dir1] 將acl.txt內容導入文件
acl.txt內容來自getfacl f1 > acl.txt,
如下,先使用>將內容導出到acl.txt。
刪除ACL權限之後用-M導入,發現權限又回去了。
setfacl -x u:user f1 單獨去除一條ACL權限
setfacl -X aclrm.txt f1[ f2 f3 *] 批量刪除
aclrm.txt內容如下
u:liubei
g:shuguo
同樣的,先編輯一個aclrm.txt文件,然後再執行命令。這樣就可以設置刪除liubei和shuguo的ACL設置。(如果沒有shuguo或者liubei就不刪除,也不會報錯)
setfacl -b f1 去除該文件上的ACL屬性。
(6)備份和恢復ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 參數。但是tar等常見的備份工具是不會保留目錄和文件的ACL信息。
getfacl -R /tmp/dir1 > acl.txt 將目錄下的所有文件的ACL屬性備份到文件(路徑是相對路徑)
setfacl -R -b/tmp/dir1 清除目錄下所有文件的ACL屬性
兩種還原方法:
setfacl -R --set-file=acl.txt/tmp/dir1 通過文件還原ACL屬性的方法1
setfacl --restore acl.txt 通過文件還原ACL屬性的方法2
本文出自 “Ty_endless” 博客,請務必保留此出處http://tyendless.blog.51cto.com/12435756/1951837
文件權限——Linux基本命令(8)