檔案管理 檔案許可權操作

2021-05-02 04:30:33 字數 4578 閱讀 6903

1.測試檔案訪問許可權

#include

定義函式 int access(const char * pathname,int mode);

函式說明 access()會檢查是否可以讀/寫某一已存在的檔案。引數mode有幾種情況組合,r_ok,w_ok,x_ok 和f_ok。r_ok,w_ok與x_ok用來檢查檔案是否具有讀取、寫入和執行的許可權。f_ok則是用來判斷該檔案是否存在。由於access()只作 許可權的核查,並不理會檔案形態或檔案內容,因此,如果一目錄表示為「可寫入」,表示可以在該目錄中建立新檔案等操作,而非意味此目錄可以被當做檔案處理。 例如,你會發現dos的檔案都具有「可執行」許可權,但用execve()執行時則會失敗。

返回值 若所有欲查核的許可權都通過了檢查則返回0值,表示成功,只要有一許可權被禁止則返回-1。

錯誤** eaccess 引數pathname 所指定的檔案不符合所要求測試的許可權。

erofs 欲測試寫入許可權的檔案存在於唯讀檔案系統內。

efault 引數pathname指標超出可訪問記憶體空間。

einval 引數mode 不正確。

enametoolong 引數pathname太長。

enotdir 引數pathname為一目錄。

enomem 核心記憶體不足

eloop 引數pathname有過多符號連線問題。

eio i/o 訪問錯誤。

附加說明 使用access()作使用者認證方面的判斷要特別小心,例如在access()後再做open()的空檔案可能會造成系統安全上的問題。

eg:#include

#include

#include

#include

#include

int main(void)

/* 得到程序的實際使用者id和有效使用者id */

euid = getuid();

euid = geteuid();

/* 列印程序的實際使用者id和有效使用者id */

printf("real id is : %u, effective id is : %u /n", (unsigned int)ruid, (unsigned int)euid);

/* 列印檔案所有者id */

printf("file owner is : %u/n", statbuf.st_uid);

if(access("test.txt", r_ok) == -1)

printf("access successfully/n"); /* 輸出提示資訊 */

if((fd = open("test.txt", o_rdonly)) == -1)

printf("ready to read/n"); /* 輸出提示資訊 */

close(fd); /* 關閉檔案 */

return 0;

}2.使用檔案許可權遮蔽字

unmask許可權遮蔽字,如果設定了相關位,系統在建立檔案時,就會忽略使用者對該位指定的值,而將其設定為0。

#include

#include

定義函式 mode_t umask(mode_t mask);

函式說明 umask()會將系統umask值設成引數mask&0777後的值,然後將先前的umask值返回。在使用open()建立新檔案時,該引數 mode並非真正建立檔案的許可權,而是(mode&~umask)的許可權值。例如,在建立檔案時指定檔案許可權為0666,通常umask值預設為 022,則該檔案的真正許可權則為0666&~022=0644,也就是rw-r--r--返回值此呼叫不會有錯誤值返回。 返回值為原先系統的umask值

3.在程式中使用umask函式

在程式中使用umask函式,不會影響shell環境,但是會影響程式中所有新檔案的許可權設定。

例項://mask.c

#include

#include

#define mask s_irusr | s_irgrp | s_iroth  //遮蔽所有使用者的讀許可權

int main()

int fd;

mode_t mask;

mask=umask(mask);//改變許可權遮蔽字,並將原來的許可權字儲存

printf("the original mask is %s/n",(unsigned int )mask);

/*是新檔案的所有權限位都被設定*/

