补充说明
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