青蛙学Linux—用户、组、权限和文件属性
1、用户和组
1.1、用户角色
在Linux下有以下三种角色用户:
- 超级用户:拥有对系统的最高管理权限的用户,默认用户名为root。需要注意的是,与Windows下的超级管理员Administrator不同,root用户在Linux下拥有最高的权限,你可以使用root用户运行rm –rf /*命令删除整个系统,而Administrator用户不允许删除系统文件(其实Windows下的最高权限用户为System,只是Windows限制了使用System用户登录的行为)。
- 普通用户:只能操作自己目录下的文件或者经过授权的文件,能够登录操作系统。
- 虚拟用户:也叫伪用户,无法登录操作系统。这类用户的存在主要是为了系统管理的方便,满足相应的系统进程对于文件属主(即权限)的要求。这类用户指向的shell为/sbin/nologin,使用该shell的用户无法登录系统且无法通过su命令切换到该用户。
1.2、用户和组之间的关系
在Linux系统下,当一个用户被创建时,系统将创建一个与用户同名的组,该用户为该组中的唯一用户。当然,一个用户也可以加入其他的组。用户和组具有以下几种关系:
- 一对一:即一个用户可以存在一个组中,同时也是该组中的唯一成员
- 一对多:即一个用户可以存在多个用户组中,那么此用户具有多个组的共同权限
- 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限
- 多对多:多个用户可以存在多个组中,其实就是上面三个对应关系的扩展
1.3、用户和组的相关配置文件
1.3.1、/etc/passwd
该文件是系统的用户配置文件,是用户管理中最重要的一个文件。记录了系统中每个用户的基本属性,对所有用户可读,但只有root用户可写。以下来分析下该文件的内容(仅截取文件的一部分):
文件中的每行内容以冒号分隔,每个字段表示的具体含义如下:
①:用户名
②:密码,但是用户真正的密码不是保存在这里,而是在另外一个文件
③:UID,用户ID
④:GID,用户所属的组的ID
⑤:用户注释
⑥:用户家目录
⑦:用户的默认shell
1.3.2、/etc/shadow
该文件可以称为/etc/passwd的影子文件,存储的就是经过加密的用户密码。该文件只有root用户可以读写,其他用户均无法访问该文件。以下来分析下该文件的内容(仅截取文件的一部分):
该文件的每一行也是以冒号分隔,每个字段的含义为:用户名:加密后的密码:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
一些字段的详细解释:
密码字段:
- 如果为空,则表示该用户没有密码,没有密码的用户无法登录系统
- 星号和感叹号表示用户被锁定,无法登录系统
- $6$开头的表示密码使用SHA512算法加密
- $1$开头的表示密码使用MD5算法加密
- $2$开头的表示密码使用Blowfish算法加密
- $5$开头的表示密码使用SHA256算法加密
最后一次修改时间:表示从某个时刻起,到用户最后一次修改密码的天数。不同的系统时间起点不同。
最小时间间隔:两次修改密码之间的最小天数。
最大时间间隔:密码保持有效的最大天数。
警告时间:从系统开始警告用户到用户密码正式失效之间的天数。
不活动时间:用户没有登录活动但账号仍能保持有效的天数。
失效时间:一个绝对天数,如果使用了该字段,那么账户就有个生存期,到期后该账户就不是一个合法账户,无法登录系统。
1.3.3、/etc/group
该文件为系统中用户组的配置文件,系统中所有组的信息都存放在该文件。以下来分析下该文件的内容(仅截取文件的一部分):
该文件的每一行也是以冒号分隔,每个字段的含义为:组名:组密码:GID:属于该组的其他用户。
1.3.4、/etc/login.defs
该文件用来定义创建用户时的默认动作,比如UID和GID的范围、用户的过期时间、是否需要创建用户主目录等。
1.3.5、/etc/default/useradd
该文件为使用useradd命令创建用户时用户的一些默认属性,比如用户家目录、默认shell等。通过更改该文件,可以改变新建用户时用户的默认属性。该文件的内容为:
# useradd defaults file GROUP=100 # 起始GID HOME=/home # 用户的家目录 INACTIVE=-1 # 是否启用账号过期功能,-1为不启用 EXPIRE= # 如果启用账号过期功能时的账号过期时间 SHELL=/bin/bash # 用户的默认shell SKEL=/etc/skel # 新建用户时从该目录下复制用户的默认配置文件 CREATE_MAIL_SPOOL=yes # 是否为该用户创建邮箱缓存
1.3.6、/etc/skel
在创建新用户时,将从该目录下复制用户的配置文件到用户的家目录下。更改该目录下文件的内容就可以改变新建用户时用户的配置文件信息。该目录下的文件和目录都为隐藏。
1.4、用户和组的相关命令
1.4.1、创建/删除/修改用户
创建新的用户:
useradd [选项] 用户名
常用选项:
- -u:指定用户的UID
- -o:允许使用重复的UID
- -g:指定用户所属的默认组(主组),该组必须已经存在
- -G:指定用户所属的附加组,该组必须已经存在
- -d:指定用户的主目录,如果不指定,则读取/etc/default/useradd文件中的配置
- -s:指定用户使用的shell,如果不指定,则读取/etc/default/useradd文件中的配置
注意:如果要创建伪用户,则必须使用-s指定shell为/sbin/nologin,如果没有指定shell,则创建的用户即使没有设置密码也可以通过su命令切换到该用户。
删除一个用户:
userdel [选项] 用户名
常用选项:
- -r:在删除用户的时候同时删除该用户的家目录
修改一个用户:
usermod [选项] 用户名
常用选项:
- -u/o/g/G/d/s:同useradd命令
- -L:锁定用户密码,使密码无效
- -U:解除密码锁定
1.4.2、创建/删除/切换用户组
创建新的用户组:
groupadd [选项] 组名
常用选项:
- -f:如果组或GID已存在则退出
- -g:指定组的GID
- -k:不使用/etc/login.defs中的默认值
- -o:允许创建有重复GID的组
- -r:创建一个系统账户
- -p:为组设置密码
删除一个用户组(如果该组中有用户,必须先删除这些用户):
groupdel 组名
切换用户所属的用户组(该用户必须属于多个组):
newgrp 用户名 组名
1.5、编辑用户和组的相关配置文件
虽然用户和组的相关配置文件我们可以通过Vi/Vim打开并进行修改,但使用Vi/Vim进行修改时,其他有权限的用户也可以通过Vi/Vim进行修改,这样就造成了同时打开一个文件并修改的情况,容易导致错误的发生。所以推荐使用vipw命令对这些配置文件进行修改,当使用vipw进行修改时,将会锁住修改的配置文件使其他用户无法同时进行修改。vipw也是调用Vi对相关配置文件进行编辑,用法同Vi一致。vipw命令的语法如下:
vipw [选项]
常用选项:
- -g:编辑/etc/group文件
- -p:编辑/etc/passwd文件
- -s:编辑/etc/shadow文件
1.6、查看用户信息及用户属组
1.6.1、id
查看指定用户UID、GID以及用户所属的组。命令语法如下:
id 用户名
1.6.2、groups
查看指定用户所属的组。命令语法如下:
groups [用户名]
命令不指定用户名时为查看当前进程用户信息。
2、文件属性
2.1、文件属性信息
通过ll命令或ls –al命令可以查看文件的详细信息(在Linux下一切都视为文件)。这些信息包含了当前文件的类型、文件的用户权限、文件所属的用户和组、修改时间等。这里通过查看root用户家目录下的文件来详细了解下这些属性信息:
先来看划红线的地方:
“d”表示该文件的类型,在Linux下常见的文件类型一共有以下七种:
- -:普通文件
- d:目录
- c:字符设备文件
- b:块设备文件
- s:套接字文件
- p:管道
- l:符号链接文件
“2”表示该文件的硬链接的数量
“151”表示该文件的大小,默认单位bytes。对于目录,通常只显示文件系统默认block的大小
“11月 14 14:15”表示文件的最后修改时间。通常以月、日、时、分的方式显示,如果文档修改时间距离现在已经很远了,会使用月、日、年的方式显示
“.”表示该文件的文件名,Linux下有几种特殊的文件名:
- .:当前目录
- ..:上级目录
- 文件名以.开头:隐藏文件
2.2、文件权限信息
在上面的显示信息中,还有一些信息没有解释,为下图的划线部分:
这里先了解下属主和属组的概念:属主就是文件所属的用户,属组就是文件所属的用户组。
第一个划线部分:以三个位置为一组分成三组。第一个位置为r,代表可读权限;第二个位置为w,代表可写权限;第三个位置为x,代表可执行权限;如果在某个位置没有权限则以-表示。第一组表示属主对该文件的权限;第二组为属组对该文件的权限;第三个位置为其他用户对于该文件的权限。
第二个划线部分:表示该文件的属主。
第三个划线部分:表示该文件的属组。
2.3、一个例子
我们来看下/dev/sda1这个文件的详细信息,并分析这些信息表示的意思:
[root@localhost ~]# ll /dev/sda1 brw-rw----. 1 root disk 8, 1 11月 12 19:36 /dev/sda1
通过执行命令回显的信息,我们可以得出以下结论:/dev/sda1是一个块设备文件(硬盘就是块设备文件),文件的属主为root,属组为disk,属主的权限为可读可写,属组的权限也为可读可写,而其他用户对该文件没有任何权限。
2.4、文件权限相关命令
2.4.1、chown
该命令可以用来设置文件的属主和属组。命令语法如下:
chown [选项] 用户名[:组名] 文件
常用选项:
- -R:递归更改目录下的所有文件和子目录的权限
2.4.2、chmod
该命令用于设置文件的权限,有两种语法:一种是包含字母和操作符表达式的字符设定法;另一种是包含数字的数字设定法。
字符设定法:
chmod [操作对象] [+|-|=] [权限] 文件
- 操作对象:可以是以下字母中的任意一个或是它们的组合。u,属主user;g,属组group;o,其他用户others;a,所有用户all
- 操作符号:+,添加某个权限;-取消某个权限;=,赋予某个权限,同时取消原有的权限
- 权限:r,可读;w,可写;x,可执行
数字设定法:
将单个权限使用数字表示,用户的最终权限由这些数字相加得出:
- 4:表示可读权限r
- 2:表示可写权限w
- 1:表示可执行权限x
- 0:表示没有任何权限
比如:一个文件属主有可读写的权限,则表示为4+2=6;属组只有只读权限,则表示为4;其他用户没有任何权限,则表示为0。那么该文件的最终权限即为640。
数字设定法语法如下:
chmod 数字表示的权限 文件
一个例子,设置文件test1的权限为属主可读可写可执行,属组可读可写,其他用户可读:
# 权限分析 # 属主权限为4+2+1=7,可读可写可执行 # 属组权限为4+2=6,可读可写 # 其他用户权限为1,可执行 [root@localhost ~]# chmod 761 test1