五、文件/目录-权限

king's blog
linux下,有个很重要的概念,那就是权限。但对于文件和目录来说,同样是读权限,意义是不同的,本节我们来系统的谈谈linux的权限。本节主要内容如下:
一、文件和目录权限的区别
二、如何查看权限
三、如何修改权限
四、默认权限
五、特殊权限
六、ACL权限


一、文件和目录权限的区别

linux下,文件和目录都有R,W,X的权限,很容易混淆,具体区别如下:

1、文件:文件是存储数据的地方,故RWX是对于数据而言
  • R:表示可读取文件的实际内容
  • W:表示可以编辑、新建或修改文件的内容(但不能删除该文件)
  • X:表示具有可以被系统执行的权限(不是看扩展名)
2、目录:目录主要内容是记录文件名列表,故RWX是对于文件列表而言的
  • R:(Read Contents in directory)表示读取目录结构列表的权限,如可用ls查看
  • W:(Modify contents of directory)表示可以更改目录结构列表的权限,比如:
    创建新的文件和目录
    删除文件和目录(不论该文件的权限为何)
    重命名文件和目录
    转移该目录下的文件、目录位置
  • X:表示可以进入到该目录(重要,一般配合R使用,可参考下面的例子)

二、如何查看权限

可通过ls –l 查看文件和目录的权限,具体解释如下:
linux权限

1
2
3
4
5
6
7
8
①:代表这个文件是目录、文件或链接文件(如  d:代表是目录;-:文件;l:链接文件;b:接口等等)
②:9个字符分3组,分别代表"文件所有者的权限"、"同用户组的权限"、"其他非本用户组的权限"
③:代表有多少文件名连接到此节点(后面章节再讲)
④:代表该文件(或目录)的所有者
⑤:代表该文件(或目录)的所属用户组
⑥:代表文件的容量大小,默认单位为B
⑦:代表该文件的创建日期或最近的修改日期,显示(月/日)及时间。如果修改时间太久,则只显示年份
⑧:代表文件名(或目录名)

关于②中提到的,文件所属的用户和用户组,刚接触linux的朋友可能比较难理解,这里举个例子帮助大家理解。
比如,小张有块手表,同时他所在的班级是一班则
A:手表的所有者属于小张,权限相当于前3个字符;
B:一班的同学和小张是同一班级的,属于同个用户组,权限相当于中间3个字符
C:全校其他班级的同学则属于其他用户组,权限相当于最后3个字符

9个权限字符,具体区分及含义如下:

1
2
3
4
5
6
7
1、权限:
    文件属主(-u):创建该文件的用户
    同组用户(-g):拥有该文件的用户组中的任何用户
    其他用户(-o):即不属于拥有该文件的用户组的某一个用户
    所有用户(-a): 一切的用户
2、除第一个字符外,每3个数字代表一个权限位
    -rwxr-xr-x,划分权限位之后为:rwx r-x r-x

三、如何修改权限

那如何修改用户/属组和权限,具体如下:

1、chgrp:改变文件/目录所属用户组

chgrp -R oinstall test :表示把test目录及子目录的属组修改为oinstall,-R,代表递归的意思

2、chown:改变文件/目录所有者和用户组

chown –R oracle:oinstall test :表示把test目录及子目录的用户和属组分别修改为oralce和oinstall
chown –R oracle test :表示把test目录及子目录的用户修改为oracle

3、chmod:改变文件/目录权限

方式一:通过符号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
chmod [who] operator [permission] filename

who的含义是:
 u 文件属主权限
 g 同组用户权限
 o 其他用户权限
 a 所有用户(文件属主、同组用户及其他用户)

operator 的含义:
 + 增加权限
 - 取消权限
 = 设定权限

permission的含义:
 r 读权限
 w 写权限
 x 执行权限

如:
chmod -R u=x name_dir :表示给目录name_dir及其子目录/文件的文件属主赋予执行的权限
chmod u+x oracle.cfg :表示给该文件的用户赋予执行权限

方式二:通过数字

1
2
3
4
5
6
7
8
9
10
chmod [mode] file
mode 每一个权限位用一个八进制数表示,如551
读(-r) : 4
写(-w) : 2
执行(-x): 1

如: chmod 751 file_name ,即rwxr-x--x,具体表示
    file_name文件的属主具有可读、可写、可执行的权限
    file_name文件属主所在的组具有可读、可执行的权限、没有可写的权限
    file_name文件属主所在组的其他用户具有可执行的权限、没有读、写的权限

目录的RX权限一般是配合使用的,请看下面的例子
比如:oracle用户能否获取abc目录(root:root 774)下的文件列表?
答案:不能,因为获取文件列表需先进入该目录(无X权限),再获取列表(需R权限),由于只有R权限,无X权限,所有不能。

四、默认权限

创建文件、目录时,默认的权限是通过umask控制,可通过umask or umask -S查看(后三位对应三个组的权限), 默认权限的逻辑如下:
目录:默认777 (由于x对目录尤为重要,所以x默认是放开的)
文件:默认666 (文件只是存储数据,x不是关键,故默认是关闭的)

创建文件、目录后,默认的权限值=默认权限然后再拿掉umask,比如umask=0022,则:
目录默认权限值=777并拿掉-ww的权限,=755
文件默认权限值=666并拿掉-ww的权限,=644
linux权限

