|
在Linux系统中不仅仅有文件,还有用来给文件分类目录,也就是常说的文件夹。文件夹也有对应的读写和执行权限。 目录读权限:可以列出目录下的文件,如使用ls命令查看文件夹下有哪些文件。 目录写权限:可以在目录下创建和删除文件或者文件夹。 目录执行权限:可以在目录下执行程序或者脚本,但无法查看文件夹下有哪些可执行文件。 针对执行权限,下面来做一个测试,使用root用户创建一个05_elf2_cmddemo_directory文件夹,赋予一个711权限,并在文件夹下创建test.sh文件,文件功能为执行时会打印“hello world!” 现在切回elf用户进入05_elf2_cmddemo_directory文件夹中开始测试。 $ ls ls: cannot open directory '.': Permission denied $ ./test.sh hello world! |
|
可以看到在执行ls命令时无法列出05_elf2_cmddemo_directory文件夹下的内容,但是如果知道此文件夹下有哪些可执行文件可以直接手打出来执行。如上图的操作,执行成功,并打印出“hello world!”。 access用于检查进程对指定文件或目录的访问权限的系统调用。它可以检查文件是否存在以及当前用户是否具有某种权限(如读、写或执行权限)。 1.头文件 #include <unistd.h> 2.函数原型 int access(const char *pathname, int mode); 3.参数 1)pathname:指向要检查的路径名的指针。 2)mode:表示要检查的访问权限的类型,它可以是以下值的组合: ⚫F_OK: 检查文件是否存在。 ⚫R_OK: 检查是否具有读取权限。 ⚫W_OK: 检查是否具有写入权限。 ⚫X_OK: 检查是否具有执行权限。 除了以上单个使用,也可以使用“|”进行组合使用,如: ⚫R_OK | W_OK: 检查读取和写入权限。 ⚫R_OK | X_OK: 检查读取和执行权限。 4.返回值 成功返回0,失败返回-1。需要注意的是,如果使用组合使用,只要其中一项不通过,就会返回-1. 5.示例:(使用access检查文件权限) #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(){ const char *file="file_rw.txt"; int res=0; printf("flie name:%s\n",file); res = access(file, F_OK); if (res == 0) printf("File exists: OK\n"); else { printf("File exists: NO\n"); exit(0); } res = access(file, R_OK); if (res == 0) printf("Read permission: OK\n"); else printf("Read permission: NO\n"); res = access(file, W_OK); if (res == 0) printf("Write permission: OK\n"); else printf("Write permission: NO\n"); res = access(file, X_OK); if (res == 0) printf("Execution permission: OK\n"); else printf("Execution permission: NO\n"); exit(0); } |
6.创建测试文件并改修权限为766,增加读写权限 $ touch file_rw.txt $ chmod 643 file_rw.txt $ ll file_rw.txt -rw-r---wx 1 elf forlinx 0 8月 23 15:56 file_rw.txt* |
7.测试结果 $ ./access_test flie name:file_rw.txt File exists: OK Read permission: OK Write permission: OK Execution permission: NO |
可以看到文件的执行结果,打印出了测试文件名为file_rw.txt,测试文件存在且有读写权限,并没有执行权限。 chmod用于更改文件或目录的权限。 1.头文件 #include <sys/stat.h> 2.函数原型 int chmod(const char *pathname, mode_t mode); 3.参数 pathname:指向要检查的路径名的指针。 mode:一个表示新权限的模式值,通常是一个整数,它使用位掩码的形式来表示。 这里的mode值可以参考文件权限章节开头的表格。这里需要说明的是这些权限可以使用位运算符组合起来。如: mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP 4.返回值 成功返回0,错误返回-1。 5.示例:(使用chmod函数更改文件权限) #include <stdio.h> #include <sys/stat.h> #include <stdlib.h> void permissions_printf(const char *path) { struct stat file_info; if (lstat(path, &file_info) < 0) { exit(EXIT_FAILURE); } printf("File: %s\n", path); printf("Permissions: "); printf((S_ISDIR(file_info.st_mode)) ? "d" : "-"); printf((file_info.st_mode & S_IRUSR) ? "r" : "-"); printf((file_info.st_mode & S_IWUSR) ? "w" : "-"); printf((file_info.st_mode & S_IXUSR) ? "x" : "-"); printf((file_info.st_mode & S_IRGRP) ? "r" : "-"); printf((file_info.st_mode & S_IWGRP) ? "w" : "-"); printf((file_info.st_mode & S_IXGRP) ? "x" : "-"); printf((file_info.st_mode & S_IROTH) ? "r" : "-"); printf((file_info.st_mode & S_IWOTH) ? "w" : "-"); printf((file_info.st_mode & S_IXOTH) ? "x" : "-"); printf("\n"); } int main(){ const char *file = "chmod_file.txt"; mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWOTH; printf("Source Permissions\n"); permissions_printf(file); chmod(file, mode); printf("\nChange Permission:\n"); permissions_printf(file); } |
6.测试结果 Source Permissions File: chmod_file.txt Permissions: -rw-r--r-- Change Permission: File: chmod_file.txt Permissions: -rwxr---w- |
可以看到修改的文件名称为chmod_file.txt,原权限为文件拥有者有读写权限,同组用户有读权限,其他用户也是读权限。修改后变为文件拥有者有读写执行权限,同组用户支持读权限,其他用户支持写权限。
|