[RHCE] Directory And File Permissions
DIRECTORY
Linux系統中,目錄是一種檔案,用來紀錄其中檔案的位置。就像是倉庫一樣,倉庫是一種檔案系統空間,裡面的貨物就是檔案,而目錄就是倉儲貨物的清單。使用者可以使用 #cd 來進入目錄,#ls 來查詢目錄中的內容,更常使用 #ls -al 來查詢目錄檔案的詳細資料。-a表示顯示所有檔案,包括隱藏檔;-l表示列出詳細的資料。目錄檔案中,每筆資料表示一個檔案或目錄,連結數就表示這筆資料下有多少檔案或目錄連結至此。時間是檔案建立時間、上次執行時間、上次修改時間三者中最接近當前時間者。
在我們使用 #ls 查詢目錄檔時,會看到最上方兩筆資料的名稱是「.」與「..」,「.」表示此層目錄,「..」表示上層目錄,這可用於表示一個目標目錄或檔案的相對路徑。相對路徑表示相對於目前目錄路徑的表示法,所以會因為目前目錄的不同,對於同一個目標目錄有不同的相對路徑;與相對路徑對應的稱為絕對路徑,是對於目標檔案或目錄從根目錄算起的路徑;我們可用 #pwd 查詢目前目錄的絕對路徑。
另外要注意到,為什麼很多目錄的容量都是4096bytes。這並不是這個目錄裡面只有4096bytes的檔案,而是這個名為「目錄」的檔案有4096bytes的大小。是4096bytes的原因在於你硬碟的block的大小,通常都是1k、2k、或4k為一個block。圖片中的硬碟就是以4096bytes為一個block,所以新增目錄時,目錄檔案大小就是4096bytes。當然也有些目錄因為系統設定的關係不會是block的倍數,不過基本上一定都是1024bytes的倍數。
另外,有些目錄檔案的容量為0bytes,這些目錄屬於虛擬檔案系統(Virtual File System, VFS)。簡單來說,這些目錄內的資料並不存在於實體硬碟中,而是存在於記憶體。這些資料藉由VFS掛載到Linux中,以便系統於進行存取的動作。包括了kernel、process、net以及其他週邊裝置等。
所以當使用者對檔案進行異動,其實就是對目錄檔案的編輯。新增檔案就是在目錄檔案上加上一筆資料,哪個地方有哪個檔名的檔案。移動檔案就是把原本目錄檔案上這個檔案刪除,然後新增到新的目錄檔案上。有趣的是刪除檔案,刪除檔案其實並不是把那個檔案空間清除,而是目錄檔案上這個檔案的紀錄。當一個檔案沒有跟任何目錄有所連結,系統就會判定這的空間是空的空間。將來要儲存新的檔案的時候,系統可能就會把新資料覆蓋過舊資料。
SYSTEM DIRECTORY
Linux系統依據FHS(Filesystem HierarchyStandard)定義系統中的主要目錄與其內容,讓軟體開發商、系統製作者、以及使用者知道該把檔案放去哪,以及要去哪裡找檔案。根據FHS,Linux系統中幾個比較重要的目錄如下:/: 跟目錄,系統中最重要的目錄,所有目錄都是由此衍生出去的。
/etc: 系統設定檔目錄,包括使用者帳號密碼、服務啟始檔、軟體設定檔等。
/home: 使用者家目錄。
/root: 系統管理員家目錄。
/var: 可變性資料目錄,如快取檔、紀錄檔、資料庫、網頁等。
/bin: 執行檔目錄,如bash或其他軟體的執行命令。
/tmp: 暫存檔目錄。
/media: 可移除裝置目錄,如外接硬碟、隨身碟、外接光碟機等。
/dev: 系統裝置與周邊設備目錄,如IDE設備、記憶體、序列埠口等。
/boot: 開機檔目錄,包括kernel檔、開機選單、開機設定檔等。
/lib: 函式庫目錄,會存放系統開機時會用到的函式庫。
FILE PERMISSIONS
這邊同樣以下圖為例子,權限的部分可以看到是dr-xr-x-rx。權限主要分為四個部分:檔案類型、擁有者權限、群組權限、以及其他使用者權限三部分。
檔案類型大致有以下幾種:
-: file(一般檔案)
d: directory(目錄)
l: symbolic link(連結符號)
s: socket
p: pipeline
b: block(可儲存資料的設備)
c: character(硬碟以外的硬體接口)
權限是針對擁有者(user)、群組(group)、以及其他使用者(other)進行讀、寫、執行三種權限設定。
這邊要注意到對於檔案,權限只有讀取、編輯內容、以及執行,那如果要新增跟刪除呢?檔案的新增跟刪除必須要對該檔案所屬的目錄有寫入(w)的權限才可以進行,這點要注意。權限數字是讓使用者可以用數字去代表權限,例子中權限為r-xr-xr-x,每三個字母就代表一組權限。所以這個檔案的權限也可以寫成555。
另外還有一種特殊權限,主要是針對每組權限中的執行(x)給予不同的功能。
例如一個檔案原本的權限為rwxrwx---(770),如今希望這個檔案對於群組的部分給予特殊權限。所以特殊權限的群組為s,就把原本群組的x替換為s,變成rwxrws---。而權限數字表示群組的為2,加上原本的權限後,新的權限數字為2770。
FILE PERMISSIONS MANAGE
當需要變更檔案或目錄的擁有者以及擁有群組時,可以使用 #chown 以及 #chgrp。#chown [使用者名稱] [檔案或目錄] 可以將檔案或目錄的擁有者變更。#chgrp [群組名稱] [檔案或目錄] 可以將檔案或目錄的擁有群組者變更。或者使用 #chown .[群組名稱] [檔案或目錄],#chown 指令中,只要群組名稱前面加上「.」,就可以變更擁有群組。所以同時變更擁有者以及擁有群組,就使用 #chown [使用者名稱].[群組名稱] [檔案或目錄]。而加入參數-R,可以同時改變目錄下所有檔案以及目錄。當需要變更檔案的存取權限時,可以使用 #chmod 。權限的變更分為三個部分,who、what、which。
例如一個檔案原本的權限是rwxr-xrw-(756)。要群組增加讀取權限就輸入 #chmod g+w [檔案或目錄],或者 #chmod 776 [檔案或目錄]。要其他使用者無法讀取就輸入 #chmod o-r [檔案或目錄],或者 #chmod 752 [檔案或目錄]。要注意使用「= (assign)」是重新設定權限,如果一次想設定兩個以上的對象,可用「,」分隔。而-R參數也是為同時變更目錄以下所有檔案以及目錄的權限。
ACCESS CONTROL LIST
Access Control List(ACL)提供了一種更靈活控制檔案權限的方式。例如公司依照部門將所有員工建立群組,群組外的人無法存取群組中的權限。但是公司的董事長希望可以看到業務群組內的檔案,但是董事長屬於管理群組,無法進入業務群組。這時候就可以利用ACL讓董事長可以存取業務群組中的檔案。ACL在EXT4檔案系統中是預設開啟,而之前的檔案系統就必須手動設定開啟。使用 #dumpe2fs /dev/[分割區] | grep 'Default mount' 查詢分割區是否支援ACL功能。若無ACL功能可使用 #tune2fs -o acl.user_xattr /dev/[分割區] 開啟ACL功能。或編輯/etc/fstab,在該分割區的檔案系統參數中加入「,acl」。
對於欲修改權限的檔案或目錄,可以先用 #getfcal 查詢目前的權限設定。例如查詢/etc/fstab,輸入 #getfacl /etc/fstab。
由上而下依序是檔案名稱、擁有者、擁有群組、擁有者權限、擁有群組權限、其他使用者權限。要改變檔案的ACL則使用 #setfacl -m [u, g, o]:[使用者或群組名稱]:[權限] [檔案或目錄]。例如要讓使用者peter可以讀取,則輸入 #setfacl -m u:peter:r /etc/fstab。也讓群組john可以讀取寫入,則輸入 #setfacl -m g:john:rw /etc/fstab。然後在查詢一下就會發現,我們剛剛設定的權限都已經設定完成了。
這時候會發現,多出了一個mask,這是所謂的有效權限範圍,就像遮罩一樣。如果設定超出了這個範圍就會失效,例如如果peter加上了執行權限。
就會發現peter後面多了一個#effective:r--,表示peter的有效權限只有r--。管理員可以利用 #setfacl -m m:[權限] [檔案或目錄] 進行有效權限的設定。
當系統中的使用者以及群組數量眾多,或者使用率頻繁的時候,可以以繼承的方式設定ACL。#setfacl -m d:[u, g, o]:[使用者或群組名稱]:[權限] [檔案或目錄]。在設定對象類型之前多加一個d,這就表示此目錄以下的檔案或目錄,會繼承此設定。
當管理員想要移除某條設定的時候,就使用-x參數,此參數不可與-m一起使用。例如上述例子如果想把john群組移除,則輸入 #setfacl -x g:john /etc/fstab。再用 #getfacl /etc/fstab 就會發現john群組設定已經移除了。
FILE AND DIRECTORY MANAGE
#cp 用於複製檔案或目錄。-a: 完整複製,包括檔案或目錄的各種屬性、權限、使用者、時間等。
-f: 強制複製,不會有任何警告訊息。
-i: 目的檔存在時會顯示是否覆蓋的提示。
-r: 遞迴複製,用於複製目錄時使用,會複製目錄下所有子目錄與檔案。
-s: 複製為符號連結檔,也就是所謂的捷徑。
-u: 目的檔較舊或者目的檔不存在才會複製。
#rm 用於移除檔案或目錄。
-f: 強制刪除,不會有任何警告訊息。
-i: 刪除前會提示確認。
-r: 遞迴刪除,用於刪除目錄時使用,會刪除目錄下所有子目錄與檔案。
#mv 用於移動檔案或目錄。
-f: 強制移動,不會有任何警告訊息。
-i: 移動前會提示確認。
-u: 目的檔較舊或者目的檔不存在才會移動。
#touch 用於建立檔案,也可以用來修改檔案時間;每個檔案都有三個時間mtime, ctime, atime,mtime會記錄檔案內容最後更新的時間,ctime會記錄檔案狀態最後更新的時間,如權限、所有者等,atime會記錄檔案最後被存取、執行的時間。
-a: 修改atime。
-c: 只修改檔案時間,如果檔案不存在則不建立新檔案。
-d: 欲修改的時間,可用1 year ago, 13-May-2014, 或者用GMT修改時區等。
-m: 修改mtime。
-t: 欲修改的時間,格式為YYYYMMDDhhmm.SS。
#mkdir 用於建立目錄。
-m: 設定目錄權限,如 #mkdir–m 777 test。
-p: 可建立多層級目錄,如 #mkdir /test/test1/test2。
留言
張貼留言