linux 文件屬性

linux文件屬性分爲4個部分,依次爲:

1,普通屬性,及rwx屬性。

2,隱藏屬性,及A,a,i屬性,無法修改訪問時間,無法刪除和覆蓋文件內容,只讀文件等 。

3,特殊屬性,及suid,sgid,sbit屬性。

4,acl,訪問控制列表,可以允許指定的用戶擁有寫權限而不再是讓他們整個組擁有寫權限。

一、  普通屬性。

圖釋:


·        第一個字符代表這個文件的類型(如目錄、文件或鏈接文件等等):

·        當爲[ d ]則是目錄,例如上表檔名爲『.gconf』的那一行;

·        當爲[ - ]則是文件,例如上表檔名爲『install.log』那一行;

·        若是[ l ]則表示爲連結檔(link file);

·        若是[ b ]則表示爲裝置文件裏面的可供儲存的接口設備(可隨機存取裝置);

·        若是[ c ]則表示爲裝置文件裏面的串行端口設備,例如鍵盤、鼠標(一次性讀取裝置)

·        接下來的字符中,以三個爲一組,且均爲『rwx』 的三個參數的組合
< [ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute) 要注意的是,這三個權限的位置不會改變,如果沒有權限,就會出現減號[ - ]而已>

·        第一組爲『文件擁有者的權限』,以『install.log』那個文件爲例, 該文件的擁有者可以讀寫,但不可執行;

·        第二組爲『同羣組的權限』;

·        第三組爲『其他非本羣組的權限』.

二、默認屬性umask

在系統中新建文件時會默認生成屬性,此功能通過umask實現:

①  查看umask值
[root@localhost /]#umask(數字形式)
0022
[root@localhost /]#umask –S
(符號形式)
u=rwx,g=rx,o=rx

上面的命令顯示出umask值的兩種表現形式。我們看到數字表現出來的有4位數字,第一位數字用來表示特殊權限,我們在後面介紹,第二三四位數字分別用來表示用戶/組/其他用戶的權限。
在默認權限的屬性上,目錄文件和普通文件是不同的。因爲我們不希望普通文件具有可執行權限,所以,普通文件在默認情況下是沒有執行權限的。又因爲目錄文件需要具有可執行權限纔可以進入,所以普通文件的默認屬性最大爲666,目錄文件的默認屬性最大爲777。
② umask值的意義
umask值就是指“Linux文件的默認屬性需要減掉的權限”。比如Linux普通文件的最大默認屬性是666,目錄文件的最大屬性是777。但是我們不想要用戶在新建立文件時,文件的屬性是666或777,那麼我們就要設置umask值。Linux系統預置的umask值是022,那麼用戶在新建立普通文件時,普通文件的屬性就是666-022=644,新建立目錄文件時,目錄文件的屬性就是777-022=755。

③ umask值設置
我們不想要新建立的普通文件的屬性是644,目錄文件的屬性是755,我們想要新建立普通文件的屬性是664,新建立目錄文件的屬性是775。那麼我們就設置umask值爲002即可。設置方法就是“umask 002”。

三、 Linux文件隱藏屬性
文件都具有隱藏屬性,隱藏屬性對於系統安全來說很重要。
設置文件隱藏屬性
[root@localhost /]#chattr [-R] [- =][AacDdijsSu]文件名
(A)no atime updates;(a)append only;(c)compressed;(D)synchronousdirectory updates;(d)no dump;(i)immutable;(j)data journalling;(s)securedeletion;(S)synchronous updates;(u)undeletable;(T)and top of directory hierarchy;(t)no tail-merging。

常用參數意義:
-R:遞歸處理。
-:刪除某個隱藏屬性,其他原本存在的屬性不改變。
:添加某個隱藏屬性,其他原本存在的屬性不改變。
=:將隱藏屬性設置爲指定的參數,其他原本存在的屬性會被改掉。
A(atime):如果設置了A屬性,則這個文件的最後訪問時間atime不能被修改。
a(append only):如果設置了a屬性,則這個文件只能增加數據,不允許任何進程覆蓋或截斷這個文件。如果某個目錄具有這個屬性,那麼只能在這個目錄下建立和修改文件,而不能刪除任何文件。
i(immutable):如果設置了i屬性,則不能對這個文件做任何修該。如果某個目錄具有這個屬性,那麼只能修改該目錄下的文件,而不能建立和刪除文件。
s(secure deletion):如果設置了s屬性,則這個文件將從硬盤空間中完全刪除。
u(undeletable):與s完全相反。如果設置了u屬性,則這個文件雖然被刪除了,但是還在硬盤空間中存在,還可以用來還原恢復。

查看文件隱藏屬性
文件既然有隱藏屬性,那麼我們如何查看這些文件的隱藏屬性呢?

[root@localhost /]#lsattr [-RVadlv]
文件名
-R
:遞歸顯示目錄文件下的所有文件。
-a:顯示隱藏文件的屬性。





[root@localhost /]#lsattr –Ra CaiWu
-----a------- CaiWu/.bb.swo
------------- CaiWu/aa
CaiWu/aa:
------------- CaiWu/aa/.
-----a------- CaiWu/aa/..
-----a------- CaiWu/.
------------- CaiWu/..
------------- CaiWu/bb
-----a------- CaiWu/.bb.swp
-----a------- CaiWu/.bb.swn
-----a------- CaiWu/.bb.swpx

