如何检查用户是否具有执行权限?

3

我希望知道如何检查“用户”(非运行此程序的用户)是否对文件具有执行权限?[ C API ]

我查看了“access”,它提供关于调用者的信息。

我正在寻找类似于:

"<cmd> <user_name> <file_name>"

我正在尝试获取<user_name>是否对<file_name>具有执行权限?

我正在寻找C API?

可能的解决方案:我正在使用以下算法来获取此信息。

boolean_t
is_user_has_execute_permissions(char *run_as_user)
{
        /* Check world execute permission */
        if ((cmd_stat.st_mode & S_IXOTH) == S_IXOTH) {
                return (TRUE);
        }

        /* group id for run_as_user */
        getpwnam_r(run_as_user, &pw, buf, passwd_len);

        /* Check group execute permission */
        if ((cmd_stat.st_mode & S_IXGRP) == S_IXGRP) {
                if (pw->pw_gid == cmd_stat.st_gid)
                        return (TRUE);
        }

        return (FALSE);
}

有人看到这个有错误吗?


1
@Arpit Bash解决方案可行吗? - Eitan T
3
如果您的进程可以作为root运行,那么最可靠的方法可能就是使用setuid()切换到相关用户并调用euidaccess()。您可以尝试自己检查权限,但还存在更复杂的情况,如ACL或通过SELinux进行的其他访问策略。 - FatalError
3
是的,UNIX自主访问控制模型有些简单。虽然使用stat和系统用户数据库很容易确定权限,但实际情况可能更加复杂。最好只是处理访问文件时出现的错误。 - fork0
2
@Arpit:不,你的代码是错误的。你必须按照从具体到更一般的检查方式进行移动:uid、然后是组,再然后是其他人。否则,你会错过例如文件所有者为自己删除x位的情况。 - fork0
2
@Arpit:这不是基本权限的工作方式。它们按照用户、组和其他人的顺序进行检查。首先适用的权限将被使用。您可以通过创建一个文件,然后使用“chmod u-r file”来检查此功能。即使其他人有读取权限,您也没有。 - FatalError
显示剩余6条评论
2个回答

2

您需要使用调用stat(2)函数,该函数返回文件的拥有者、拥有组和其他人的权限位。然后,您需要找出所需用户的ID并获取其所在的组:请参阅getpwent(3)和getgrouplist(3)函数。第一个匹配的组将提供结果的权限。


1
记录一下:测试当前用户要容易得多:access(1) - fork0
1
哎呀...access(2),那是一个系统调用。 - fork0
4
stat(2)的功能不足。Linux和Solaris都支持POSIX文件ACL。 - Hristo Iliev
是的,请参考上面@FatalError的评论。为了支持所有可用的访问控制(UNIX、SELinux、TOMOYO、Yama,不包括官方内核中不存在的那些),这将使解决方案变得非常复杂,甚至不可能。 - fork0
access(2)和euidaccess(2)可以与它们一起使用。假设您在系统上拥有root权限,@FatalError的建议可能是最方便的。 - fork0

-1

从命令行,您可以轻松地使用 Awk 程序。例如:

ls -l filename | awk -F '{ if (substring($1,3,1) == "x" exit(0); exit(1)}'

如果找到了,将返回代码设置为0,如果没有找到,则返回1。

从C程序中,您想要使用fstat。基本上,您需要打开文件。

int fd = fopen("filename", "r");

然后使用fstat获取文件状态块

fstat(fd, &bufr)

看看 bufr.st_mode

这里有一个 fstat 的描述。

更新

我要抱怨一下,当原始发布者最初提交时,并不清楚需要 C API。


谢谢,但我正在寻找这个的C API。 - Arpit
1
@CharlieMartin 我认为 OP 想要检查 另一个用户 的访问权限(而不是当前用户)。 - Eitan T
那又怎样?fstat函数返回文件的权限,它并不关心用户。st_uid是所有者的用户ID,请使用它。 - Charlie Martin
3
这太糟糕了,你只需要在shell部分使用[ -x filename ],在C部分使用access(2)。更不用说你还没有回答问题中的“其他用户”部分。 - cha0site

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接