Linux系统是一个多用户环境,所以在同一时间可能有多个用户在使用同一个目录或文件。但对每个用户不一定都有相同的权限,也许有的用户可以查看文件、有的用户可以修改文件等,为了满足这样的要求就必须对目录或文件配置权限。
文章目录
- 文件权限
- 1.0 权限种类
- 1.1文件所有者例外
- 1.2保护子目录
- 2.文件授权
- 2.1 chmod命令:
- 2.2 chown命令:
- 2.3 chgrp 命令:
- 4.高级权限管理
- 4.1权限掩码
- 4.2特殊权限
- 4.3 ACL(访问控制列表)
- 5.如何查看用户和用户组
- 5.1列出系统所有用户
- 5.2 用getent命令查看用户列表
- 5.3检查某个用户是否存在
- 5.4 查看当前用户ID
- 5.5创建用户:
- 5.6删除用户:
- 5.7口令管理:
- 5.8用户组:
文件权限
1.0 权限种类
在Linux系统中权限分为可读(r)、可写入(w)、可执行(x)三种。对于文件来说,可读权限表示允许对文件进行浏览;可写入权限表示允许修改文件;可执行表示可以将文件作为命令使用。对于目录来说,可读权限表示允许显示目录列表;可写入表示可以在目录中建立、删除、移动文件或子目录;可执行表示可以切换到目录。
ls -lh #可以查看目录详情,h选项表示显示文件大小
输出:
drwxr-xr-x 2 root root 21 Jun 19 17:51 fileIotServer
-rw-r--r-- 1 root root 63M Jun 19 18:48 iotserver-0.0.1.jar
-rw-r--r-- 1 root root 26K Apr 25 02:29 mysql80--el7-3.noarch.rpm
|[-][-][-]- [--] [--]
| | | | | | |
| | | | | | +----------------> 7. Group
| | | | | +---------------------> 6. Owner
| | | | +--------------------------> 5. Alternate Access Method
| | | +----------------------------> 4. Others Permissions
| | +-------------------------------> 3. Group Permissions
| +----------------------------------> 2. Owner Permissions
+------------------------------------> 1. File Type
说明:
-
第一个字符一般用来区分文件和目录:
d:表示是一个目录,事实上在Ext2 FS中,目录是一个特殊的文件。
-:表示这是一个普通的文件。
l:表示这是一个符号链接文件,实际上它指向另一个文件。
b、c:分别表示区块设备和其他的外围设备,是特殊类型的文件。
s、p:这些文件关系到系统的数据结构和管道,通常很少见到。 -
第2~10个字符当中的每3个为一组,左边三个字符表示所有者权限(Owner Permissions),中间3个字符表示与所有者同一组的用户的权限(Group Permissions),右边3个字符是其他用户的权限(Others Permissions)。
r(Read):
对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限
w(Write):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
x(execute):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。
1.1文件所有者例外
在Linux即便文件的权限中所有者并没有写权限,但只要当前用户是文件所有者一样可以写入文件。例如用vim编辑后,只需要在保存时,采用"!" 强制保存即可。
1.2保护子目录
很多时候用户为了让其他用户可以访问某个目录,如用户家目录。给了用户可执行权限,但如果没有给可读权限时(对于目录没有可读权限就不能显示目录列表),其他用户必须事先知道该目录下子目录或文件才可以访问到。因为其他用户不能使用“ls”命令浏览目录中的内容,这样该目录还是保密的,其他用户只访问用户选择公开的部分。
虽然给其他用户可读权限在防止其他用户浏览该目录内容上有一定作用,但这不是非常可靠。因为尽管其他用户只有执行权限,但是其他用户可以猜到该目录中的内容。比如用户家目录下通常会有一个名为“.bashrc”的文件,其他用户在不浏览的情况下也可以查看该文件中的内容。所以在给予其他用户执行权限后,要充分考虑该目录中的文件和子目录的权限。
例如: test用户没有查看权限
[test@VM_0_13centos tmp]$ ll lost/
ls: lost/: Permission denied
但是还是可以查看lost目录下有读取权限的文件:
[test@VM_0_13centos tmp]$ cat lost/
Hello world!!!
2.文件授权
2.1 chmod命令:
chmod命令是我们进行权限管理最常用的命令。该命令有两种用法,一种是包含字母和操作符表达方式的文字配置方法;另一种是包含数字的配置方式。
语法:
chmod [-cfvR] [--help] [--version] mode file...
参数说明:
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
- + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
选项说明:
- -c : 若该文件权限确实已经更改,才显示其更改动作
- -f : 若该文件权限无法被更改也不要显示错误讯息
- -v : 显示权限变更的详细资料
- -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
- –help : 显示辅助说明
- –version : 显示版本
**示例一:**通过操作符表达式的文字配置方式
将文件 设为所有人皆可读取 :
chmod a+r
将文件 与 设为该文件拥有者,所属群组可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w
将目前目录下的所有文件与子目录皆设为任何人可读取 :
chmod -R a+r *
示例二: 用数字方式授权
读、写、执行分别用数字表示为:r=4,w=2,x=1 一组权限可以用一组数字表示,比如 777表示 rwx rwx rwx, 640表示rw- r-- --x
chmod 777 filename #给User,Group,other分别授权读写和执行权限。
chmod 444 filename #授予只读权限
chmod 777 * #给当前目录所有文件授权
chmod -R 777 jack/ #给jack目录和下面的所有文件即文件夹,都授予读写和执行权限
2.2 chown命令:
chown和chmod命令长得很像,但功能和用法不同。
命令 | 作用 |
---|---|
chmod | 更改文件或目录的权限(更改的是权限) |
chown | 更改文件或目录的所有者或拥有组(更改的是属性) |
语法:
chown [-fhRv] [--reference=<参考文件或目录>] 所有者[:拥有组] 文件|目录...
常用选项:
● 文件|目录…:要更改拥有组的文件或目录。
● -f:不显示错误信息。
● -v:显示命令执行过程。
● -h:更改遇到的符号链接的所有者或拥有组,而非符号链接指向的文件或目录的所有者或拥有 组。当遇到符号链接而未指定“-h”选项时,会更改符号链接指向的文件或目录的所有者或拥有组,而非链接本身的所有者或拥有组。
● -R:递归处理,将指定目录下的所有文件及子目录一并处理。
● --reference=<参考文件或目录>:把指定文件或目录的所有者和拥有组更改成和参考文件或目录的拥有组相同。
在使用chown命令指定用户或用户组时,可以使用名称或ID。下面看几个chown命令的例子。
更改目录freeOcean的所有者为jack
chown jack freeOcean/
更改目录 freeOcean的拥有组为jack
chown :jack
2.3 chgrp 命令:
该命令从字面就可以看出,change group 。作用就是修改文件或目录的拥有组。实际上chown就可以做到。所以该命令不太常用。
应用举例:修改目录test目录的拥有组为mary
chgrp mary test/
4.高级权限管理
4.1权限掩码
查看权限掩码:
[root@VM_0_13_centos zx]# umask
0022
使用-S用r、w、x显示:
[root@VM_0_13_centos zx]# umask -S
u=rwx,g=rx,o=rx
权限掩码umask是一个四位整数(千位的0表示特殊权限,下文解释,可先忽略),其中百位是所有者权限掩码;十位是拥有组权限掩码;个位是其他用户权限掩码。当用户在新建目录或文件时真正的权限会使用Linux内核级别默认权限减去umask值。
在Linux内核级别新建文件的默认权限是666,在Linux内核级别新建目录的默认权限是777.
所以实际最终结果的权限 是666-022 = 644 :
比如我新建一个 查看权限 如下:
-rw-r--r-- 1 root root 0 Dec 29 18:19
所以如果想修改新建文件和目录的权限,则可以通过修改umask来控制。
umask 011 #修改权限掩码为 011 ,千位不会改变
4.2特殊权限
SUID属性:
我们知道passwd
命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的米。但是保存用户密码的/etc/shadow文件的权限是400,也就是说只有文件的所有者root用户可以写入,那为什么其他用户也可以修改自己的密码呢?这就是由于Linux的文件系统中的文件有SUID属性。
[root@VM_0_13_centos zx]# ll /etc/shadow
---------- 1 root root 679 Jul 10 20:37 /etc/shadow
SUID属性只能运用在可执行文件上,当用户执行该执行文件时,会临时拥有该执行文件所有者的权限。passwd命令启用了SUID功能,所以一般用户在使用passwd命令修改密码时,会临时拥有了passwd命令所有者root用户的权限,这样一般用户才可以将自己的密码写入/etc/shadow文件。在使用“ls-l”或“ll”命令浏览文件时,如果可执行文件所有者权限的第三位是一个小写的“s”就表明该执行文件拥有SUID属性。
[root@VM_0_13_centos zx]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
Sticky属性:
Sticky属性只能应用在目录,当目录拥有Sticky属性所有在该目录中的文件或子目录无论是什么权限只有文件或子目录所有者和root用户能删除。比如当用户oliva在“/charles”目录中建立一个文件并将该文件权限配置为777,当/charles目录拥有Sticky属性时,只有root和oliva用户可以将该文件删除。
SGID属性:
SGID与SUID不同,SGID属性可以应用在目录或可执行文件上。当SGID属性应用在目录上时,该目录中所有建立的文件或子目录的拥有组都会是该目录的拥有组。如“/charles”目录的拥有组是charles,当“/charles”目录拥有SGID属性时,任何用户在该目录中建立的文件或子目录的拥有组都会是charles;当SGID属性应用在可执行文件上时,其他用户在使用该执行文件时就会临时拥有该执行文件拥有组的权限。如/sbin/apachectl文件的拥有组是httpd,当/sbin/apachectl文件有SGID属性时,任何用户在执行该文件时都会临时拥有用户组httpd的权限。
配置SUID/SGID/Sticky属性:
配置普通权限时可以使用字符或数字,SUID、SGID、Sticky也是一样。使用字符时s表示SUID和SGID、t表示Sticky;4表示SUID、2表示SGID、1表示Sticky。在配置这些属性时还是使用chmod命令。
给test目录增加SUID属性:
[root@VM_0_13_centos zx]# chmod u+s test
给test目录增加SGID属性:
[root@VM_0_13_centos zx]# chmod g+s test
在使用数字表示时,原来的三位不变,只是增加了一个千位专门用于SUID、SGID、Sticky属性。下面的4就是SUID属性。
给test目录增加Sticky属性:
[root@VM_0_13_centos zx]# chmod 1755 test/
结果:会有一个t标识
[root@VM_0_13_centos zx]# ll
drwsr-xr-t 2 root root 4096 Dec 29 18:33 test
4.3 ACL(访问控制列表)
利用Linux文件系统提供的ACL功能为系统中已存在的任何用户或用户组指定其对系统中文件或目录的权限。通过ACL功能配置的权限优先级高于通过chmod命令配置的普通权限。
通过ACL可以实现更加灵活的权限配置,具体操作目前待整理,完成后,来补充更新。
上面测试我们频繁用到用户,用户组等相关的信息。在Linux中如何查看用户,用户组等相关信息?所以也在下文补充了。
5.如何查看用户和用户组
5.1列出系统所有用户
cat /etc/passwd
可以看到上面的输出,每行有7个部分,分别用冒号 “:” 分隔,每一部分分别代表:
- 用户名
- 加密的密码(
x
means that the password is stored in the /etc/shadow file) - 用户ID (UID)
- 用户所在组ID (GID)
- 用户全名(GECOS)
- 用户家目录
- 登录shell (defaults to
/bin/bash
)
如果只想列出用户名,可以用awk
or cut 过滤:
awk -F: '{ print $1}' /etc/passwd
cut -d: -f1 /etc/passwd
output:
root
daemon
bin
sys
sync
...
...
sshd
vagrant
jack
anne
5.2 用getent命令查看用户列表
getent
命令展示数据库配置文件 /etc/
其中配置了passwd
我们可以利用这个来列出系统的用户列表.
getent passwd
可以看到和上面查看的是一样的内容。同样如果需要过滤需要的部分,可以采用下面的命令:
getent passwd | awk -F: '{ print $1}'
getent passwd | cut -d: -f1
5.3检查某个用户是否存在
getent passwd | grep jack
如果用户存在,则会打印用户的登录信息,否则不会输出。
5.4 查看当前用户ID
id #查看当前用户ID,用户组ID和
5.5创建用户:
useradd zhangxu -m -d /home/zhangxu //创建用户zhangxu 并指明用户目录
sudo passwd zhangxu //为用户设置密码
su zhangxu //切换到zhangxu用户
$表示普通用户
#表示超级用户,也就是root用户
5.6删除用户:
userdel -r zhagnxu //将用户和目录一并删除
5.7口令管理:
passwd //修改当前用户密码
passwd zhangxu //修改指定用户密码
5.8用户组:
groups //查看当前用户组
cat /etc/passwd //查看所有用户的信息
cat /etc/passwd|grep 用户名 //查看某个用户的信息
cat /etc/group //查看所有组信息
修改用户组:
usermod
参数:-g
usermod -g root xiaomao
这种情况下会直接修改xiaomao的用户组为root组,覆盖原来的组
参数: -a -G
usermod -a -G root xiaomao
这种情况下会追加修改risk的用户组,新增oinstall用为risk的从属用户组,不覆盖原有的risk的用户组。