【问题标题】:How can I check to see if user has execute permissions?如何检查用户是否具有执行权限?
【发布时间】:2012-07-07 17:04:32
【问题描述】:

我想知道如何检查“用户”(运行此程序的人除外) 对文件有执行权限? [C api]

我查看了“访问”,它提供了有关调用者的信息。

我正在寻找类似的东西:-

"<cmd> <user_name> <file_name>"

这里我想知道&lt;user_name&gt; 是否有&lt;file_name&gt; 的执行权限?

我在找 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);
}

有人看到这个有什么错误吗?

【问题讨论】:

  • @Arpit bash 中的解决方案可以接受吗?
  • 如果您的进程可以以 root 身份运行,那么最可靠的方法可能就是向相关用户发送setuid() 并致电euidaccess()。您可以尝试自己检查权限,但还有更复杂的场景,例如 ACL 或其他访问策略(例如通过 SELinux)。
  • 是的,UNIX 自主访问控制模型有些简单。虽然使用 stat 和 system 用户数据库很容易找出权限,但实际情况可能要复杂得多。你最好只处理访问文件的错误
  • @Arpit:不,你的代码错了。您必须从特定检查转移到更一般的检查:uid,而不是组,而不是其他检查。否则,您会错过例如文件所有者为自己删除 x 位的情况。
  • @Arpit:这不是基本权限的工作方式。它们按用户、组、其他的顺序进行检查。以先适用者为准。您可以通过创建一个文件然后chmod u-r file 来检查这一点。即使其他人有读取权限,您也没有。

标签: c linux unix permissions solaris


【解决方案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的描述。

更新

我会胡思乱想地指出,当最初发布 OP 时,并不清楚 C API 是否是所需的。

【讨论】:

  • 谢谢,但我正在为此寻找 C API。
  • @CharlieMartin 我认为 OP 想要检查 另一个用户(不是当前用户)的访问权限。
  • 所以? fstat 返回文件的权限;它不关心用户。 st_uid 是所有者的 uid;使用它。
  • -1 -- 这太可怕了,你可以对 shell 部分使用 [ -x filename ] 并在 C 部分使用 access(2)。更不用说您还没有回答问题的“其他用户”部分。
【解决方案2】:

您需要调用 stat(2),它返回文件所有者、所有者组和其他人的权限位。比你必须找出你感兴趣的用户的 id 和它的组的 id:见 getpwent(3) 和 getgrouplist(3)。第一个匹配的,将给出结果权限。

【讨论】:

  • 备案:对当前用户进行测试要容易得多:access(1)
  • err... access(2),这是一个系统调用
  • stat(2) 还不够。 Linux 和 Solaris 都支持 POSIX 文件 ACL。
  • 是的,请参阅上面@FatalError 的评论。支持所有可用的访问控制(UNIX、SELinux、TOMOYO、Yama,不包括官方内核中不存在的那些)将使解决方案变得非常复杂,如果不是不可能的话
  • access(2) 和 euidaccess(2) 都可以使用它们。假设您在系统上有 root,@FatalError 的建议可能是最方便的。
猜你喜欢
  • 2013-12-09
  • 2016-04-23
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
相关资源
最近更新 更多