zoukankan      html  css  js  c++  java
  • 有效用户、组ID及其实际用户、组ID

    有效用户、组ID及其实际用户、组ID

    代码

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int main(int argc, char* argv[])
    {
            if(argc < 2)
                    printf("error argc!
    ");
            if(access(argv[1],R_OK)<0) 
                    perror("access");
            else
                    printf("access Ok!
    ");
            if(open(argv[1], O_RDONLY)<0)
                    perror("open");
            else
                    printf("open OK
    ");
            return 0;
    }
    

    运行演示1

    [builder@localhost UC]$ ./a.out /etc/shadow
    access: Permission denied
    open: Permission denied
    

    分析

    • access函数验证的a.out进程的实际用户id实际组id/etc/shadow是否有访问权限,此时是以builder用户运行a.out,及进程a.out的实际用户id和实际组id均是builder用户,必然没有访问权限。
    • open函数验证的a.out进程的有效用户id有效组id/etc/shadow是否有访问权限,此时是以builder用户运行a.out,及进程a.out的实际用户id和实际组id均是builder用户,必然没有访问权限。

    运行演示2

    [builder@localhost UC]$ sudo chown root a.out 
    [builder@localhost UC]$ ls -al
    total 16
    drwxrwxr-x. 2 builder builder    31 Sep 22 23:24 .
    drwxrwxr-x. 9 builder builder   110 Sep 22 23:01 ..
    -rwxrwxr-x. 1 root    builder 11272 Sep 22 23:24 a.out
    -rw-rw-r--. 1 builder builder   351 Sep 22 23:22 ID.c
    [builder@localhost UC]$ ./a.out /etc/shadow
    access: Permission denied
    open: Permission denied
    
    • access函数验证的a.out进程的实际用户id实际组id/etc/shadow是否有访问权限,此时是以builder用户运行a.out,及进程a.out的实际用户id和实际组id均是builder用户,必然没有访问权限。
    • open函数验证的a.out进程的有效用户id有效组id/etc/shadow是否有访问权限,此时是以builder用户运行a.out,及进程a.out的实际用户id和实际组id均是builder用户和其所在的组,必然没有访问权限。

    运行演示3

    [builder@localhost UC]$ sudo chown root a.out 
    [builder@localhost UC]$ sudo chmod u+s a.out 
    [builder@localhost UC]$ ls -al a.out 
    -rwsrwxr-x. 1 root builder 11272 Sep 22 23:22 a.out
    [builder@localhost UC]$ ./a.out /etc/shadow
    access: Permission denied
    open OK
    

    分析

    • access函数验证的a.out进程的实际用户id实际组id/etc/shadow是否有访问权限,此时是以builder用户运行a.out,及进程a.out的实际用户id和实际组id均是builder用户,必然没有访问权限。
    • open函数验证的a.out进程的有效用户id有效组id/etc/shadow是否有访问权限,此时是以builder用户运行a.out,但由于设置了文件模式子(st_mode)中设置一个特殊标志,其含义是“当执行此文件时,将进程的有效用户id设置成文件所有者的用户od(st_uid)”。同理组id也有同样的设置方法。在文件模式字中的这两位称为设置用户ID位(set-user-id)设置组ID位(set-group-ID)。此时sudo chmod u+s a.out操作底层相当于设置了用户ID位。及此时的a.out进程的有效用户id时root用户,当然可以访问/etc/shadow文件.

    注:

    • 文件模式字可通过stat(2)获取。

    总结

    • 实际用户ID和实际组ID标识了我们究竟是谁。
    • 有效用户ID和有效组ID以及附属组ID决定了我们对文件的访问权限。
  • 相关阅读:
    事务的隔离级别
    常用linux命令
    cpu.load avg和cpu使用率的区别
    【Leetcode】55. Jump Game
    【Leetcode】322. coin-change
    34.find-first-and-last-position-of-element-in-sorted-array
    【LeetCode】56.merge-intervals
    Leetcode】210.course-schedule-ii
    基于Thread实现自己的定时器Timer
    Boost--内存管理--(1)智能指针
  • 原文地址:https://www.cnblogs.com/DXGG-Bond/p/13717223.html
Copyright © 2011-2022 走看看