因爲之前學習Linux的時候沒有作比較全面的總結筆記,並且平時大部分工做都在windows上進行,因此關於Linux的一些知識點有所遺忘。近期可貴空閒,翻閱書籍,學習《鳥哥的Linux私房菜》,重溫Linux知識,藉此機會想把Linux的相關知識作一個總結筆記。首先要總結的是Linux文件相關知識——權限與屬性。注意,這不是Linux入門,這是學習筆記,入門推薦《鳥哥的Linux私房菜》,講得很詳細。html
講解Linux文件的權限與屬性,天然繞不開ls命令啦。在Linux中,咱們能夠經過命令ll(即ls -l)查看當前目錄下文件的權限與屬性的詳情列表:node
輸出結果中有7個信息列,從左到右分別是:文件類型+權限、文件鏈接數、文件屬主、文件屬組、文件大小、文件最後修改時間、文件名稱。好了,下面開始詳細介紹每一個信息點。linux
1、文件權限windows
首先要介紹的是文件權限,這在Linux中是很重要的。安全
1. 基本權限:socket
Linux是一個多用戶的操做系統,對於每個文件而言,用戶的類型有三種:文件屬主,即文件的建立者;文件屬組,即文件所屬的用戶羣組;其餘用戶。對應的,有三種用戶類型對於這個文件的權限,每種用戶類型的權限都有:讀(r)、寫(w)、執行(x)三種權限。在上面的截圖的第一列信息中有十個字符,其中第一個字符表示的是文件類型,後面的9個字符從左到右分別表示屬主、屬組和其餘用戶對於文件的rwx三種權限的佔位符,某個位置上有對應英文字母表示有相應權限,若是是「-」則表示沒有相應權限。例如,最後一個文件「yzz」,屬主和屬組用戶對文件有讀寫權限,而其餘用戶則只有讀權限。學習
修改文件權限能夠經過chmod指令來實現,其中權限能夠經過字符表示也能夠經過數字來表示,比較簡單,這裏就再也不過多說明,使用上圖「myfile」這個文件來實驗,直接看實驗截圖,注意觀察文件各個權限位的變化:spa
(u表示屬主,g表示屬組,o表示其餘用戶)操作系統
若是想要修改文件屬主、屬組能夠經過chown和chgrp來實現(注意觀察第三列和第四列信息的變化):3d
2. 特殊權限:
(1)Set UID:
當s這個標誌出如今文件屬主的x權限位上時,此時就被稱爲Set UID,簡稱爲SUID的特殊權限。SUID的限制與功能以下:
<1>SUID權限僅對二進制程式有效;
<2>執行者對該程式須要具備x的可執行權限;
<3>本權限僅在執行該程式的過程當中有效;
<4>執行者將具備該程式擁有者的權限。
如下面兩個文件舉例說明:
從上圖能夠看出,通常用戶對於「/etc/shadow」這個文件是沒有任何權限的,只有root能夠對這個文件進行修改。可是用戶卻可使用passwd這個指令,也就是執行「/usr/bin/passwd」這個文件經過對「/etc/shadow」進行修改來修改本身的密碼。緣由就是由於「/usr/bin/passwd」這個文件具備SUID的特殊權限,通常用戶執行這個文件的過程當中暫時擁有這個文件的擁有者root的權限,因此也就能夠對「/etc/shadow」這個文件進行修改了。
(2)Set GID:
當s這個標誌出如今文件屬組的x權限位上時,稱爲Set GID,簡稱SGID。SGID不只對二進制程式有效,對於目錄也是有效的。
當SGID設置在二進制程式上時,與SUID相似地,文件的執行者在執行過程當中將暫時擁有文件屬組的權限,這個在Linux中有如下兩個文件可做爲例子:
當SGID設置在目錄上時,具備如下特殊功能:
<1>對目錄具備r與x權限的用戶能進入目錄。
<2>使用者在此目錄下的有效羣組將會變成該目錄的羣組。
<3>對目錄具備w權限的用戶,在此目錄下建立文件時,新文件的羣組與此目錄羣組相同。
當某個用戶組的用戶想要在某個目錄下共享資源的時候,SGID的第三個功能就能派上用場了。
(3)Sticky Bit:
Sticky Bit簡稱SBIT,目前只針對目錄有效。當某個目錄被設置了SBIT以後,目錄的其餘用戶的x權限位將出現t標誌,具備w和x權限的用戶在該目錄下建立的文件或目錄,只有本身和root纔有權限刪除。/tmp就是這樣的目錄:
(4)SUID/SGID/SBIT設置:
特殊權限的設置也是使用chmod這個命令,特殊權限的表示一樣可使用字符形式也可使用數字,使用數字時在表明rwx基本權限三個數字前面再加一個數字就能夠了,其中4爲SUID,2爲SGID,1爲SBIT,設置實驗以下:
輸出結果最後一行,S、T爲大寫時表示對應特殊權限爲空,緣由是對應用戶沒有x執行權限。
3. 默認權限:
在Linux中,新建的文件或目錄的默認權限是由umask決定的,那麼這個umask究竟是什麼呢?咱們先來查看一下:
這裏有兩種查詢方式,第二種咱們很容易明白,那第一種打印出來的那四個數字有什麼意義呢?它們分別表明特殊權限(SUID/SGID/SBIT)、文件屬主(u)、文件屬組(g)、其餘用戶(o)的權限!
那新建文件或目錄的默認權限是怎麼計算的呢?咱們知道新建文件默認是沒有執行權限的,因此它的完整權限是rw-rw-rw-,用數字表示就是666,而新建目錄默認是有執行權限的,因此它的完整權限是rwxrwxrwx,用數字表示就是777。新建文件或目錄的默認權限就是使用這個三位數字表示的完整權限分別減去umask指令查詢出來的後面三位數字,因此當umask是0002的時候,新建文件的默認權限就是664,即rw-rw-r--,新建文件夾的默認權限就是775,即rwxrwxr-x,也就是說umask -S打印出來的結果實際上是新建目錄的默認權限,新建文件的默認權限要在umask -S結果的基礎上減去全部用戶的x執行權限。不信咱們能夠新建文件和目錄來看看結果:
(touch和mkdir指令分別用於建立空文件和空目錄)
果真,結果和咱們計算的同樣!
若是你想修改默認權限,直接使用umask指令後面接上數字來執行便可:
4. ACL細部權限設定:
若是須要單獨設置某個用戶或某個羣組對某個文件或某個目錄的權限,則須要使用ACL(Access Control List)進行細部權限設定。可使用setfacl命令進行設置,使用getfacl命令進行查詢。
(1)查看當前系統是否支持ACL:
(2)設置單個用戶對某個文件的權限:
(若用戶名爲空,則表示設置root用戶對文件的權限;若設定權限爲「-」則表示無權限)
(3)設置某個羣組對某個文件的權限:
(4)有效權限設置:
(用戶或羣組所設定的權限必需要在mask的權限設定範圍內纔會生效)
當使用以上命令給目錄設置權限的時候,所設置的ACL權限都是沒法被該目錄下的子目錄和文件所繼承的,若想繼承,則需下達命令格式爲——setfacl -m d:u:帳號:權限 目錄名稱。若在設置目錄的ACL權限時,但願連同目錄下的文件與子目錄也一塊兒設置則使用命令——setfacl -R u:帳號:權限 目錄名稱。
設置ACL權限以後還能夠移除,移除所有ACL權限使用指令——setfacl -b 文件名稱,移除某個帳號的ACL權限使用指令——setfacl -x u:帳號 文件名稱。
2、時間屬性
在Linux中,每一個文件與目錄都有許多時間屬性,其中有三個主要的時間屬性:mtime(modification time)、atime(access time)、ctime(status time),分別表示文件內容最後修改時間、文件內容最後訪問時間、文件狀態(例如權限、屬性)最後改變時間。
ll(ls -l)命令默認展現的是mtime,咱們能夠經過指定--time選項來查看其它兩個時間屬性,並且默認展現的是簡寫的時間,咱們能夠經過指定--full-time選項來查看完整的時間:
(這裏使用三個指令按順序分別展現了mtime、atime和ctime)
若想修改文件的時間屬性,可使用touch指令,例如咱們來修改上圖的「temp」文件的時間屬性(有多種選項參數,這裏只展現-t選項的使用):
能夠看到,文件的mtime和atime已經被咱們改成-t選項指定的時間了,可是ctime並無,而是變成了我剛剛執行這個touch命令的時間。注意,ctime的意義是文件狀態的最後改變時間,這裏的文件狀態包括權限、屬性等,咱們剛纔改變了文件的mtime和atime這兩個時間屬性,因此文件狀態的最後改變時間就是剛剛沒錯啊哈哈。注意,即便咱們複製一個文件的時候複製了全部的屬性,也沒法複製ctime這個屬性的!
3、鏈接數
ll(ls -l)這個命令打印出來的結果中第二列數據表示的就是文件的鏈接數了,那麼什麼是文件或目錄的鏈接數?它又是怎麼計算出來的呢?這就要從硬鏈接和軟鏈接提及了。因爲硬鏈接涉及到Linux文件系統結構的問題,尤爲是inode和data block的概念,因此若是不瞭解的能夠先參考一下個人另外一篇博文——Linux的文件系統結構(如下對硬鏈接的講解是創建在讀者已經瞭解這方面知識的基礎上進行的)。
什麼是硬鏈接呢?假設如今已有一個文件A,它的鏈接數是1,那麼咱們能夠在某個目錄B下面創建文件A的硬鏈接C,這個創建硬鏈接的過程其實就是在目錄B的data block中添加一條「硬鏈接C的文件名到文件A的inode編號」的關聯記錄,僅此而已,並無真正建立新的文件。硬鏈接創建以後,就有兩個文件名指向文件A的inode了,分別是文件A和硬鏈接文件C,因此文件A的鏈接數就變成了2,也就是說ll命令中展現的鏈接數實際上表示的就是硬鏈接數,每創建多一個硬鏈接,鏈接數就會增長1。下面咱們就使用ln這個命令來建立一個硬鏈接看看效果:
這裏咱們建立了文件myfile的硬鏈接myfile2,能夠看到,myfile的鏈接數增長了1,並且這兩個文件的權限、屬性都是如出一轍的,這是由於文件的權限、屬性都是存儲在inode中的,而這兩個文件名指向的是同一個inode啊,它們的文件內容也會是相同的,實際上就是同一個文件來的。
那軟鏈接又是什麼呢?軟鏈接其實就相似windows中的快捷方式。假設如今已有一個文件A,咱們要在某個目錄中建立文件A的軟鏈接B,其實就是建立一個新的文件B,只是文件B的data block中僅僅記錄了文件A的路徑位置,打開文件B的時候就會讀取到文件A的位置而後打開文件A。咱們能夠經過ln -s來建立一個軟鏈接:
這裏咱們建立了文件myfile的軟鏈接myfile3,能夠看到,軟鏈接對源文件的鏈接數並無影響的,myfile3的文件大小爲6個字節,這是由於它記錄了源文件的名稱「myfile」,6個字符,恰好6個字節!
如今來總結一下硬鏈接與軟鏈接的異同點:
(1)均可以使用ln指令來建立,只是建立軟鏈接的時候要加上-s選項。
(2)打開硬鏈接和軟鏈接最終都是打開源文件。
(3)建立1個硬鏈接會使源文件的鏈接數增長1,而建立軟鏈接則不會。
(4)建立硬鏈接並不會建立新文件,而建立軟鏈接則會新建一個文件。
(5)源文件刪除以後,硬鏈接不會失效,而軟鏈接會失效。
(6)硬鏈接不能跨文件系統,不能鏈接目錄。
最後補充一點,關於目錄的鏈接數。咱們新建一個空目錄的時候,目錄中默認就有「.」和「..」兩個子目錄,其中「.」目錄指向了當前目錄的inode,而「..」指向了上一層目錄的inode。因此當咱們建立一個新的空目錄的時候,它的鏈接數是2,而上一層目錄的鏈接數會增長1。
4、隱藏屬性
文件的隱藏屬性主要是在系統安全方面起到做用,咱們可使用chattr命令來設置隱藏屬性,而使用lsattr來查詢。chattr指令的選項參數有不少,但比較經常使用的有兩個:a和i,這兩個屬性都是隻有root才能設置的,設置a表示這個文件只能增長內容而不能刪除也不能修改,設置i表示文件不能被刪除、更名、建立鏈接,也沒法添加內容和修改內容,反正就是不能作任何改動!下面是設置與查詢操做示例:
(+表示增長某個屬性,-表示減去某個屬性)
5、文件類型
回到本文第一個ll(ls -l)指令的截圖,ll指令打印的信息中第一列第一個字符表示的就是文件類型,不一樣的字符表示的文件類型不一樣:
-:普通文件(包括硬鏈接)。
d:目錄。
l:軟鏈接。
b:區塊設備文件。
c:字符設備文件。
s:資料接口文件(sockets)。
p:資料輸送文件(FIFO,pipe)。
可使用file指令來查看某個文件具體的文件類型:
6、文件大小
ll(ls -l)指令輸出的第5列信息表示的就是文件大小,ll指令默認展現的文件大小都以byte(字節)爲單位,可使用-h參數將其展現成k、M、G爲單位的形式:
其中total 16K表示這個目錄中全部文件大小總和。
然而咱們會發現這些文件大小加起來並無達到16K這麼多啊:4k+60bytes+15bytes+15bytes=4k+90bytes<16k,怎麼回事呢?若是你們對Linux文件系統結構有所瞭解就會知道怎麼回事了,一樣能夠參考個人另外一篇博文——Linux的文件系統結構。其實這裏的16K表示的並非全部文件真實大小的總和,而是全部文件佔用磁盤空間的總和,咱們知道即便一個文件很小,但它至少都會佔用一個data block的。咱們能夠在ll指令添加-s選項查看各個文件佔用的磁盤空間大小:
4k+4k+4k+4k=16k!是的,這裏的第一列表示的就是每一個文件佔用的磁盤空間大小了,而第六列表示的則是每一個文件內容的真實大小。從這裏也能夠看出個人Linux系統的每一個data block大小爲4K。
7、文件名稱
ll(ls -l)指令輸出的最後一列信息表示的就是文件名稱。其實文件名稱自己並無什麼好說的,只是關於文件名稱引伸出來的一些問題須要記錄一下。首先是隱藏文件問題,Linux的隱藏文件不像windows的隱藏文件那樣須要進行屬性設置的,它只是純粹根據文件名稱來決定文件是否隱藏,若文件名稱以「.」開頭則隱藏,不然顯示。默認狀況下咱們使用ls指令是查看不到這些隱藏文件的,能夠加上-a選項來查看全部文件。
另外,Linux的文件也沒有什麼所謂的後綴名。好比一個文件是否爲執行文件,根本與它是什麼後綴名不要緊,只是與文件的x執行權限有關罷了。不過咱們能夠在文件名後面加上一些適當的後綴名,使得咱們能借此瞭解文件大概是什麼內容的,只是這個後綴名沒有什麼實際用處就是了。