如何检查Linux中的ACL是否存在UID?

我需要编写一个程序,其中一部分涉及检查程序使用的文件的ACL文件中是否存在执行该程序的用户的用户名。 也就是说,这个程序写入文件,只允许在ACL中input用户名和密码的用户这样做。 程序如何检查这个? 我知道我需要使用getresid函数来获取正在执行的进程的RUID,但是如何对存储在ACL中的所有值进行检查? 请帮帮我!

Solutions Collecting From Web of "如何检查Linux中的ACL是否存在UID?"

如果我误解了这个问题,我很抱歉,但是希望你会发现这个问题很有帮助:

来自一些acl文档的 Exceprt:

以下函数检索和操作ACL条目:

 acl_copy_entry() acl_create_entry() acl_delete_entry() acl_first_entry() acl_get_entry() 

以下函数检索和处理ACL条目中的字段:

 acl_add_perm() acl_clear_perm() alc_delete_perm() acl_get_permset() acl_get_qualifier() acl_get_tag_type() acl_set_permset() acl_set_qualifier() acl_set_tag_type() 

ACL条目

ACL条目由以下字段组成:

标签类型(在acl.h头文件中定义):

ACL_USER_OBJ – 拥有的用户条目。

ACL_GROUP_OBJ – 拥有组的条目。

ACL_USER – 其他用户的条目。

ACL_GROUP – 其他组的条目。

ACL_OTHER_OBJ – 不包含在其他条目中的所有用户和组的条目。

标记限定符 – ACL_USER条目的限定符值是用户标识。

ACL_GROUP条目的限定符值是一个组ID。 任何* _OBJ条目的限定符值都是NULL。

从acl_update.c :

 /* Find the the ACL entry in 'acl' corresponding to the tag type and qualifier in 'tag' and 'id'. Return the matching entry, or NULL if no entry was found. */ static acl_entry_t findEntry(acl_t acl, acl_tag_t tag, id_t qaul) { acl_entry_t entry; acl_tag_t entryTag; uid_t *uidp; gid_t *gidp; int ent, s; for (ent = ACL_FIRST_ENTRY; ; ent = ACL_NEXT_ENTRY) { s = acl_get_entry(acl, ent, &entry); if (s == -1) errExit("acl_get_entry"); if (s == 0) return NULL; if (acl_get_tag_type(entry, &entryTag) == -1) errExit("acl_get_tag_type"); if (tag == entryTag) { if (tag == ACL_USER) { uidp = acl_get_qualifier(entry); if (uidp == NULL) errExit("acl_get_qualifier"); if (qaul == *uidp) { if (acl_free(uidp) == -1) errExit("acl_free"); return entry; } else { if (acl_free(uidp) == -1) errExit("acl_free"); } } else if (tag == ACL_GROUP) { gidp = acl_get_qualifier(entry); if (gidp == NULL) errExit("acl_get_qualifier"); if (qaul == *gidp) { if (acl_free(gidp) == -1) errExit("acl_free"); return entry; } else { if (acl_free(gidp) == -1) errExit("acl_free"); } } else { return entry; } } } } 

我不认为你需要检查一个特定文件的ACL,但如果我错了,这里有一些信息要这样做:

 $ getfacl myFile # file: myFile # owner: jon # group: people user::rwx user:foo:rwx group::rwx mask::rwx other::--- 

然后从名字得到一个uid(未经测试,但应该是关闭):

 $ grep /etc/passwd `getfacl myFile | grep owner | split -d":" -f2` | egrep -o "[0-9]+" 

一些更多的资源:

acl / facl例子和参考 人acl

POSIX访问控制列表

statacl

传统上,Linux程序不能很好地解释访问控制。 有两种情况。

案例1,简单的情况。 一个文件有一个acl(或只是模式)。 某些用户在他的用户/组下运行一个程序,内核根据模式/ acl允许或拒绝。 全做完了。

情况2,困难的情况下。 程序以root身份运行,但希望代表其他用户运行。 因此,它调用setuid / setgid来“成为”该用户,然后执行操作(如打开一个文件),然后调用恢复自身到root-itude。

然而,根据你对chown的回答的评论,我认为你只是在情况1.用户foo运行程序,所以内核为你做所有的工作。