Linux用户概述
Linux是多用户系统
Linux/Unix是一个多用户、多任务的操作系统,而Windows是一个单用户多任务操作系统。多用户不是说可以创建多个用户,而是说支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。此外,Linux的这些不同用户具有不同的权限,毎个用户只能在权限允许的范围内执行任务。Linux正是通过这种权限的划分与管理,实现了多用户、多任务的运行机制。
用户分类
首先需要了解一下用户的分类,Linux系统中用户分为超级用户、系统用户和普通用户。
- 超级用户
超级用户一般就是指root用户,UID为0,超级用户拥有所有权限。 - 系统用户
系统用户的UID为1~499,在 Linux 系统安装完成后,就会自动创建这些用户。因为在 Linux 中任何一个操作都需要由一个用户来完成,在执行一些系统层面操作时就是通过这些系统用户完成的。比如shutdown、ftp、sshd这些用户都对应到Linux系统的一些功能操作。
系统用户通常不需要或者无法登录系统,也没有宿主目录。 - 普通用户
UID范围一般是500~65534。这类用户的权限会受到基本权限的限制,也会受到来自管理员的限制。不过要注意nobody这个特殊的帐号,UID为65534,这个用户的权限会进一步的受到限制。
用户和用户组的基本管理
用户和用户组
用户和用户组与文件的权限息息相关,当一个用户创建了一个文件,这个用户就是该文件的所有者。Linux系统中可以设定文件的所有者和其他用户对文件的权限,包括读、写、执行权限。如果只想对一部分人开放权限,而其他人不开放,就需要引进用户组的概念,Linux中可以把一部分用户归入到一个用户组中。
用户相关的文件
如果要查看用户、用户组相关的信息,需要关注以下3个文件。
- /etc/passwd 存储用户的信息
- /etc/group 存储用户组的信息
- /etc/shadow 存储用户的密码信息
用户信息文件
1 | $ cat /etc/passwd |
下面以 root 用户举例说明/etc/passwd这个文件中的一行中存储了哪些信息。
| 项 | 名称 | 含义 |
|---|---|---|
| root | 用户名 | 用户登录系统的用户名 |
| x | 密码 | 密码位(并没有真实的存放密码,因为密码存放在该文件中并不安全) |
| 0 | UID | 用户标识号id |
| 0 | GID | 用户缺省组标识号 |
| root | 描述信息 | 例如存放用户全称等备注信息 |
| /root | 宿主目录 | 户登录系统后的缺省目录 |
| /bin/bash | 命令解释器 | 用户使用的 Shell,默认为 bash |
用户密码文件
1 | $ cat /etc/shadow |
下面以 root 用户举例说明/etc/shadow这个文件中的一行中存储了哪些信息。
| 项 | 名称 | 含义 |
|---|---|---|
| root | 用户名 | 用户登录系统的用户名 |
| $6$qHd… | 密码 | 加密的密码 |
| 空 | 最后修改时间 | 用户最后一次修改密码的天数 |
| 0 | 最小时间间隔 | 两次修改密码之间的最小天数 |
| 99999 | 最大时间间隔 | 密码保持有效的最多天数 |
| 7 | 警告时间 | 从系统刚开始警告到密码失效的天数 |
| 空 | 账号闲置时间 | 账号闲置时间 |
| 空 | 失效时间 | 密码失效的绝对天数 |
| 空 | 标志 | 一般不使用(保留字段) |
用户组文件
1 | $ cat /etc/group |
下面以 root 用户举例说明/etc/group这个文件中的一行中存储了哪些信息。
| 项 | 名称 | 含义 |
|---|---|---|
| root | 组名 | 用户所在的组的名称 |
| x | 组密码 | 一般不使用。用于不是组中的成员时,如果知道组密码的情况下,可以登录改组享有该组的权限。 |
| 0 | GID | 用户组标识id |
| 空 | 组内用户列表 | 所属组为该组的所有用户列表(不包含缺省组为该组的用户,用户之间以逗号’,’分隔) 。因为一个用户可以归属于多个用户组,缺省组就是用户登录后默认所归属的组,另外的组可以称为有效组,如果一个用户的有效组是该组,则会展示在这个字段里,用户登录后可以用newgrp命令切换到有效用户组。 |
用户管理操作
新增用户
新增用户命令的语法为:1
useradd [选项] [用户名]
参数说明:
选项:
- -u 指定用户的用户号(UID),如果同时有-o选项,则可以重复使用其他用户的标识号。
- -g 指定用户的缺省用户组,不指定的话会默认创建一个和用户名同名的用户组作为缺省用户组。
- -G 指定用户所属一个或多个有效组,多个组使用逗号‘,’连接。
- -d 指定用户主目录(directory),如果此目录不存在,则同时使用-m选项,可以创建主目录。
- -c 指定一段用户描述(comment)。
- -s 指定用户的命令解释器shell。
用户名:指定新账号的登录名。
示例:1
useradd -u 678 -g testgroup2 -G testgroup1,sys -d /home/testuser_home -s /bin/bash -c "添加用户(显示指定参数)" -e 2022-01-01 testuser #显示指定参数
修改用户
修改用户命令的语法为:1
usermod [选项] [用户名]
新增用户的命令在修改用户中都可以使用,例如将上面的 testuser 缺省组改为 testgroup3,命令如下:1
usermod -g testgroup3
此外,还有3个其他选项可能也会用到:
- -l 修改用户名,例如
usermod -l testuser3 -d /home/testuser3_home user3 - -L(lock) 锁定用户(密码前加了一个!)
- -U(unlock) 解锁用户(删除密码前的!)
删除用户
删除用户命令的语法为:1
userdel [选项] [用户名]
选项:
- -r 同时删除宿主目录、邮箱、组信息等,其他文件必须手动搜索删除。
示例:1
2 userdel user5 #只会删除 /etc/passwd、/etc/shadow 中的内容
userdel -r myuserr4 #同时删除宿主目录和邮件
注意:userdel命令不会删除所有者为该用户的文件,用户删除后这些文件的所有者将变为该用户的 UID,例如:
手工删除:
- 删除前注意备份用户相关目录,以及确认用户宿主目录;
- 删除宿主目录;
删除用户相关目录(使用 find 命令查找属于某个用户或用户组的文件,find 选项 -user、-uid、-group、-gid),例如:
1
2find /home -user myuser3 #查找所有者为该用户的文件和目录
find /home -uid 1003 -ok rm {} \; #根据 UID 查找,并删除确认修改
/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow文件(删除用户数据);
设置用户密码
超级用户可以设定自己和其他用户的登录密码,普通用户只能用它自己的密码。设定密码命令的语法格式为:1
passwd [选项] [用户名]
使用的选项:
- -l 锁定口令(lock),即禁用账号。
- -u 口令解锁(unlock)。
- -d 删除用户的密码(delete),使用户不需要密码就可以登录。
- -f 强迫用户下次登录时修改口令。
- -x 设置密码的有效期
直接使用passwd命令,修改的是当前用户的密码。例如,假设当前用户是sam,则下面的命令设置该用户自己的口令:1
2
3
4 passwd
Old password:******
New password:*******
Re-enter new password:*******
如果是超级用户,可以用下列形式设置任何用户的口令:1
2
3 passwd sam
New password:*******
Re-enter new password:*******
用户组管理操作
新增用户组
语法格式:1
groupadd [选项] [组名]
选项:
- -g 指定组的GID
- -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。
示例:1
groupadd group1
此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。
修改用户组
语法格式:1
groupmod [选项] [组名]
选项:
- -g 指定组的GID
- -n 修改组名称
1
groupmod -n group5 mygroup5 #修改名称为 group5
删除用户组
语法格式:1
groupdel [选项] [组名]
示例:1
groupdel group6 #删除后 /etc/group、/etc/gshadow 和所属该组的用户的组都会删除
注意:如果存在用户为该组的用户,则不能删除。
用户身份切换
由于 root 用户具有系统所有权限,出于安全考虑,通常会以普通用户登录和使用 Linux。但是在日常工作中,通常会碰到只有 root 用户才有权限执行的操作,这就需要使用用户身份切换的命令了。涉及用户身份切换的命令有两个:su、sudo。
su命令
su是 switch user 的缩写,表示用户切换。su命令的语法格式及选项如下:1
su [选项] [用户名]
选项:-、-l、--login:这三个选项的功能一样,代表使用 login-shell 方式(类似于真实登录方式)来切换用户,切换后宿主目录和默认的shell文件都会变成切换后的。
#超级管理员,$普通用户。- 从 root 切换到其他用户不需要输入密码,非 root 用户切换为其他用户则需要输登录密码。
- su 命令在不指定用户名时,默认切换到 root 用户。
- 当需要返回原来的用户时,使用 logout/exit 命令。
示例:普通用户user1知道root账户登录密码,要求用户user1在不注销登录的前提下查看/etc/shadow文件。
sudo命令
使用su切换用户时需知晓对应用户的登陆密码,即若切换成root用户身份,需知道root用户的登陆密码。作为root用户管理员,如何授权其他普通用户,在不需要知晓root密码的情况下,执行root权限的命令操作?此时即可使用sudo。
sudo是一种权限管理机制,依赖于/etc/sudoers这个文件,其定义了授权给哪个用户可以以管理员的身份能够执行什么样的管理命令;
sudo命令的语法格式:1
sudo [选项] [命令]
选项:-u:用于指定以哪个用户来执行命令,不指定则会使用默认用户(通常就是root用户)。
默认情况下,系统只有root用户可以执行sudo命令。需要root用户通过使用visudo命令(/usr/sbin/visudo)编辑sudo的配置文件/etc/sudoers,才可以授权其他普通用户执行sudo命令。
如下图,假如使用普通用户帐号user4通过sudo以root用户身份执行命令tail /etc/shadow时,即被提示:user4未被定义在sudoers文件中,无法执行此命令。
因此,关键在于执行 sudo 的用户是否存在于 /etc/sudoers 文件内。/etc/sudoers文件中配置的语法格式为:1
用户名或%+组名 主机名或IP地址=(可切换的身份) 绝对路径命令
说明:
- 如果对用户组授权,需要在组名前加%,例如:%mygroup1 192.168.1.150=/usr/sbin/useradd;
- 如果授予用户或组可以执行 root 所有命令,可以这样设置:%mygroup1 192.168.1.150=(ALL)ALL;
- 末尾配置多个命令以”,”逗号分隔;
- sudo 执行的命令可以精确化,例如:
1
user1 192.168.1.150=/usr/sbin/shutdown -h now #表示当 buser1 使用 shutdown 命令时,只能使用该选项,不能使用其他选项。
示例:设置普通用户user4,使其可以使用sudo命令以root用户身份修改其他所有用户登录密码,但不能修改root用户的登陆密码
未被授权前,user4使用sudo以root用户修改user1的密码时,提示user4未被定义在sudoers文件中,无法执行。如下图:
执行visudo命令,编辑sudoers文件,添加一行:用户帐号为user4;可以从任何主机登陆,执行三条命令(以root身份执行passwd命令后面不加用户名时,即代表修改root用户本身的密码,此即为第一条命令的作用),如下图,即可实现user4可以修改除root用户之外的其他所有用户的登录密码。
之后,user4通过sudo以root用户身份即可成功修改user1的密码(而不需要知道root的密码,只需要在第一次执行时输入自己的密码即可),同时无法修改root的密码,如下图:
如果不想sudo执行命令时还要输入执行用户本身的密码,可以在命令之前加上 NOPASSWD:,例如:1
2fptuser ALL=(hadoop) NOPASSWD: ALL # ftpuser可以免密执行hadoop用户的所有命令
admin ALL=(ALL) NOPASSWD: /usr/bin/tail,/usr/bin/cat,/bin/vim,/usr/bin/du # admin 可以免密执行其他用户的 tail、cat、vim、du 命令