setfacl命令可以用来细分linux下的文件权限。
chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。
换句话说,setfacl可以更精确的控制权限的分配。
比如:让某一个用户对某一个文件具有某种权限。
这种独立于传统的u,g,o的rwx权限之外的具体权限设置叫ACL(Access Control List)
ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。
如,某一个文件,不让单一的某个用户访问。
setfacl 参数
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X … } file …
-m, –modify=acl modify the current ACL(s) of file(s)
-M, –modify-file=file read ACL entries to modify from file
-x, –remove=acl remove entries from the ACL(s) of file(s)
-X, –remove-file=file read ACL entries to remove from file
-b, –remove-all remove all extended ACL entries
-k, –remove-default remove the default ACL
–set=acl set the ACL of file(s), replacing the current ACL
–set-file=file read ACL entries to set from file
–mask do recalculate the effective rights mask
-n, –no-mask don’t recalculate the effective rights mask
-d, –default operations apply to the default ACL
-R, –recursive recurse into subdirectories
-L, –logical logical walk, follow symbolic links
-P, –physical physical walk, do not follow symbolic links
–restore=file restore ACLs (inverse of `getfacl -R’)
–test test mode (ACLs are not modified)
-v, –version print version and exit
-h, –help this help text
setfacl命令可以用来细分linux下的文件权限。
chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。
换句话说,setfacl可以更精确的控制权限的分配。
比如:让某一个用户对某一个文件具有某种权限。
获取用户属性:
if u, err := user.Current(); err == nil {
fmt.Println(“用户ID: “ + u.Uid)
fmt.Println(“主组ID: “ + u.Gid)
fmt.Println(“用户名: “ + u.Username)
fmt.Println(“主组名: “ + u.Name)
fmt.Println(“家目录: “ + u.HomeDir)
}
https://gist.github.com/nelstrom/4988643
网站是以_www的用户运行的,而我在本地是以liuwencan的用户编辑的。这就带来一个问题:如果所有文件属于liuwencan,那么网站运行需要写文件时就因无权限而失败;如果所有文件属于_www,那么liuwencan则需要sudo获取权限才能写进去。最郁闷的是使用git合并的时候,如果忘了加sudo,就会因权限不足提示大量的合并失败,需要先回滚,再重合并下,甚是不爽。
这个问题,在标准LINUX下,是可以用setfacl/getfacl做ACL控制解决此问题,但是MAC OS X上并没有这两个命令。百度了OS X ACL半天得到的不是打不开就是跟问题不搭边,最后去查看这些打不开的页面的快照(快照啊,找得是多蛋疼),找到了答案。
MAC OS X上使用chmod +a增加ACL权限, chmod -a删除ACL权限,ls -le查看ACL权限。
要解决上面提到的问题,执行以下两条命令修改网站根目录的扩展权限即可(www是我网站根目录名称,注意-R参数必须有,将www下面的所有文件也一并设置):
$sudo chmod -R +a ‘liuwencan allow write,delete,file_inherit,directory_inherit,add_subdirectory’ www
$sudo chmod -R +a ‘_www allow write,delete,file_inherit,directory_inherit,add_subdirectory’ www
执行以下命令确认权限设置有成功:
$ls -le #以下为命令输出,对比可确认权限设置符合预期
total 0
drwxr-xr-x+ 37 liuwencan staff 1258 8 5 10:04 www
0: user:liuwencan allow add_file,delete,file_inherit,directory_inherit,add_subdirectory
1: user:_www allow add_file,delete,file_inherit,directory_inherit,add_subdirectory
chmod -R +a ‘didi allow write,delete,file_inherit,directory_inherit,add_subdirectory,execute’ /Users/didi/goLang/src/github.com/xiazemin/cgi/gocgi/cgi/