创建文件、目录后,默认的权限值=默认权限然后再拿掉umask,比如umask=0003,则:
目录默认权限值=777并拿掉——-wx的权限,=774
文件默认权限值=666并拿掉——-wx的权限,=644 (不是643)

同时,不同的用户都可以修改umask的值,但只是对当前用户生效,而且只是一次性(切换用户,更换控制台后均恢复成默认值)
linux权限

深究:系统默认的umask=0022,是从哪里设置的?
结论:在两个地方设置(一个是:/etc/login.defs ; 另一个是/etc/profile,后者优先级更高,也就是后面的会覆盖前面的)
/etc/login.defs如下(默认为022);
linux权限

/etc/profile(默认时注释掉的)
linux权限

实验过程:分别将/etc/login.defs、/etc/profile的umask放开并设置为003、002,最后umask=002
linux权限

将/etc/profile的umask注释掉,最后umask=003
linux权限

umask用途,个人理解如下:
1、用于设置文件、目录的初始权限(否则还需要通过chown、chmod等命令再次设置权限)
比如weblogic用户动态创建的多个文件,需要同组的其他用户也能修改该文件(默认umask=022实现不了,需设置umask=00*才可以),尤其是网络连接,FTP等

五、特殊权限

对于某些命令和目录来说,除上面提到的权限外,还经常用到SUID、SGID、SBIT权限,分别对应用户,组,组之外的权限,说明如下:

1、SUID:

当s这个标志出现在文件所有者的x权限上时,比如/usr/bin/passwd 状态是【-rwsr-xr-x】,此时就被成为Set UID,简称为SUID的特殊权限,作用表现是,让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。但SUID只能运行在二进制的程序上(系统中的一些命令),且不能用在脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。

****举个例子:****
比如passwd命令(-rwsr-xr-x root:shadow passwd所有用户都可以执行),中间会写密码到/etc/shadow文件(-rw-r—–; root:shadow),没有设置SUID,其他用户就无法写到/etc/shadow),设置SUID之后,执行人相当于拥有了root用户的权限(passwd的用户是root,且rws)

2、SGID:

如果s标志在文件所有者上称为 SUID,那s标志在群组上称为Set GID。作用表现在,如果用户对某目录具有s权限的话,使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同

****举个例子:****
设置SGID之前,weblogic创建的f1,d1是属于weblogic:wasgroup,但对test目录赋予SGID之后,其他用户在此目录下创建的文件 or目录的属组均属于test的属组(比如f2,d2),相当于获得该组的权限 ;
SGIT

应用举例:比如有A,B两个项目成员允许对/opt/project目录(该目录属于 group C)进行操作,要求各自创建的文件均能被group C的用户访问
一种方式:可以对新创建的文件或目录,单独赋权
二种方式:采用SGID,也就是对/opt/project目录赋予SGID,这样A,B两个项目组人员在该目录下创建的文件or目录都属于一个group C

3、SBIT:

这个就是针对others来设置的了,和上面两个一样,只是功能不同而已。
SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。

****举个例子:****
未设置SBIT,oracle用户可以删除test目录下weblogic创建的f1,d1(oracle对test目录有w权限)
SBIT

设置SBIT之后,只有f1,d1的创建者weblogic和root才能删除
SBIT

4、设置SUID、SGID、SBIT

SUID:4,只用于文件,对应user,用s替换x,如果原始user不具备x权限,则用S
SGID:2,用于文件、目录,对应group,用s替换x,如果原始group不具备x权限,则用S
SBIT:1,只用于目录,对应other,用t替换x,,如果原始other不具备x权限,则用T

设置方式有如下两种:
方式一:用数字方式,下面例子的7表示对SUID、SGID、SBIT都设置x(设置在千分位上)
如果是给group 和 other设置x,则首位数用变成3
SBIT

方式二:用字符方式,SUID:u+s ; SGID:g+s ; SBIT:o+t (一律用小写,系统自动识别并显示是大小还是小写)
同理,也可用u-x,u=x,表示user去掉x权限,user设置为x权限
SBIT

六、ACL权限

ACL权限用途:主要用于在不更改目录or 文件用户和用户组属性的前提下,新增其他用户对目录 or 文件的操作权限。
命令:setfacl 对目录和文件设置acl权限
命令:getfacl 查看目录和文件的acl权限

主要用法如下:
setfacl -m u:weblogic:rx dir1 (对weblogic用户设定,rx 到dir1的权限)
setfacl -m g:dba:rx dir1 (对dba这个组设定,rx 到dir1的权限)
setfacl -m g:weblogic:rx dir1 (对weblogic组设定,rx 到dir1的权限)
setfacl -b dir1 (移除所有的ACL设定参数)

例子
ACL

注意:上述命令(setfacl -m u:weblogic:rx b)对目录设置acl权限后,只是对b目录本身设置,子目录和文件不会继承acl权限,发现b目录下的oracle文件没有acl权限
ACL

如想让子目录和文件继承acl权限,可使用命令(setfacl -m d:u:weblogic:rx b) 或者(setfacl -R -m u:weblogic:rx b)
ACL

Tags:
文 / 甲乙丙丁
loading