文件访问控制列表facl

[root@bogon code]# getfacl a.c  //获取文件a.c的文件访问控制列表
# file: a.c
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root@bogon code]# getfacl --omit-header a.c    //忽略前面文件名,属主,属组
user::rw-
group::r--
other::r--

[root@bogon code]# setfacl -m u:bp:wr,g:bp:wr a.c   //设置文件访问控制列表,-m修改,bp用户名,用户组,如果增加-R选项会对目录树递归修改facl
[root@bogon code]# getfacl a.c
# file: a.c
# owner: root
# group: root
user::rw-
user:bp:rw-
group::r--
group:bp:rw-
mask::rw-
other::r--

[root@bogon code]# getfacl --omit-header a.c
user::rw-
user:bp:rw-
group::r--
group:bp:rw-
mask::rw-
other::r--

[root@bogon code]# ls -l a.c    //a.c权限后面会多一个加号
-rw-rw-r--+ 1 root root 326 May 29 02:48 a.c
[root@bogon code]# setfacl -x u:bp,g:bp a.c //-x删除记录
[root@bogon code]# getfacl a.c
# file: a.c
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

默认acl和文件创建

[root@bogon code]# mkdir bp
[root@bogon code]# setfacl -d -m u::rwx,u:bp:rx,g::rwx,g:bp:wrx,o::-  bp    //-d目录acl,给文件夹设置facl,则在该文件夹下新建文件和目录,会默认设置该facl
[root@bogon code]# getfacl -d --omit-header bp  
user::rwx
user:bp:r-x
group::rwx
group:bp:rwx
mask::rwx
other::---

[root@bogon code]# cd bp
[root@bogon bp]# ls
[root@bogon bp]# echo "linux">a.txt
[root@bogon bp]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:bp:r-x         #effective:r--
group::rwx          #effective:rw-
group:bp:rwx            #effective:rw-
mask::rw-
other::---

[root@bogon bp]# 

acl相关函数

#include<acl/libacl.h>
#include<sys/acl.h>
//将文件的acl读入内存
acl_t acl;
acl=acl_get_file(pathname,type)//type的值可以为ACL_TYPE_ACCESS或者ACL_TYPE_DEFAULT

//从内存acl中获取记录
acl_entry_t entry;
status=acl_get_entry(acl,entry_id,&entry)//entry_id的值可以为ACL_FIRST_ENTRY或者ACL_NEXT_ENTRY,该函数可用于遍历acl的所有记录

//获取并修改acl记录中的属性
acl_tag_t tag_type;
status=acl_get_tag_type(entry,&tag_type);//获取
status=acl_set_tag_type(entry,tag_type);//设置
tag_type的值可以为ACL_USER_OBJ,ACL_USER,ACL_GROUP_OBJ,ACL_GROUP,ACL_OTHER,ACL_MASK

//获取和修改acl记录中的标记限定符
uid_t *qualp;
qualp=acl_get_qualifier(entry);
status=acl_set_qualifier(entry,qualp);

//获取和修改ace中的权限集合
acl_permset_t permset;
status=acl_get_permset(entry,&permset);
status=acl_set_permset(entry,permset);
int is_set;
is_set=acl_get_perm(permset,perm);//perm可指定为ACL_READ,ACL_WRITE,ACL_EXECUTE
status=acl_add_perm(permset,perm);
status=acl_delete_perm(permset,perm);
status=acl_clear_perms(permset);//删除所有记录

//创建和删除ace
acl_entry_t entry;
status=acl_create_entry(&acl,&entry);
status=acl_delete_entry(acl,entry);

//更新文件acl,将驻留在内存中acl内容来更新磁盘上的acl
int status;
status=acl_set_file(pathname,type,acl);

//acl在内存和文本格式之间的转换
acl=acl_from_text(acl_string)   将字符串转换为内存acl
char *str;
ssize_t len;
str=acl_to_text(acl,&len)       将内存acl转换为字符串,成功返回字符串长度

有时间我再添加实际例子(毕竟我现在也没怎么搞懂这个)

posted on 2017-10-25 18:06  标配的小号  阅读(371)  评论(0编辑  收藏  举报

导航