linux檔案的存取許可權—模式位疑難詳解

來源:互聯網
上載者:User

 

檔案的存取許可權—模式位疑難詳解

一、前言
========

本文主要說明Linux下普通檔案及目錄的存取使用權限設定。本文是為稍具基礎的初學者寫的(我也是beginner),如
果您能夠理解如下幾行'ls -l'命令的輸出含義(注意下面標註^的位),那您就沒有必要讀本文了——別浪費時
間看對你沒用的東西,時間是最寶貴的!

-r-sr-xr-x 1 root bin 26975 Jun 24 1999 01:32 /usr/bin/passwd-----------1.1
^
-rwxrwSr-x 1 zyd zyd 12506 Oct 29 10:27 test_euid-----------------------1.2
^
drwxrwxrwt 5 root root 1024 Nov 1 17:17 01;34 /tmp----------------------1.3
^^^^ ^ ^
-rwxr-xr-x 2 zyd zyd 32506 Oct 19 10:20 hard_link-----------------------1.4
^
lrwxr-xr-x 1 zyd zyd 1 Oct 23 10:40 sym_link->/tmp/sym_target-----------1.5
^ ^^^^^^^^^^^^^^^

 

二、'ls -l'命令輸出格式簡介
===========================

'ls -l'命令以長格式顯示檔案清單,其各欄位含義如下:

lrwxr-xr-x 1 zyd users 15 Oct 23 10:40 sym_link->/tmp/sym_target
_________ ___ _____ ____________ ________ _______________
| | | | | | | | |
| | | | | | | | +--符號串連(s_link)
| | | | | | | |
| | | | | | | +-----檔案名稱(name)
| | | | | | |
| | | | | | +----檔案最後更改時間(time)
| | | | | |
| | | | | +------------以位元組計的檔案長度(size)
| | | | |
| | | | +----------檔案屬組(group)
| | | |
| | | +--------------------檔案屬主(user)
| | |
| | +-------串連數位(count)
| |
| +-------檔案模式位(mode),佔9位
|
+------------檔案類型位(type),佔一位

以上9個欄位中除了s_link外,其他欄位對不同檔案和目錄都應該有。其中user、group、time和name的含義自
明,本文就不再介紹,其它欄位將分專題小節在本文介紹。

三、檔案類型(type)

Linux支援的檔案類型主要包括一下7類,箭頭右面的字元就是相應的檔案類型位標誌:
1、普通檔案========>-
2、目錄檔案========>d
3、符號串連========>l
4、字元裝置檔案====>c
5、塊裝置檔案======>b
6、具名管道FIFO
7、套介面socket

其中FIFO和socket超出了本文的範疇,不做介紹。其它檔案簡單解釋如下:

1、普通檔案:就是普通檔案(廢話!),你用'vi myfile'建立的myfile就是普通檔案,比如可執行二進位代碼
檔案、script指令檔、ASCII文字檔、資料檔案、設定檔......就解釋到這樣行嗎?

2、目錄檔案:目錄可以理解成放其它檔案和/或其它目錄的容器,是一種特殊檔案,其內容由目錄項組成,每個目錄項主要包括兩部分內容:檔案名稱name和索引節點號inode,兩者和起來稱為串連,我們將在下小節對inode進行更詳細的介紹。

3、裝置檔案:不知道諸位是否有使用DOS的經驗,如果我們的機器只有三個DOS系統檔案IO.SYS, MSDOS.SYS, COMMAND.COM,而你需要編輯一份英文文檔,日後再通過印表機輸出,你能怎麼辦?

COPY CON MYDOC.TXT

;在此輸入文檔內容

^+D ;結束存檔

COPY MYDOC.TXT > PRN ;列印文檔

如果你熟悉這個過程,那你就已經理解裝置檔案了。以上的CON和PRN分別是DOS定義的兩個裝置檔案,分別對應終端和並行列印口。這種設計使我們不必瞭解裝置使用的具體硬體細節,按使用普通檔案相同的方法來使用外部裝置。

