Linux 命令速查
文件管理 man access

access

检查进程对文件的访问权限(系统调用)

返回

补充说明

access 不是独立的 shell 命令,而是 POSIX 定义的 C 库函数与 Linux 系统调用,声明在 <unistd.h> 中,用于判断调用进程能否访问指定文件。它按进程的真实 UID/GID 检查权限,因此常被 setuid 程序用来确认发起调用的普通用户是否真的有权读取某个文件。

部分命令速查表把 access 列在“文件操作命令”里,但系统中通常没有同名的可执行文件;在脚本里可用 test -r、test -w、test -x 达到类似目的。真正的 access() 调用返回 0 表示允许,返回 -1 并设置 errno 表示失败。

该检查存在 TOCTOU(检查与使用之间时间差)风险:不要先 access() 再 open() 来做安全授权,正确做法是直接打开文件并处理失败。

语法

#include <unistd.h>

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

mode 可取 F_OK(是否存在)或 R_OK、W_OK、X_OK 的按位或。

选项

  • F_OK:仅检查文件是否存在
  • R_OK:检查读权限
  • W_OK:检查写权限
  • X_OK:检查执行权限

实例

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main(int argc, char **argv)
{
    if (argc != 2) {
        fprintf(stderr, "用法: %s <文件>\n", argv[0]);
        return 1;
    }

    /* 检查文件是否存在且可读 */
    if (access(argv[1], F_OK | R_OK) == 0)
        printf("%s 存在且可读\n", argv[1]);
    else
        printf("无法访问 %s: %s\n", argv[1], strerror(errno));

    return 0;
}

编译并运行:

cc check_access.c -o check_access
./check_access /etc/passwd

参考链接