文件的权限信息的表示格式和含义
drwxr-xr-x. 第一个字符表示的文件类型:
-
d:目录文件
-
l:链接文件
-
b:块设备文件
-
s:套接口文件
-
c:字符设备文件
-
p:管道文件,特殊少见的设备
-
-: 表示普通文件
-
w:写
-
r: 读
-
x:执行
更改文件或目录权限命令:chmod
①、命令名称:chmod
②、英文原意:change the permissions mode of a file
③、命令所在路径:/bin/chmod
④、执行权限:所有用户
⑤、功能描述:改变文件或目录权限
⑥、语法: chmod
【{ugoa}{±=}{rwx}】【文件或目录】
【mode=421】【文件或目录】
-R 递归修改
注意: 不是每一个Linux用户都有权限更改某个文件或目录权限,能更改文件或目录权限的只有两种用户
①、文件的所有者。我们通过ls命令查看某个文件的详细信息,可以看到该文件的所有者。
②、root用户,这不用多说,root用户是linux系统权限最大的用户。别人不能干的事,root用户都能干。
对于上面的语法 chmod 【{ugoa}{±=}{rwx}】【文件或目录】,我们要知道ugoa分别是:u:表示所有者,g:表示所属组,o:表示其他人,a:表示所有人。
对于上面的语法 chmod 【{ugoa}{±=}{rwx}】【文件或目录】,我们要知道ugoa分别是:u:表示所有者,g:表示所属组,o:表示其他人,a:表示所有人。
而rwx表示的意思如下:
对于【mode=421】【文件或目录】,这是我们将权限用数字表示,其中 r 表示4,w表示2,x表示1,分别是2的0次方,1次方,2次方。那么我们可以这样理解:具有 rwx 权限的数字就是 7,具有 rw- 权限的数字是 6,具有 r-- 权限的数字是 4。
我们常用的权限的数字模式又这几种:
-
644:这是文件的基本权限,代表所有者拥有读、写权限,而所属组和其他人拥有只读权限。rw-r–r–
-
755:这是文件的执行权限和目录的基本权限,代表所有者拥有读、写和执行权限,而所属组和其他人拥有读和执行权限。rwxr-xr-x
-
777:这是最大权限。在实际的生产服务器中,要尽力避免给文件或目录赋予这样的权限,这会造成一定的安全隐患。rwxrwxrwx
范例1: 我们赋予 tmp 目录下的 tmp.log 所有者 x 的权限;赋予 所属组 w 权限,其他人 w 权限。也就是说我们要给 tmp.log赋予的文件权限是 rwxrw-rw-,用数字表示是766。
我们还可以递归赋予权限,也就是加上 -R 参数给指定目录下的所有文件或目录赋予指定权限。
注意知识点:对权限的正确认识,分两种对象,文件和目录
文件: -
r,读:对文件的内容有读的权限,对应的命令:cat,more,less,head,tail等
-
w,写:可以修改文的内容,对应命令vi,vim,echo,注意对文件的写权限不能删除文件本身,要删除文件必须拥有文件
的父文件夹的写权限 -
x,执行:表示拥有了执行的这个文件的权限,但是不是说有这个权限,文件就可以执行,文件可以执行否,前提拥有r的权限(普通用户,root不需要),但是有了权限的前提下,还必须是这个文件里的内容是正确的可以执行的代码
目录: -
r,读:对目录,是可以查看文件夹里的内容,对应命令是ls
-
w,写:可以修改文件里的内容,也就是可以复制,删除,新建,移动文件夹里的子目录和文件,对应的命令cp,touch,
mv,rm…命令 -
x,执行:文件夹显示是不能运行的,对文件夹设置执行权限,表示可以进入到文件夹里边去,对应的命令cd
总结:我们要删除一个文件,不是对文件本身有w权限就可以,必须要拥有这个文件的父文件夹具有w的权限才可以!
二、改变文件或目录所有者命令:chown
①、命令名称:chown
②、英文原意:change file ownership
③、命令所在路径:/bin/chown
④、执行权限:所有用户
⑤、功能描述:改变文件或目录的所有者
⑥、语法: chown 【用户】【文件或目录】
注意:能更改文件或目录的所有者用户是 root,所以首先要登录到root用户中,才可开始操作改更
例:这里我们通过useradd【用户名】命令创建用户,然后通过passwd【用户名】输入密码,这两个命令后面,我们通过这两个命令创建 vae 用户
创建用户:user1 ,密码:xiong,再把 aaa目录的所有者设为user1
chown user1 aaa
三、改变文件或目录所属组命令:chgrp
①、命令名称:chgrp
②、英文原意:change file group ownership
③、命令所在路径:/bin/chown
④、执行权限:所有用户
⑤、功能描述:改变文件或目录的所属组
⑥、语法: chgrp【用户组】【文件或目录】
注意:能更改文件或目录的所有者用户是 root
例:由于创建用户时,会自动创建同名的用户组,所以在此把它设为user1组
四、显示、设置文件的缺省(默认)权限命令:umask
我们手动创建的文件夹默认的权限为755,即其它用户和组没有写权限,实际开发中很少很少改umask,但我为了学习理解它,我在这会改,折腾一下。
①、命令名称:umask
②、英文原意:the user file-creation mask
③、命令所在路径:shell 内置命令
④、执行权限:所有用户
⑤、功能描述:显示、设置文件的缺省权限
⑥、语法: umask 【-S】
-S 以rwx形式显示新建文件的缺省权限
注意:可能大家不太明白这个命令的意思,我们分别执行umask和 umask -S ,如下:
其中umask 执行显示结果是 0022,第一个0表示特殊权限,后面我们会单独进行讲解有哪几种特殊权限。022表示权限的掩码值,我们用7 7 7 减去 0 2 2得到755(这里的减,不是单纯的对应位置上的数相减,一会儿我们详细说说掩码值是怎么转成权限值的),表示的就是下面通过加上-S输出的rwxr-xr-x,这个值用数字表示就是755.
注意这里创建目录和创建一个文件会有点不一样,来验证一下创建文件:
我们发现使用touch命令创建了一个文件a.txt,然后发现权限并不是rwxr-xr-x(755),而是rw-r–r–(644)。对比发现少了三个x,也就是少了可执行权限。这是为什么呢?
这是因为在Linux系统中,所有新创建的文件都是没有可执行权限的。这是出于Linux系统的一种自我保护,因为类似的病毒木马程序都是具有可执行权限的。所以在Linux系统中,新创建的文件是没有可执行权限的。对于新建的文件最高的权限666
设置默认权限
比如我们想将新创建的文件权限设置为rwxr-xr–,也就是754。
我们用777减去754得到023。也就是通过执行 umask 023 来完成默认权限设置。(文件不一样哦,注意一下)
掩码值的计算方法:
- 1、将默认最大权限(目录777,文件666)和umask值都转换为2进制
- 2、对umask取反
- 3、将默认权限和umask取反后的值做与运算
- 4、将得到的二进制值再转换8进制,即为权限,
例1: umask 为022
6 6 6 umask 0 2 2
110 110 110 000 010 010 # 转成二进制
111 101 101 # umask取反的值
110 110 110 与 # 第二步,默认权限和umask取反后的值做与运算
111 101 101 # umask取反的值
110 100 100 #与运算后,二进制结果
6 4 4 #转成8进制
权限进阶
前面我们讲过基础的权限命令,chmod,chown,chgrp,umask命令,通过这些命令我们能够对目录或文件进行最基本的权限设置,但是在实际的应用中还有很多是这些命令解决不了的权限设置问题,所以,我们这里进一步地对linux的权限管理进行讲解!
一、Linux权限管理的ACL权限
-
1、什么是 ACL 权限?
ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。 -
2、ACL有什么用
既然是作为UGO权限管理的补充,ACL自然要有UGO办不到或者很难办到的本事,例如:
可以针对用户来设置权限
可以针对用户组来设置权限
子文件/目录继承父目录的acl权限 -
3、检查是否支持ACL
ACL需要Linux内核和文件系统的配合才能工作,当前大多数Linux发行版本默认都是支持的。
CentOS7.X创建的xfs文件系统默认内置支持ACL功能!
CentOS7.X之前版本,手工创建的ext4文件系统可能没有开ACL功能。如果没有需手动重新挂载开启,但一般情况都是开着的。
CentOS7.X之前版本,最好还是查看一下,我们看某个文件/目录否支持 ACL 权限,首先要看文件所在的分区是否支持 ACL 权限。
①、查看当前系统有哪些分区:df -h
②、查看指定分区详细文件信息:dumpe2fs -h 分区路径 (只针对于CentOS7.X之前版本,xfs文件系统不支持这个命令了,xfs里用xfs_info 分区路径,查看分区的详细信息)
看实例:给三个用户user1,user2,user3添加到用户组tg(图片中是g1),让tg/g1生效于a目录,再赋于a目录770权限,即其它用户对a没有任何权限,突然有一天,来了个实习生,但又不能让他加了用户组,又要让他可以有对a有读执行权限,这就要用到ACL
单独位shixi赋予acl权限rx:
$ cd /a
-bash: cd: /a: Permission denied #刚创建的shixi用户没有任何权限,所以连a目录进都进不去
su - #回到root用户下,也只有root或root组中的用户(也不会搞很多这样的用户)才能给其它用户设置属性
setfacl -m u:shixi:rx /a
su - shixi #进入shixi用户,它现在可以进入/a中了。
$cd /a
5、查看 ACL 权限:getfacl 文件名
//acl权限具体是什么,用getfacl查看:
getfacl /a
6、最大有效权限 mask(一般不去改它)
ACL 权限存在一个最大有效权限的概念,我们给用户或用户组设定 ACL 权限其实并不是真正我们设定的权限,
是与 mask 的权限“相与”之后的权限才是用户的真正权限,一般默认mask权限都是rwx, 与我们所设定的权限相与就是我们设定的权限。
这个值是可以修改的:**
setfacl -m m:权限 文件名
删除 ACL 权限
- ①、删除指定用户的 ACL 权限
setfacl -x u:用户名 文件名
- ②、删除指定用户组的 ACL 权限
setfacl -x g:组名 文件名
- ③、删除文件的所有 ACL 权限
setfacl -b 文件名
递归 ACL 权限
通过加上选项 -R 递归设定文件的 ACL 权限,所有的子目录和子文件也会拥有相同的 ACL 权限。当然了,新建的文件或子目录是没有ACL权限的。
setfacl -m u:用户名:权限 -R 文件名
默认 ACL 权限
如果给父目录设定了默认的 ACL 权限,那么父目录中所有新建的子文件会继承父目录的 ACL 权限。
setfacl -m d:u:用户名:权限 文件名
二、sudo命令的使用
简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 才能执行的操作,而不需要知道 root 的密码。
严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。默认的安全策略记录在 /etc/sudoers 文件中。
1、编辑配置文件命令:visudo
注意:编辑sudo的配置文件/etc/sudoers是一般不要直接使用vi(vi /etc/sudoers)去编辑,因为sudoers配置有一定的语法,直接用vi编辑保存系统不会检查语法,如有错也保存了可能导致无法使用sudo工具,最好使用visudo命令去配置。虽然visudo也是调用vi去编辑,但是保存时会进行语法检查,有错会有提示。
2、配置文件/etc/sudoers的具体配置
root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)(注意:这里写的越具体,授权就越安全)
%wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)(注意:这里写的越具体,授权就越安全)
可使用的身份:(ALL)代表可以切换成任意身份(用户)。不写默认是root
举例,授权给班长( bz)用户可以添加新账号,和修改普通用户的密码权限:
bz ALL=/usr/sbin/useradd //赋予 bz添加用户权限.命令必须写入绝对路径
bz ALL=/usr/bin/passwd //赋予改密码权限,只是这样做要遭! 必须取消对 root 的密码修改
bz ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd “”, !/usr/bin/passwd root //注意:逗号后必须有空格
#下面是例子的代码过程
useradd bz
passwd bz //设置密码
su - bz
$useradd student1
//useradd: Permission denied. 刚开始bz没用添加用户权限
su - //回到root
visudo // visudo中间没有空格,不是vi sudo
bz ALL=/usr/sbin/useradd //上面的which查到了useradd命令所在位置
su - bz
sudo -l //查看 bz拥有的权限
#User bz may run the following commands on client2:
# (root) /usr/sbin/useradd
sudo useradd user1 //可以添加用户了,但还是权限比较大,如参数-g,可以赋初组,我们可以限定一个参数
su //回到root
visudo //最后一行的代码修改如下,这样限定了只能带-c加注释创建用户,不带-c都不行呀。
bz ALL=/usr/sbin/useradd -c [a-zA-Z0-9]*
su - bz
sudo /usr/sbin/useradd -c "xiongshaowen" user1 //会成功创建用户
sudo /usr/sbin/useradd user1 //不允许这样的,创建失败
3、普通用户查看自己能执行的sudo命令:sudo -l,再为bz赋密码权限,但不可修改root密码
用户 bz 可以在 CentOS7 上运行以下命令:
su - bz
sudo -l
su //回到root用户
visudo //设置bz用户的密码权限
bz ALL=/usr/bin/passwd
//赋予改密码权限,只是这样做要遭! 必须取消对 root 的密码修改
bz ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
//注意:逗号后必须有空格,上面的代码含义:不允许空,不允许修改root密码
su - bz
passwd user1 //可以修改user1密码了,
passwd root //不允许修改root的密码
4、普通用户执行自己能执行的sudo命令
su - bz
sudo useradd -c "xxx" 用户名