Linux 程序設計學習筆記----Linux下文件類型和屬性管理
轉載請註明出處:http://blog.csdn.net/suool/article/details/38318225
部分內容整理自網絡,在此感謝各位大神。
Linux文件類型和權限
數據表示
文件屬性存儲結構體Inode的成員變量i_mode存儲著該文件的文件類型和權限信息。
該變量為short int類型。
這個16位變量的各個位功能劃分為:
- 第0-8位為權限位,為別相應擁有者(user)。同組其它用戶(group)和其它用戶(other)的讀R寫W和運行X權限。
- 第9-11位是權限修飾位。包含設置有效ID(setuid)位。設置有效用戶組ID(setgid)。和粘貼位(sticky)。
- 第12-15位是文件類型位。
例如以下一個樣例:
drwxr-xr-x 5 root root 1024 Sep 13 03:27 Desktop
與文件權限相關聯的是第一、第三、第四個域。
第三個域是文件的全部者,第四個域是文件的所屬組,而第一個域則限制了文件的訪問權限。在這個樣例中。文件的 全部者是 root,所屬的組是 root,文件的訪問權限是 drwxr-xr-x。對於文件和文件夾講,每一個文件和文件夾都有一組權限標誌和它們結合在一起,在上例中就是第一個域中的內容。以下來細致分析這個域中各個 符號的意義:
該域由 10 個字符組成。能夠把它們分為四組,詳細含義各自是:
d rwx r-x r-x
文件類型 全部者權限標誌 組權限標誌 其它用戶權限標誌
當中:
文件類型:第一個字符。
因為 Linux 系統對與設備、文件夾、文件都當作是文件來處理,因此該字符表明此文件的類型,字符與相應的意義例如以下表:
文件標誌 文件類型 樣例
- - 普通文件 數據文件、ASCII 純文本 文件、程序
- d 文件夾 /bin
- b 塊設備 /dev/hda(第一個 IDE 硬盤)
- c 字符設備 /dev/ttyS1(與 DOS 種的串口 2 等同)
- s 套接字 /dev/log
- p 命名管道 /dev/initctl(與“|”等同)
- l 符號鏈接 /dev/modem->/dev/ttyS1
權限標誌
對每一個文件或文件夾都有 4 類不同的用戶。每類用戶各有一組讀、寫和運行(搜索)文件的訪問權限。這 4 類用戶是:
- root:系統特權用戶類,既 UID = 0 的用戶。
- owner:擁有文件的用戶。
- group:共享文件的組訪問權限的用戶類的用戶組名稱。
- world:不屬於上面 3 類的全部其它用戶。
作為 root,他們自己主動擁有了全部文件和文件夾的全面的讀、寫和搜索的權限。所以沒有必要明白指定他們的權限。
其它三類用戶則能夠在耽擱文件或者文件夾的基礎上別 授權或撤消權限。因此對另外三類用戶,一共 9 個權限位與之相應,分為 3 組,每組 3 個,分別用 r、w、x 來表示,分別相應 owner、group、world。
權限位對於文件和文件夾的含義有些許不同。
每組 3 個字符相應的含義從左至右的順序,對於文件來說是:讀文件的內容(r)、寫數據到文件(w)、做為命令運行該文件(x)。
對於文件夾來說是:讀包括在文件夾中 的文件名(r)、寫信息到文件夾中去(添加和刪除索引點的連接)、搜索文件夾(能用該文件夾名稱作為路徑名去訪問它所包括的文件或子文件夾)。
詳細來說就是:
1. 有僅僅讀權限的用戶不能用 cd 進入該文件夾。還必須有運行權限才幹進入。
2. 有運行權限的用戶僅僅有在知道文件名稱並擁有該文件的讀權限的情況下才幹夠訪問文件夾下的文件。
3. 必須有讀和運行權限才幹夠使用 ls 列出文件夾清單,或使用 cd 進入文件夾。
4. 如用戶有文件夾的寫權限,則能夠創建、刪除或改動文件夾下的不論什麽文件或子文件夾,既是該文件或子文件夾屬於其它用戶。
========================================================================================================
改動文件權限
首先講改動文件的全部權。使用 chown 和 chgrp 命令:
chown new_user file or directory:改動文件或文件夾的全部者。
chgrp new_group file or directory:改動文件或文件夾的所屬組。
這裏須要註意的是:普通用戶不能將文件或文件夾的全部權交與他人,僅僅有 root 有這一權限。可是普通用戶有權改變文件或文件夾的所屬組。
因為每類用戶的權限都是由 rwx 三位組成。因此能夠用三個八進制數字表示文件的訪問權。一個八進制數字能夠用三個二進制數字表示,那麽與其相應,權值為 4 的位相應 r,權值為 2 的位相應 w。權值為 1 的位相應 x。對於一類用戶,將這三位與其相應的權值相乘求和,就能夠得出對該類用戶的訪問權限。
改變文件訪問權限的命令是 chmod。格式是:
chmod permission file_name
比方 chmod 764 a.txt,它表示對於文件的全部者。具有對該文件讀、寫、運行的權限。
對於文件所屬組的用戶,擁有讀、寫的權限。對於其它用戶,僅僅有讀權限。
chmod是Linux下設置文件權限的命令,後面的數字表示不同用戶或用戶組的權限。
通常是三個數字:
第一個數字表示文件全部者的權限
第二個數字表示與文件全部者同屬一個用戶組的其它用戶的權限
第三個數字表示其他用戶組的權限。
權限分為三種:讀(r=4)。寫(w=2),運行(x=1) 。 綜合起來還有可讀可運行(rx=5=4+1)、可讀可寫(rw=6=4+2)、可讀可寫可運行(rwx=7=4+2+1)。
所以,chmod 755 設置用戶的權限為:
1.文件全部者可讀可寫可運行
2.與文件全部者同屬一個用戶組的其它用戶可讀可運行
3.其他用戶組可讀可運行
chmod 4755與chmod 755 的差別在於開頭多了一位,這個4表示其它用戶運行文件時,具有與全部者相當的權限。
比如:root用戶創建了一個上網認證程序netlogin,假設其它用戶要上網也要用到這個程序,那就須要root用戶執行chmod 755 netlogin命令使其它用戶也能執行netlogin。
可是netlogin運行時可能須要訪問一些僅僅有root用戶才有權訪問的文件,那麽其它用戶運行netlogin時可能由於權限不夠還是不能上網。
這樣的情況下,就能夠用 chmod 4755 netlogin 設置其它用戶在運行netlogin也有root用戶的權限,從而順利上網。
ps:對shell腳本設置無效!僅僅相應用程序有效!
這裏須要註意的是:文件的創建者是唯一能夠改動該文件訪問權限的普通用戶,另外一個能夠改動文件訪問權限的用戶是 root。
另一種表示方法,就是用字符串來設定文件訪問權限。當中讀用 r 表示,寫用 w 表示,運行用 x 表示;全部者用 u 表示。組用戶用 g 表示。其它用戶用 o 表示。全部用戶用 a 表示。那麽上面樣例就寫成以下的模樣:
chmod a+r,u+w,u+x,g+w a.txt
======================================================================================
權限修飾位
SUID含義:文件的該位被設 置為1,在該文件被運行時,該文件將以全部者的身份運行。也就是說不管誰來運行這個文件,他都有文件全部者的特權,假設全部者是root的話,那麽運行人就有超級用戶 的特權了。這是該位將變成一個安全漏洞。因此不要輕易設置該位。
SGID含義:執行者將具有文件全部組的權限。
STICKY粘合位: 要求操作系統既是在可運行程序退出後。仍要在內存中保留該程序的映像。這樣做是為了節省大型程序的啟動時間。可是會占用系統資源。因此設置該位,不如把程序寫好。
setuid 。setgid;sticky bit差別
每個文件有全部者及組編號,set uid ;set gid能夠改變用戶對文件具有的權限:寫和運行.
setuid: 在運行時具有文件全部者的權限.
setgid: 設置文件夾. 一個文件夾被標上setgid位,此文件夾下創建的文件繼承該文件夾的屬性.
sticky bit: 該位能夠理解為防刪除位. 設置sticky bit位後,就算用戶對文件夾具有寫權限,但也僅僅能加入文件而不能刪除文件。
怎樣設置
操作這些標誌與操作文件權限的命令是一樣的, 都是 chmod. 有兩種方法來操作,
1) chmod u+s temp -- 為temp文件加上setuid標誌. (setuid 僅僅對文件有效,U=用戶)
chmod g+s tempdir -- 為tempdir文件夾加上setgid標誌 (setgid 僅僅對文件夾有效。g=組名)
chmod o+t temp -- 為temp文件加上sticky標誌 (sticky僅僅對文件有效)
2) 採用八進制方式. 這一組八進制數字三位的意義例如以下,
abc
a - setuid位, 假設該位為1, 則表示設置setuid
b - setgid位, 假設該位為1, 則表示設置setgid
c - sticky位, 假設該位為1, 則表示設置sticky
設置後, 能夠用 ls -l 來查看. 假設本來在該位上有x, 則這些特殊標誌顯示為小寫字母 (s, s, t). 否則, 顯示為大寫字母 (S, S, T)
如:
rwsrw-r-- 表示有setuid標誌 (rwxrw-r--:rwsrw-r--)
rwxrwsrw- 表示有setgid標誌 (rwxrwxrw-:rwxrwsrw-)
rwxrw-rwt 表示有sticky標誌 (rwxrw-rwx:rwxrw-rwt)
==============================================================================================================
inux/unix 下的可運行文件:
被設置了setuid, 當一個程序一旦設置了該標記以後, 使用該可運行程序的進程將擁有該運行文件的全部者的權限,可提升使用者的權限,普通用戶能夠運行改命令,使自己升級為root權限。
setuid的使用方法是: chmod 4755 program 或 chmod u+s program (setuid 僅僅對文件有效)
被設置了setgid, 同理使用該程序的進程將擁有該程序全部組的權限。單獨setGid的文件很少用,通常都是即setUid又setGid,同一時候setuid,setgid 是為了綁定某個特殊用戶及其組的特殊權限。
setgid的使用方法是:chmod 2755 dir 或 chmod g+s dir (setgid 僅僅對文件夾有效)
同一時候設置setuid,setgid的使用方法:chmod 6755 program
被設置粘著位,設置的使用方法是: chmod 1777 file 或 chmod o+t file (sticky僅僅對文件有效)
當一個文件夾被設置為"粘著位"(用chmod a+t),則該文件夾下的文件僅僅能由
一、超級管理員刪除
二、該文件夾的全部者刪除
三、該文件的全部者刪除
也就是說,即便該文件夾是不論什麽人都能夠寫,但也僅僅有文件的屬主才幹夠刪除文件 。
文件的屬性管理
1.讀取文件屬性
使用stat函數。例如以下演示樣例:
stat的結構體包括的例如以下:主要見stat.h頭文件,詳細該文件的解讀參見:http://blog.csdn.net/xuemiao1234/article/details/5544226
The structurestatcontains at least the following members:
struct stat { dev_t st_dev; //文件的設備編號 ino_t st_ino; //節點 mode_t st_mode; //文件的類型和存取的權限 nlink_t st_nlink; //連到該文件的硬連接數目,剛建立的文件值為1 uid_t st_uid; //用戶ID gid_t st_gid; //組ID dev_t st_rdev; //(設備類型)若此文件為設備文件。則為其設備編號 off_t st_size; //文件字節數(文件大小) unsigned long st_blksize; //塊大小(文件系統的I/O 緩沖區大小) unsigned long st_blocks; //塊數 time_t st_atime; //最後一次訪問時間 time_t st_mtime; //最後一次改動時間 time_t st_ctime; //最後一次改變時間(指屬性) };
相同具有查詢功能的函數有lstat,參見http://pubs.opengroup.org/onlinepubs/7908799/xsh/lstat.html
正在打開文件的查詢函數:fstat,參見http://pubs.opengroup.org/onlinepubs/7908799/xsh/fstat.html
相同上文中的改動命令中。對於已經打開的文件,使用fchmod的類型,加f前綴。
以下是一個使用lstat函數查詢文件屬性的演示樣例程序,能夠依據文件的類型打印相應的提示信息。
代碼例如以下:
#include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int i; struct stat buf; char *ptr; for (i = 1; i < argc; i++) { printf("%s: ", argv[i]); if (lstat(argv[i], &buf) < 0) // obtains information about the file { perror("lstat"); continue; } if(S_ISREG(buf.st_mode)) ptr = "regular file"; // regular file else if (S_ISDIR(buf.st_mode)) ptr = "directory file"; // directory file else if (S_ISCHR(buf.st_mode)) ptr = "character special file"; // character_special file else if (S_ISBLK(buf.st_mode)) ptr = "block special file"; // block_special file else if (S_ISFIFO(buf.st_mode)) ptr = "fifo file"; // pip file #ifdef S_ISLNK else if (S_ISLNK(buf.st_mode)) ptr = "symbolic link"; // link file #endif #ifdef S_ISSOCK else if (S_ISSOCK(buf.st_mode)) ptr = "socket"; // socket file #endif else ptr = "** unknown mode **"; // unknown file printf("%s\n", ptr); } return 0; }
ok。 that‘s all.
The Next :
文件管理的應用項目實現
一些關於文件管理系統的重要知識點:
inode
下一代的文件管理系統btrfs
硬鏈接,軟連接
轉載請註明出處:http://blog.csdn.net/suool/article/details/38318225
Linux 程序設計學習筆記----Linux下文件類型和屬性管理