1.访问权限
一个文件有9个权限位,由左往右:所有者读,写,执行位;所有者所在组的用户读,写,执行位;其他用户读,写,执行位。
linux提供了测试宏判断指定的权限位是否具有权限。方法是使用st_mode域与相应的宏进行位与操作。
st_mode测试宏 宏的八进制值 意义
S_IRUSR 0400 用户读
S_IWUSR 0200 用户写
S_IXUSR 0100 用户执行
S_IRGRP 0040 组读
S_IWGRP 0020 组写
S_IXGRP 0010 组执行
S_IROTH 0004 其他用户读
S_IWOTH 0002 其他用户写
S_IXOTH 0001 其他用户执行
如要判断组用户是否有对该文件的读权限,可用如下方法:
……
if(buf.st_mode&S_IRGRP !=0)
printf("user of the group can read./n");
else
printf("user of the group can't read./n");
2.设置用户ID位和设置组ID位
文件权限位中有两个特殊的表示位,分别设置用户ID位和设置组用户ID位。
设置用户ID和设置组ID是这两个表示位的名称,这是两个名词。
文件的设置用户ID位和设置组ID为,可以使进程的有效用户ID和有效组ID等同于文件所欲者的用户ID和组ID,也就是说可以使得进程拥有等同于文件所有者的权限。进程的用户ID和组ID在调用exec函数时改变,因此,设置用户ID位和设置组ID为只对可执行文件起作用。
linux提供宏判断设置用户ID位和设置组ID位是否被设置。方法是使用st_mode域与相应的宏进行位的与操作。
st_mode测试宏 宏的八进制值 意义
S_ISUID 04000 设置用户ID
S_ISGID 02000 设置组ID
3.设置用户ID位的作用
使得执行设置了用户ID位的可执行文件的进程拥有该文件所有者一样的权限。即如果该执行文件是root用户的,里面拥有一些只有root用户才能进行的操作。如果该文件所有者root设置了该文件的设置用户ID位,则执行该文件的进程也拥有了root权限,也能正确执行该文件。
4.实例
假设root.txt是只有根用户才能写的文件,root_write程序在运行的时候可以使进程拥有根用户的权限,完成对root.txt的写操作。该程序首先确定改程序本身的执行文件是否设置了设置用户ID位。是则继续,否则退出。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define MAX 1024
int main(int argc, char *argv[ ])
{
int sfd, dfd;
struct stat statbuf;
char buf[MAX];
int n;
if(stat(argv[0], &statbuf) == -1){ /* 取得执行程序文件的状态信息 */
perror("fail to stat");
exit(1);
}
if(statbuf.st_mode & S_ISUID != 0) /* 测试组用户是否设置了"设置用户ID"位 */
printf("set user id/n");
else{
printf("can’t write to root.txt/n");
exit(1);
}
if((sfd = open("test.txt", O_RDONLY)) == -1){ /* 打开源文件,里面由需要写到root.txt中的内容 */
perror("fail to open");
exit(1);
}
if((dfd = open("root.txt", O_WRONLY)) == -1){ /* 打开root.txt文件 */
perror("fail to open");
exit(1);
}
while((n = read(sfd, buf, MAX)) >0){ /* 将sfd文件中的内容写到dfd文件中去 */
if(write(dfd, buf, n) == -1){
perror("fail to write");
exit(1);
}
}
if(n < 0){ /* 如果因为read函数返回-1而跳出循环,则说明read函数出错 */
perror("fail to read");
exit(1);
}
printf("done/n"); /* 输出提示信息 */
return 0;
}