文件管理--文件权限

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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值