if((fd=open("test.txt",o_creat,0777)==null)

5.改變乙個開啟檔案的許可權

#include

#include

定義函式 int fchmod(int fildes,mode_t mode);

函式說明 fchmod()會依引數mode許可權來更改引數fildes所指檔案的許可權。引數fildes為已開啟檔案的檔案描述詞。引數mode請參考chmod()。

返回值 許可權改變成功則返回0,失敗返回-1,錯誤原因存於errno。

錯誤原因 ebadf 引數fildes為無效的檔案描述詞。

eperm 程序的有效使用者識別碼與欲修改許可權的檔案所有者不同,而且也不具root許可權。

erofs 欲寫入許可權的檔案存在於唯讀檔案系統內。

eio i/o 訪問錯誤。

範例://fchmod.c

#include

#include

#include

#include

#include

/* 讀操作掩碼,將所有者使用者、組使用者和其它使用者的讀許可權全部新增 */

#define read_mask s_irusr | s_irgrp | s_iroth

/* 寫操作掩碼,將所有者使用者、組使用者和其它使用者的寫許可權全部新增 */

#define write_mask s_iwusr | s_iwgrp | s_iwoth

int main(void)

printf("before changing mode/n"); /* 輸出提示資訊 */

if(fstat(fd, &statbuf) == -1)

if(statbuf.st_mode & s_irusr) /* 所有者使用者具有讀檔案的許可權 */

printf("user can read/n");

if(statbuf.st_mode & s_irgrp) /* 組使用者具有讀檔案的許可權 */

printf("group user can read/n");

if(statbuf.st_mode & s_iroth) /* 其它使用者具有讀檔案的許可權 */

printf("other user can read/n");

printf("/n");

/* 使用寫操作許可權字改變檔案的許可權,

* 改變後檔案的的所有讀許可權消失,

* 取而代之的是所有的寫許可權

*/if(fchmod(fd, write_mask) == -1)

printf("after changing mode/n");

if(fstat(fd, &statbuf) == -1)

printf("check the file by file-descriptor/n");

/* 直接使用該檔案的描述符取得檔案狀態,檢查檔案許可權是否更新 */

if(statbuf.st_mode & s_iwusr) /* 所有者使用者具有寫檔案的許可權 */

printf("user can write/n");

if(statbuf.st_mode & s_iwgrp) /* 組使用者具有寫檔案的許可權 */

printf("group user can write/n");

if(statbuf.st_mode & s_iwoth) /* 其它使用者具有寫檔案的許可權 */

printf("other user can write/n");

printf("/n");

/* 再次從磁碟上取得該檔案的檔案狀態,檢查磁碟上的檔案的許可權是否也已經更新 */

if(stat("test.txt", &statbuf) == -1)

printf("check the file in the disk/n");

/* 磁碟上的檔案許可權也已經更新 */

if(statbuf.st_mode & s_iwusr) /* 所有者使用者具有寫檔案的許可權 */

printf("user can write/n");

if(statbuf.st_mode & s_iwgrp) /* 組使用者具有寫檔案的許可權 */

printf("group user can write/n");

if(statbuf.st_mode & s_iwoth) /* 其它使用者具有寫檔案的許可權 */

printf("other user can write/n");   

printf("/n");

sleep(10); /* 休眠10秒鐘 */

printf("done/n"); /* 列印提示資訊 */

close(fd); /* 檔案關閉,所有緩衝區的內容沖洗到磁碟上 */

return 0;

}

許可權管理 檔案許可權

一.檔案許可權管理之基本許可權 1.基本許可權介紹 r 可讀 4 w 可寫 2 x 可執行 1 許可權歸屬 屬主 u 屬組 g 其他使用者 o rw r r 1 root root 1146 jul 16 18 42 a.txt 檔案型別 檔案屬主許可權 檔案屬組許可權 其他使用者 硬鏈結數 rw ...

檔案許可權管理

檔案許可權管理 檔案屬性 使用ls al可以檢視 修改檔案屬性常用命令 chown 設定檔案的所有者 chgrp 設定檔案的屬組資訊 修改檔案的屬主 chown chown option owner group file.用法 owner owner group group 命令中的冒號可用.替換 ...

檔案許可權管理

1.acl access control list,實現靈活的許可權管理 除檔案的所有者 user 所屬組 group 和其他人 others 之外可以對更對使用者設定許可權 2.centos7磁碟建立xfs和ext4檔案具有acl,之前版本手動建立ext4檔案無acl,需增加 tune2fs o ...