zoukankan      html  css  js  c++  java
  • UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限

    lienhua34
    2014-09-03

    通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID。但有时我们需要知道当前登录用户对某个文件访问权限。虽然说进程的有效用户 ID 和有效组 ID 通常分别等于当前登录用户 ID 和用户所在组 ID。例如,一个进程可能因设置用户 ID 以另一个用户权限运行,它仍可能想验证当前实际登录的用户是否能否访问一个给定的文件。

    access 函数提供了按照实际用户 ID 和实际组 ID 进行访问权限测试的功能。其校验步骤跟之前说的内核校验步骤一致,只是将“有效”改成了“实际”。

    #include <unistd.h>

    int access(const char *pathname, int mode);

    返回值:若成功则返回0,若出错则返回-1.

    其中,mode 是表 1 中所列常量的按位或。

    表 1: access 函数的 mode 常量,取自 <unistd.h>
    mode 说明
    R_OK 测试读权限
    W_OK 测试写权限
    X_OK 测试执行权限
    F_OK 测试文件是否存在

    例子:

    下面程序测试当前登录用户对命令行第一个参数是否具有读权限,然后以只读的方式打开该文件。

    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    int   
    main(int argc, char *argv[])
    {
        if (argc != 2) {
            printf("usage: accessdemo <pathname>");
            exit(-1);
        }
        if (access(argv[1], R_OK) < 0) {
            printf("access error for %s: %s
    ", argv[1], strerror(errno));
        } else {
            printf("read access OK
    ");
        }
        if (open(argv[1], O_RDONLY) < 0) {
            printf("open error for %s: %s
    ", argv[1], strerror(errno));
        } else {
            printf("open for reading OK
    ");
        }
        exit(0);
    }

    编译该程序,生成 accessdemo,然后运行该程序,

     1 lienhua34:demo$ gcc -o accessdemo accessdemo.c
     2 lienhua34:demo$ ls -l accessdemo
     3 -rwxrwxr-x 1 lienhua34 lienhua34 7400 9月 1 21:29 accessdemo
     4 lienhua34:demo$ ./accessdemo accessdemo
     5 read access OK
     6 open for reading OK
     7 lienhua34:demo$ ls -l /etc/shadow
     8 -rw-r----- 1 root shadow 1143 4月 6 19:27 /etc/shadow
     9 lienhua34:demo$ ./accessdemo /etc/shadow
    10 access error for /etc/shadow: Permission denied
    11 open error for /etc/shadow: Permission denied
    12 lienhua34:demo$ su
    13 # chown root accessdemo
    14 # chmod u+s accessdemo
    15 # ls -l accessdemo
    16 -rwsrwxr-x 1 root lienhua34 7400 9月 1 21:29 accessdemo
    17 # exit
    18 exit
    19 lienhua34:demo$ ./accessdemo /etc/shadow
    20 access error for /etc/shadow: Permission denied
    21 open for reading OK

    我们来分析一下上面的运行命令序列及其结果。

    1. 起先,文件 accessdemo 的所有者是 lienhua34(当前登录用户),运行./accessdemo acessdemo 时,进程的实际用户和有效用户都是lienhua34,则 access 函数和 open 函数都能够成功。(第1到6行)

    2. 文件/etc/shadow 的所有者是 root,且其只允许 root 用户读取。此时运行./accessdemo /etc/shadow,进程的实际用户的有效用户都是 lienhua34,则 access 函数和 open 函数都失败了。(第7到11行)

    3. 切换后超级用户 root,将文件 accessdemo 的所有者修改为超级用户root(运行命令chown root accessdemo,并设置文件 accessdemo 的设置用户 ID 位(运行命令chmod u+s accessdemo)。(第12到18行)

    4. 切换后当前登录用户 lienhua34,此时运行./accessdemo /etc/shadow,进程的实际用户为 lienhua34,但有效用户为超级用户 root(因文件accessdemo 的所有者为 root 且设置了设置用户 ID 位)。此时 access函数校验当前登录用户 lienhua34 对文件/etc/shadow 读权限失败,但open 函数却能够打开文件/etc/shadow(内核用进程的有效用户 ID进行访问权限校验)。(第19到21行)

    (done)

  • 相关阅读:
    【arm】using as: GNU assember学习笔记
    【linux】gcc编译选项:-fomit-frame-pointer,-fno-tree-vectorize,-fno-strict-aliasing以及ARM相关选项
    【arm】armv8中通用寄存器的饱和指令实现(对标arm32:ssat,usat,qadd,qsub)
    【shell】常用的几种shell解释器:sh,bash,zsh,ash,csh
    【linux/Tools】Performance Profile Tools——perf and gprof
    【android】如何查看Android设备的CPU架构信息
    【arm】big-LITTLE architecture and How to check core, frequency, features of CPU and memory infos
    【python】创建excel文档.csv
    【mpeg4】MPEG-4 B帧帧间预测模式
    【linux】关于find命令查找的排序规则探索以及排序方法
  • 原文地址:https://www.cnblogs.com/lienhua34/p/3954540.html
Copyright © 2011-2022 走看看