linux查看目录访问权限,Linux文件访问权限
一.設置用戶ID和設置組ID
1.實際用戶ID和實際組ID標識當前登錄的用戶。
2.有效用戶ID,有效組ID以及附加組ID決定了我們的文件訪問權限。
3.通常,有效用戶ID等于實際用戶ID,有效組ID等于實際組ID。但是可以在文件模式模式字中設置一個特殊標志,
將進程的有效用戶ID設置為文件所有者的用戶ID。分別設置用戶ID位和設置組ID位即可。方法如下:
chmod u+s filename 與 chmod g+s filename
二.文件的訪問權限
1.每個文件有9個訪問權限,可分為三類,u(所有者),g(組),o(其它),得到的方法,可以直接使用宏與st_mode得到,
也可以通過位運算獲得。
2.三類權限:(讀,寫,執行)
a.用名字打開任一類型文件時,隱含對當前目錄及其上級目錄都應具有執行權限,否則不能打開。
b.當一個目錄是我們要訪問文件的路徑名的一個組成部分時,對該目錄的執行權限使我們可通過該目錄,
也就是搜索該目錄,尋找一個特定的文件名。如果PATH環境變量指定了一個我們不具有執行權限的目錄,
那么shell決不會在該目錄找到可執行文件。
c.為了在一個目錄中創建一個新文件,必須對該目錄具有寫權限和執行權限。
d.為了刪除一個現有文件,必須對包含該文件的目錄具有寫權限和執行權限。對該文件本身不需要有讀,寫權限。
e.進程每次打開,創建或刪除一個文件時,內核就進行文件訪問權限測試:
1.若進程的有效用戶ID是0(超級用戶),則允許訪問,給予超級用戶對整個文件系統進行處理的最充分的自由。
2.若進程的有效用戶ID等于文件的所有者ID(即該進程擁有此文件),那么,若所有者適當的訪問權限位被設置,則允許訪問。
3.若進程的有效組ID或進程的附加組ID之一等于文件的組ID,那么,若組適當的訪問權限位被設置,則允許訪問,否則拒絕。
4.若其他用戶適當的訪問權限位被設置,則允許訪問,否則拒絕。
按順序執行以上四步。若進程擁有此文件,則按用戶訪問權限批準或拒絕該進程對文件的訪問——不查看組訪問權限。類似地,若進程
并不擁有該文件,單進程屬于某個適當的組,則按組訪問權限批準或拒絕該進程對文件的訪問——不查看其他用戶的訪問權限。
三.新文件和新目錄
1.權限問題:如果是文件,默認是以0666和umask按位相減得到文件各用戶的權限。如果是目錄,默認是0777和umask
按位相減得到。
2.所有權問題:新文件的用戶ID設置為進程的有效用戶ID。關于組ID,有兩種選擇:
a.新文件的組ID可以是進程的有效組ID。
b.新文件的組ID可以是它所在目錄的組ID。
四.access函數
作用:按實際用戶ID和實際組ID進行訪問權限測試。
頭文件:include
用法:int access(const char *pathname,int mode)
返回值:若成功則返回0,若出錯則返回-1。
mode:R_OK 測試讀權限;W_OK 測試寫權限;X_OK 測試執行權限;F_OK 測試文件是否存在。
五.chmod與fchmod函數
作用:更改現有文件的權限
頭文件:#include
用法:int chmod(const char *pathname,mode_t mode);
int fchmod(int filedes,mode_t mode);
返回值:若成功返回0,若出錯返回-1。
注意:為改變一個文件的權限位,進程的有效用戶ID必須等于文件的所有者ID,或者該進程必須具有超級用
戶權限。
六.文件截短函數truncate與ftruncate
作用:在文件尾端處截去一些數據以縮短文件。
頭文件:#include
用法:int truncate(const char *pathname,off_t length);
int ftruncate(int filedes,off_t length);
返回值:若成功返回0,否則返回-1。
注意:如果length 大于文件長度,則在文件末尾加'\0',并改變文件大小;若length 小于文件長度,
則在文件末尾截掉多出的部分。
七.文件系統(補充)
1.每個文件系統各自對它們的i節點編號,因此目錄項中的i節點編號數指向同一文件系統中相應的i節點,不能使
一個目錄項指向另一個文件系統的i節點。
2.當在不更換文件系統情況下為一個文件更名時,該文件的實際內容并未移動,只需構造一個指向現有i節點新目錄項
并解除與舊目錄項的鏈接。
八.link,unlink,remove函數
1.link:相當與創建一個現有文件的硬鏈接
頭文件:#include
用法:int link(const char *existingpath,const char *newpath)
返回值:如果newpath 存在則返回出錯-1,成功則為0。
注意:如果實現支持創建指向一個目錄的硬鏈接,那么也僅限于超級用戶才可以這樣做,
理由是這樣做可能在文件系統中形成循環,因此很多文件系統實現不允許對目錄的硬鏈接。
2.unlink:刪除一個現有的目錄項
頭文件:#include
用法:int unlink(const char *pathname);
返回值:成功返回0,否則-1。
注意:為了解除對文件的鏈接,必須對包含該目錄項的目錄具有寫和執行的權限。且必須具備
三個條件之一:擁有該文件;擁有該目錄;具有超級用戶特權。如果pathname是符號鏈接,
那么unlink刪除該符號鏈接,而不會刪除由該鏈接所引用的文件。給出符號鏈接名情況下,
沒有一個函數能刪除由該鏈接所引用的文件。
3.remove:解除對一個文件或目錄的鏈接。
頭文件:#include
用法:int remove(const char *pathname);
返回值:成功返回0,否則返回-1.
注意:對于文件,remove的功能與unlink相同。對于目錄,remove的功能與rmdir相同。
總結
以上是生活随笔為你收集整理的linux查看目录访问权限,Linux文件访问权限的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle raw性能,对Oracle
- 下一篇: linux查看某端口进程占用,Linux