【问题标题】:access(2) vs stat(2) to check if a file is executableaccess(2) vs stat(2) 检查文件是否可执行
【发布时间】:2016-07-11 11:11:03
【问题描述】:

我发现使用 stat 和 access 来检查文件是否可执行可能会产生不同的结果。谁能给我解释一下这两种方法的区别?

使用 C:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>           /* Definition of AT_* constants */
#include <assert.h>
int main(){
    const int access_ret = access("start.r",X_OK);
    const int eaccess_ret = eaccess("start.r",X_OK);
    const int faccessat_ret=faccessat(AT_FDCWD,"start.r",X_OK,AT_EACCESS);
    printf("%d,\t%d,\t%d",access_ret, eaccess_ret, faccessat_ret);
}

使用 bash:

$ stat start.r
  File: 'start.r'
  Size: 2769            Blocks: 8          IO Block: 4096   regular file
Device: 29h/41d Inode: 58066679    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/      ci)   Gid: (  100/   users)
Access: 2016-03-22 22:29:31.234892605 -0400
Modify: 2010-08-06 03:40:03.000000000 -0400
Change: 2016-02-28 20:39:10.244094828 -0500
 Birth: -
$ [[ -x start.r ]]; echo $?
0

使用python:

$  python3 -c '
> import os
> print(oct(os.stat("start.r").st_mode))
> print(os.access("start.r",os.X_OK,effective_ids=False))
> print(os.access("start.r",os.X_OK,effective_ids=True))
> '
0o100644
True
True

【问题讨论】:

  • 在我对 perms 644 的本地文件进行的测试中,我从您的[[ ...]]; echo $? 测试中得到了1(正如我们俩所期望的那样)。也许用 uname ; echo $SHELL 的结果编辑你的 q ?祝你好运!
  • @shellter 我有一些行为异常的文件。 $ uname ; echo $SHELL Linux /bin/bash

标签: python linux bash permissions


【解决方案1】:

如果您的应用程序以 setuid 或 setgid 权限运行,您会注意到不同之处。 access(2) 手册页告诉我们:

使用调用进程的真实 UID 和 GID 进行检查, 而不是实际尝试时所做的有效 ID 文件上的操作(例如,open(2))。同样,对于 root 用户, 检查使用允许的能力集合而不是集合 有效能力;对于非 root 用户,检查使用 空的功能集。

stat(2) 调用不受影响,只提供实际的文件系统权限。

这两个例子是等价的:它们都返回一个“成功”代码。 $?中的0退出状态为成功,而python的True也反映成功。

但是从例子中有一点不清楚:文件的权限没有执行

Access: (0644/-rw-r--r--)

也许该文件应用了一些 ACL,从而产生了这个结果。如果是这样,您将能够使用getfacl 看到这一点。 OP 应该提出一个新问题,并提供此信息作为背景。

进一步阅读:

【讨论】:

  • 有效ID的解释好像没有解释,请看我编辑的问题
  • 我已经意识到了,这就是我说“不清楚”的中间原因。扩展权限似乎是调查的地方。
  • 看起来没有扩展权限。 ` $ getfacl start.r # file: start.r # owner: someuser # group: users user::rw- group::r-- other::r-- ` BTW,文件在encfs上。
  • 也许某些东西正在查看文件的内容,而不是stat 显示的权限来决定它是否可执行。我已经看到使用 OS/2 和 Windows 完成了...
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多