一、摘要
ls是Linux和Unix下最常使用的命令之一,主要用來列舉目錄下的文件信息,-l參數(shù)允許查看當(dāng)前目錄下所有可見文件的詳細(xì)屬性,包括文件屬性、所有者、文件大小等信息。但是,當(dāng)其顯示符號(hào)鏈接的屬性時(shí),無論其指向文件屬性如何,都會(huì)顯示777,即任何人可讀可寫可執(zhí)行。本文從ls命令源碼出發(fā),由淺入深地分析該現(xiàn)象的原因,簡略探究了Linux 4.10下的符號(hào)鏈接鏈接、文件系統(tǒng)與權(quán)限的源碼實(shí)現(xiàn)。
關(guān)鍵詞:Linux ls 符號(hào)鏈接 文件系統(tǒng) 權(quán)限 源碼分析
二、引言
2.1 Linux文件權(quán)限
在Linux中每個(gè)文件有所有者、所在組、其它組的概念[11]。所有者一般為文件的創(chuàng)建者,誰創(chuàng)建了該文件,就天然的成為該文件的所有者;當(dāng)某個(gè)用戶創(chuàng)建了一個(gè)文件后,這個(gè)文件的所在組就是該用戶所在的組;除開文件的所有者和所在組的用戶外,系統(tǒng)的其它用戶都是文件的其它組。ls 命令將每個(gè)由 Directory 參數(shù)指定的目錄或者每個(gè)由 File 參數(shù)指定的名稱寫到標(biāo)準(zhǔn)輸出,以及所要求的和標(biāo)志一起的其它信息。ls -l中顯示的內(nèi)容常如下所示:
-rwxrw-r‐-1 root root 1213 Feb 2 09:39 abc |
前10個(gè)字符說明了文件類型與權(quán)限。第一個(gè)字符代表文件(-)、目錄(d),鏈接(l),其余字符每3個(gè)一組(rwx),讀(r)、寫(w)、執(zhí)行(x)。第一組rwx:文件所有者的權(quán)限是讀、寫和執(zhí)行;第二組rw-:與文件所有者同一組的用戶的權(quán)限是讀、寫但不能執(zhí)行;第三組r--:不與文件所有者同組的其他用戶的權(quán)限是讀不能寫和執(zhí)行。權(quán)限也可用數(shù)字表示為:r=4,w=2,x=1 因此rwx=4+2+1=7。
2.2 符號(hào)鏈接
如前所述,若第一個(gè)字符顯示為l,說明該文件是符號(hào)鏈接。符號(hào)鏈接(軟鏈接)是一類特殊的文件, 其包含有一條以絕對(duì)路徑或者相對(duì)路徑的形式指向其它文件或者目錄的引用[12]。符號(hào)鏈接的操作是透明的:對(duì)符號(hào)鏈接文件進(jìn)行讀寫的程序會(huì)表現(xiàn)得直接對(duì)目標(biāo)文件進(jìn)行操作。某些需要特別處理符號(hào)鏈接的程序(如備份程序)可能會(huì)識(shí)別并直接對(duì)其進(jìn)行操作。一個(gè)符號(hào)鏈接文件僅包含有一個(gè)文本字符串,其被操作系統(tǒng)解釋為一條指向另一個(gè)文件或者目錄的路徑。它是一個(gè)獨(dú)立文件,其存在并不依賴于目標(biāo)文件。如果刪除一個(gè)符號(hào)鏈接,它指向的目標(biāo)文件不受影響。如果目標(biāo)文件被移動(dòng)、重命名或者刪除,任何指向它的符號(hào)鏈接仍然存在,但是它們將會(huì)指向一個(gè)不復(fù)存在的文件。這種情況被有時(shí)被稱為被遺棄。
但是,我們常常發(fā)現(xiàn),創(chuàng)建符號(hào)鏈接其權(quán)限就會(huì)顯示為lrwxrwxrwx,為什么?是ls命令對(duì)符號(hào)鏈接進(jìn)行了處理,還是文件本身權(quán)限即如此?這樣會(huì)不會(huì)帶來一些安全隱患?懷著這些問題,本文由淺入深,從ls命令出發(fā),探索了其背后的系統(tǒng)調(diào)用至vfs文件系統(tǒng)實(shí)現(xiàn)細(xì)節(jié),力求解釋這些問題。但作者水平有限,尚有很多細(xì)節(jié)不清楚,不對(duì)之處懇請(qǐng)批評(píng)指正。