Linux下的裝置檔案分為三大類:字元裝置、塊裝置和網路裝置,要想準確區別它們可能需要單獨寫一篇更臭更長的文章,大致情況是:字元裝置是直接讀取的,不使用緩衝區,象串列口、終端等;而塊裝置都是通過緩衝區進行讀取的,並且每次只能讀取一定數量的塊,比如磁碟每次至少要讀取一個扇區(如512位元組),塊裝置可以實現隨機讀寫;網路裝置即前面提到的socket,因為我還不很熟悉,就不亂說了。裝置檔案一般都儲存在/dev目錄下,諸位可以用ls -l命令看看都有什嗎?反正本文的重點在於介紹普通檔案和目錄,裝置檔案不是重點,所以就只介紹到這裡。

四、索引節點、硬串連和串連計數
==============================

1、索引節點inode:

Linux為每個檔案分配一個稱為索引節點的號碼inode,可以將inode簡單理解成一個指標,它永遠指向本檔案的
具體儲存位置。系統是通過索引節點(而不是檔案名稱)來定位每一個檔案。例如:

假設我們在硬碟目前的目錄下建立了一個名為mytext文字檔,其內容只有一行:
This is my file.
當然這行文字一定是儲存在磁碟資料區某個具體位置裡(物理上要通過磁頭號、柱面號和扇區號來描述,在本例中假設分別是1、20、30)。
假設其inode是262457,那麼系統通過一段標準程式,就能將這個inode轉換成存放此檔案的具體物理地址(1磁
頭、20柱面、30扇區),最終讀出檔案的內容:“This is my file.”
所以inode是指向一個檔案資料區的指標號碼,一個inode對應著系統中唯一的一片物理資料區,而位於兩個不
同物理資料區的檔案必定分別對應著兩個不同的inode號碼。

檔案拷貝命令:
# cp /home/zyd/mytext newfile
在當前工作目錄建立了一個新檔案newfile,其實際操作主要包括如下三步:
1、在目前的目錄中增加一個目錄項,其檔案名稱域填入newfile,並分配了一個新的inode,假設是262456。
2、將原檔案(在1磁頭、20柱面、30扇區)的內容複寫了一份到新的空閑物理塊(假設是1磁頭、20柱面、31扇
區)。
3、填寫一些其他關鍵資訊,使系統通過這些資訊及inode號碼可以完成物理地址的轉換。

所以檔案複製要分配新的inode和新的資料區,雖然兩個檔案的內容是一樣的。

2、硬串連hardlink:
我們實際使用檔案時一般是通過檔案名稱來引用的。通過上面的討論,我們知道:1個inode號碼肯定和一片完全
屬於一個檔案的資料區一一對應。那麼一個檔案系統中兩個或更多個不同的檔案名稱能否對應同一個檔案呢?答案是肯定的。我們知道inode號碼是記錄在檔案名稱對應的目錄項中的,我們可以使兩個或多個檔案的目錄項具有相同的inode值,實際上就使它們對應著同一個檔案。有幾個目錄項具有相同的inode號,我們就說這個檔案有幾個硬串連(hardlink),對於普通檔案,ls -l命令的串連計數count域的數值就是本檔案擁有的硬串連數。硬串連可以通過ln命令建立,例如:
# ln /home/zyd/mytext hardlink_mytext
就建立了一個新的檔案hardlink_mytext,這個檔案的inode同樣是262457。建立硬串連實際上只是增加了一個
目錄項,但並複製檔案資料區,原檔案的資料區由兩個檔案分享權限設定。這一方面能夠節約大量磁碟空間,同時可以保證兩個檔案能同步更新。

'ls -il'可以顯示檔案的inode(在下面最左邊):

262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext

3、串連計數count:

前面我們介紹了,檔案的串連計數域表明本系統中共有幾個檔案目錄項的inode和本檔案相同,也就是本檔案共有幾個硬串連。如上面的例子中hardlink_mytext和mytext檔案的count值都是2。

那麼對於目錄,其count域的含義是什麼呢?目錄的count同樣表示共有多少個目錄項指向此目錄,不過要詳細
說明必須進一步解釋VFS檔案系統的結構,為簡單起見,只要這樣理解就行了:(count-2)等於本目錄包含的直
接子目錄數(就是只包括兒子,不包括孫子啦!)。例如:如果一個目錄/abc的count域為5,那麼
/abc目錄一定包含3個子目錄。

至此我們已經介紹了普通檔案、目錄檔案、裝置檔案、硬串連、串連計數、索引節點等非常重要的概念。

4、進一步說明:

硬串連檔案實際上並不是一種新的檔案類型,兩個檔案互為對方的硬串連。它們應該都是普通檔案(誰能告訴
我:其它類型的檔案可以硬串連嗎?)。兩個檔案除了名稱或/和檔案目錄不同外,其它部分完全相同,更改了一個檔案,另一個的檔案長度、內容、更改時間等都將相應發生變化,更改了一個檔案的許可權位mode,另一個也會發生同樣的變化。

注意串連計數欄位count,互為硬串連的兩個檔案的count值都是2,表明有兩個inode指向同一檔案的inode。
當我們刪除其中一個檔案時,系統首先將(count-1)->count,如果結果是零,就將其目錄項和資料區都刪除,
否則只將本目錄項刪除,資料區仍然保留,仍然可以通過另外的檔案名稱訪問。根據這個特性,可以通過為重要的檔案建立硬串連的方法來防止其被誤刪除。

一個檔案系統允許的inode節點數是有限的,如果檔案數量太多,即使每個檔案都是0位元組的空檔案,系統最終
也會因為節點空間耗盡而不能再建立檔案。所以當發現不能建立檔案時首先要考慮硬碟資料區是否還有空間(可通過du命令),其次還得檢查節點空間。

互為硬串連的多個檔案必須位於同一個檔案系統上。根裝置及任何一個需要mount才能掛接進來的分區、磁碟片、 NFS、光碟機等都是一個獨立的檔案系統,每個檔案系統有一個相應的裝置號,不同檔案系統中具有相同inode節點的檔案間沒有任何聯絡。系統則通過裝置號和inode號的組合唯一確定一個檔案。

Linux之所以能支援多種檔案系統,其實是由於Linux提供了一個虛擬檔案系統VFS,VFS作為實際檔案系統的上
層軟體,掩蓋了實際檔案系統底層的具體結構差異,為系統訪問位於不同檔案系統的檔案提供了一個統一的介面。實際上許多檔案系統並不具備inode結構,其目錄結構也和以上的討論不同,但通過VFS,系統均為其提供了虛擬一致的inode和目錄項結構。所以,'ls -il'命令實際顯示的inode應該是VFS inode,也就是說,
inode是存在於記憶體中的資料結構,而不一定是實際的硬碟結構。但為Linux量身定做的ext2檔案系統具備實際
的inode和串連型目錄項結構,所以,對於ext2檔案系統,可以認為我們上面討論的關於硬串連的概念是完全正確的。

本節最後兩段的說明如果您暫時理解不了也沒關係,隨著學習的深入,慢慢就能理解了。

五、符號串連
============

不同檔案系統中的檔案不能建立硬串連,但可以通過符號串連進行同步。符號串連是一種獨立的檔案類型,它有自己的資料區,但資料區的內容只是一個被它指向的檔案的路徑名。前言那節的例子1.5說明檔案sym_link是一個指向/tmp/sym_target檔案的符號串連,如果我們cat sym_link,系統自動將它指向的檔案開啟顯示而不是顯示sym_link檔案本身,注意sym_link的檔案長度是15,正是字串/tmp/sym_target的長度。建立符號串連和建立硬串連一樣使用ln命令,不過要加入'-s'選項:

ln -s /home/zyd/file_system/mytext my_sym_link
# ls -li my_sym_link
262458 lrwxrwxrwx 1 zyd zyd 28 Nov 3 14:55 my_sym_link -> /home/zyd/file_system/mytext

思考題:建立符號串連時一般都要輸入目標檔案的絕對路徑,為什嗎?
(提示:假設我們想讓使用者在任意目前的目錄都能執行/usr/local/my_bin/myproc而運行如下命令:
# cd /usr/local/bin
# ln -s ../my_bin/myproc myproc)

六、檔案模式位mode
==================

通過chmod命令可以改變使用者對相應檔案的存取許可權。
Linux系統用一個16位的字來儲存每個檔案的type和mode,其中高4位通過組合來決定檔案的type,它是在檔案建立時寫入的,使用者不能更改。下面介紹後面的12位元模式位

bit|11 10 9 |8 7 6 | 5 4 3 | 2 1 0 |
----|--------|--------|---------|---------|
| X X X |X X X | X X X | X X X |
----|--------|--------|---------|---------|
mode r w x r w x r w x

將這12位分成4組,高位組(9,10,11位)每位都有特殊的含義,下面將具體說明。此高位組(6,7,8位)決定檔案
屬主擁有的許可權,再下一組決定檔案屬群組成員對此檔案擁有的許可權,最低位組決定除了屬主及屬組以外的使用者擁有的對此檔案操作的許可權。

較低3組中每組從最低位到最高位分別是執行位、改寫位和讀取位,哪位置1表示有相關許可權。例如第6位是1表示屬主可以執行此檔案,第4位是1同組其他使用者可以改寫此檔案,第2位是1表示其它使用者可以讀此檔案。每組的3位構成一位8進位數,可以將各許可權位的組合通過3位8進位表示,例如:
111 101 100表示成754,則命令:chmod 754 filename使檔案的屬主能讀、寫和執行filename檔案,本組的其他使用者可以讀和執行此檔案,但不能修改。其他使用者則只能讀該檔案。

第11位是SUID位,第10位是SGID位,第9位是黏附位。
如果某個可執行檔設定了SUID位,則此檔案運行時的進程將具備和此檔案屬主相同的許可權。
/usr/bin/passwd設定了SUID位且其屬主是root,則任何使用者運行它時,其進程就具備了root許可權,這就是為
什麼普通使用者也可以通過passwd命令更改自己的登陸口令的原因(實際就是改變/etc/shadow檔案,只有root有
權讀寫此檔案).具備SUID位且屬主可執行,則屬主執行位顯示s來代替沒有SUID位的x,如果屬主不能執行,則顯示為大寫的S。

SGID和SUID含義相對應。設定SGID位且屬組可執行,則屬組執行位改成s顯示,否則以S顯示。

黏附位根據其他使用者是否可執行分別在 ls -l 時在其他使用者執行位上顯示成t或T。對於可執行檔,設定了黏附位可以使其第一次運行後在交換分區swap中保留本文的副本,由於交換分區的檔案是連續存放的,所以下次運行時能較快調入記憶體。對於現代檔案系統來說,這一功能已經沒有什麼實際意義了。

如果對一個目錄設定了黏附位,則只有對於該目錄具有寫許可權的使用者且滿足如下三個條件之一,才能刪除或更名該目錄下的檔案:
1、超級使用者root。
2、此目錄的擁有者。
3、擁有要被刪除或更改名字的檔案。
這一特性被Linux使用到了/tmp目錄上:任何人都可以使用該目錄存放檔案,但只有檔案所有者和root可以刪除或更名檔案。

最後要談的是目錄的讀、寫和執行位的準確含義初學者常常對目錄的許可權位理解得似是而非,原因主要於對檔案系統的確切結構不理解。
r表示讀目錄,w表示寫目錄,而x表示搜尋目錄(注意不是執行目錄)

我們通過以上討論已經知道目錄實際是一種特殊檔案,它由目錄項構成,每個目錄項包括該目錄下一個檔案的檔案名稱和inode。所以讀許可權就是讀目錄項的許可權,因此獲得此目錄所包含的檔案名稱列表。同樣寫目錄許可權就是更改目錄目錄檔案(增加、減少和更名目錄項),實際就是能否在該目錄建立、刪除檔案和為檔案改名。搜尋許可權通俗點可以理解為進入目錄對檔案內容進行操作的許可權,包括開啟檔案、擷取檔案的進一步詳細資料等權力。更通俗點,我們可以將目錄比喻為盛藥的盒子,我們在一個大藥盒(根目錄)上貼上叫“藥品”的標籤(目錄名),下面列著“盤尼西林”和“感冒藥”(目錄項),擁有x許可權相當於有開啟這個盒子的鑰匙。如果我們擁有鑰匙,就能開啟這個盒子(擁有根目錄的x許可權,可以進入),開啟後發現裡面還有一個加鎖的盒子貼有“感冒藥”標籤(子目錄),下面列著“感冒通”、“感康”......,另外還有一個藥瓶裡面裝有消炎藥盤尼西林(檔案)。
如果我們需要服用“盤尼西林”(相當於開啟根目錄下的檔案),則我們必須擁有開大箱子的鑰匙(根目錄x許可權)和
吃藥的權力(相應檔案許可權),但如果我們需要服用“感康”,則必須還有下一把鑰匙。目錄讀許可權相當於我們是
否識字,寫入權限相當於我們是否擁有一隻筆。只要識字,我們沒有任何鑰匙也能大致瞭解大箱子內有什麼,但無法瞭解小盒子裡有些什麼具體藥品。如果需要瞭解就必須首先能開啟大箱子。如果我們要向大箱子內放入一種新藥或拿出一種藥品(相當於在根目錄內建立、刪除檔案),我們首先必須能進入大箱子(x),然後有筆(w)能相應更改大箱子的標籤。
有了以上的比喻,下面進行正式說明:
1、當我們開啟任何檔案時(也就是我們的命令中包含最終檔案名稱時),對該檔案名稱的絕對路徑中的每個目錄均必須擁有x搜尋許可權。也只有擁有了x許可權,才能用cd命令進入該目錄。
2、讀許可權允許我們通過ls命令獲得該目錄的檔案名稱列表,但前提仍然是必須對該目錄的所有上級目錄擁有x許可權(想想藥盒的故事)。
3、在滿足目錄許可權的前提下,最終對檔案的讀、寫、執行取決於檔案許可權。
4、只要你擁有一個目錄的寫入權限及其所有上層目錄的搜尋許可權,你就能在該目錄建立檔案和刪除檔案,即使這個檔案不歸你所有!!!
5、超級使用者可以超越大多數檔案許可權的檢查。

思考題:
1、為什麼目錄建立的預設許可權是rwxr-xr-x?
2、假設在你的目前的目錄下有一個子目錄test,你擁有讀和寫入權限,沒有搜尋許可權,如下命令哪些能夠成功執
行?為什嗎?
ls test
ls -l test
cd test
cp /etc/passwd ./test/newpasswd
del test/new_file
ln test/new_file up_file

七、變更檔模式mode
====================

變更檔模式可以通過chmod命令進行,我們將mode的低12位每3位一組組成4位8進位數,被設定許可權的位為1,否則為0,作為chmod的參數之一,後面跟需要更改許可權的檔案名稱列表,例如:

# chmod 4752 this.file
設定了this.file的SUID位(4),檔案屬主可以讀、寫和執行(7)、同組其他使用者可以讀和執行,不能更改(5)、
其他使用者只能改寫、不能讀和執行(2)——哪位真的這樣設定了許可權位,肯定腦筋有點問題:)

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.