四、Linux文件特殊權限
Linux文件特殊權限主要體現在set UID、set GID、StickyBit這三個上面。
要理解這三個特殊權限,就要先理解賬號的ID(UID和GID)以及進程等概念。
① SUID
SUID就是Set UID
設置它是爲了讓普通用戶在執行某些程序時,能夠暫時具有該程序的擁有者權限。
比如:在Linux系統中普通用戶也可以使用passwd命令來修改自己的密碼。但是密碼文件shadow只有root用戶有讀權限,其他用戶沒有任何權限,那麼普通用戶是怎樣通過passwd命令來修改自己的密碼呢?我們看下/usr/bin/passwd程序的屬性就知道了。
[root@localhost /]# ll /usr/bin/passwd 
-rwsr-xr-x 1 root root 22984 Jan 7 2007/usr/bin/passwd




我們發現passwd程序user的x權限位變成了s。那麼在這裏就是這個s使普通用戶有權限來執行這個程序。它讓普通用戶在執行passwd這個程序時暫時擁有了root的權限。
因此,當某程序user的x權限位變成s時,就是進行了SetUID設置,簡稱SUID。
SUID僅可用於二進制文件,對於其他普通文件,目錄文件和腳本之類的文件是無效的。

② SGID
SGID就是Set GID。設置它用來作用於用戶組。
如果將SGID設置在二進制文件上,則不論用戶是誰,在執行該程序時,它的有效用戶組將會變成改程序的用戶組所有者;

如果將SGID設置在目錄文件上,則在該目錄文件內所建立的文件或目錄的用戶組,將會變成該目錄的用戶組。
SGID一般用於團隊的項目開發上,在系統中很少使用。如果設置了SGID,那麼該二進制文件或者目錄group的x屬性位將會變成s。

③ SBIT
SBIT就是Sticky Bit如果在設置了SBit屬性的目錄中,用戶在該目錄下擁有w和x權限,那麼當用戶在該目錄下新建文件時,只有文件擁有者和root纔有權利刪除。
比如:root在/目錄下建立了一個文件夾test,test的權限是0777。在沒有加特殊權限前,任何人都可以在test目錄下做任何事,包括刪除別人建立的文件。當我給test目錄設置了SBit屬性後,那麼bobyuan這個用戶在test下新建了一個文件bobtest, 屬性是0777;bob這個用戶進入test目錄下試圖刪除bobtest,發現沒有權限刪除。
如果某個目錄設置了SBit屬性,那麼該目錄other的x屬性位將會變成t。如【drwxrwxrwt】。
SBIT僅可用於目錄文件,對於普通文件是不生效的。
如果某個文件的user或者group或者other沒有設置x屬性,但是設置了SUID或者SGID或者GBIT,那麼,這些特殊屬性將會以大寫的S和T表現出來。

設置SUID/SGID/SBIT
我們用數字形式來表示這三個特殊屬性,他們和r/w/x的數字表現形式類似。


SUID:4
SGID:2
SBIT:1
比如我要設置cat命令的SUID屬性,那就可以用chmod 4755來實現。
比如我要設置test目錄的SBIT屬性,那就可以用chmod 1777來實現。
注意,在設置目錄或者二進制文件的特殊屬性時,一定要給予這些目錄或者文件可執行權限。如果未給予可執行權限,即使設置了特殊屬性,也將會是空的,會用大寫的S和T表示。

五、ACL範例測試

基礎ACL通過兩條命令管理:setfacl用於增加或者修改ACL,getfacl用於顯示分配完的ACL。讓我們來做一些測試。

我創建一個目錄/shared給一個假設的用戶,名叫freeuser

1.   $ ls -lh /

我想要分享這個目錄給其他兩個用戶test和test2,一個擁有完整權限,另一個只有讀權限。

首先,爲用戶test設置ACL:

1.   $ sudosetfacl -mu:test:rwx /shared

現在用戶test可以隨意創建文件夾,文件和訪問在/shared目錄下的任何地方。

現在我們增加只讀權限給用戶test2:

1.   $ sudosetfacl -mu:test2:rx /shared

注意test2讀取目錄需要執行(x)權限

讓我來解釋下setfacl命令格式:

·        -m 表示修改ACL。你可以增加新的,或修改存在的ACL

·        u: 表示用戶。你可以使用 g 來設置組權限

·        test 用戶名

·        :rwx 需要設置的權限。

現在讓我向你展示如何讀取ACL:

1.   $ ls -lh /shared

你可以注意到,正常權限後多一個+標記。這表示ACL已經設置成功。要具體看一下ACL,我們需要運行:

1.   $ sudo getfacl /shared

最後,如果你需要移除ACL:

1.   $ sudosetfacl -xu:test /shared

如果你想要立即擦除所有ACL條目:

1.   $ sudosetfacl -b /shared

最後,在設置了ACL文件或目錄工作時,cp和mv命令會改變這些設置。在cp的情況下,需要添加“p”參數來複制ACL設置。如果這不可行,它將會展示一個警告。mv默認移動ACL設置,如果這也不可行,它也會向您展示一個警告。

總結

使用ACL讓在你想要分享的文件上擁有更多的能力和控制,特別是在NFS/Samba服務。此外,如果你的主管共享主機,這個工具是必備的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章