从0开始学习Linux——用户管理
往期目录:
从0开始学习Linux——简介&安装
从0开始学习Linux——搭建属于自己的Linux虚拟机
从0开始学习Linux——文本编辑器
从0开始学习Linux——Yum工具
从0开始学习Linux——远程连接工具
从0开始学习Linux——文件目录
从0开始学习Linux——网络配置
从0开始学习Linux——防火墙配置
从0开始学习Linux——系统服务管理
从0开始学习Linxu——系统常用命令
从0开始学习Linux——进程管理
上节教程中我们学习了进程的管理,这节教程我们来学习用户管理。
一、基本概念
用户管理是系统管理员必备的技能之一。它包括添加、修改、删除用户以及管理用户组、权限等方面。
1、用户(User):
- 用户名(Username):用来标识用户的名称。
- UID(User ID):每个用户都有一个唯一的数字标识符。
- 主目录(Home Directory):用户登录后的默认目录。
- Shell:用户登录时启动的命令行界面或程序。
2、用户组(group):
- 主用户组(Primary Group):每个用户默认会有一个主组,主组通常与用户名相同。
- 附加用户组(Secondary Groups):用户可以属于多个附加组,通常用于管理权限。
3、权限(Permisssion):
Linux 使用文件权限来控制哪些用户和组可以访问特定的文件或目录:
- 读(r):可以查看文件内容。
- 写(w):可以修改文件内容。
- 执行(x):可以执行文件(如果文件是脚本或程序)。
二、用户管理
2.1 创建用户
我们可以使用useradd命令去创建用户。
useradd 用户名
上述命令会创建一个名为tom的用户。
当然useradd命令可以结合其它参数去创建更为详细的用户信息,常见参数如下所示:
- -d:指定用户的主目录
- -m:如果用户主目录不存在则自动创建
- -s:指定用户登录的shell
- -g:指定用户的主用户组
- -G:指定用户的附加用户组
上图中的命令执行以后就会去创建一个jeffrey的用户,并且指定/home/jeffrey/目录为jeffery用户的主目录,若我们不去指定,系统也会自动创建,只是目录名称和用户名保持一致,对于用户组我们没有指定的话默认用户组和用户名同名,同时我们给jeffery登录的shell指定为bash,当然我们不去指定系统分配的默认值也是bash。
补充:
在 CentOS 7 中,shell 是一个用户与操作系统之间的交互界面,它充当了命令行解释器。用户通过shell输入命令,shell 将命令解析、执行并返回输出。CentOS 7 是基于 Red Hat Enterprise Linux (RHEL) 的 Linux 发行版,因此其shell也遵循了常见的 Linux 系统约定。
1、shell的功能
- 命令解释器:用户输入的命令通过 shell 进行解析,并将其传递给操作系统内核进行执行。
- 脚本编程:用户可以编写 shell 脚本来自动化执行任务。
- 管道与重定向:shell 支持管道 (
|
) 和重定向 (>
、<
) 来控制输入输出流的流向。- 环境管理:Shell 能够设置和管理环境变量,如
PATH
、HOME
、USER
等。2、常见的shell类型
- Bash (Bourne Again Shell):CentOS 7 默认的 shell,几乎所有的 Linux 系统都会使用它。它是基于传统的 Bourne Shell (sh) 的增强版,增加了许多功能,如命令补全、历史记录、变量支持、流程控制结构等。
- sh (Bourne Shell):最早的 Unix shell 之一,CentOS 7 中通常通过符号链接指向 bash。
- zsh (Z Shell):一个功能强大的 shell,提供了更多的功能,支持强大的自动补全和插件系统。
- tcsh (TENEX C Shell):一种基于 C shell 的增强版 shell,适合喜欢 C 语言风格语法的用户。
3、shell启动文件
在 CentOS 7 中,bash 会在启动时读取一系列配置文件来初始化环境和设置。常见的启动文件包括:
- /etc/profile:全局配置文件,为所有用户提供初始化环境设置。
- ~/.bash.profile:用户级别的配置文件,通常用于设置用户特定的环境变量和启动程序。
- ~/.bashrc:每次启动一个新的 shell 会话时读取的配置文件,常用于设置别名、函数和 shell 选项。
- /etc/bashrc:系统级别的 bashrc 文件,影响所有用户。
2.2 设置用户密码
我们在创建好用户以后需要给用户设置密码。
对于密码的设置我们可以使用passwd命令。
passwd 用户名
上述命令在执行的时候说我们输入的密码过于简单,因为我设置的密码是”123456“不符合字典要求。
当然我们也可以不去管它,继续输入刚才我们输入的密码,也是可以成功的。
注意:我们在修改密码时要输入两次,第一次输入密码,第二次重复第一次输入的密码。
这里我们无视系统的提示密码也是可以修改成功的,到此为止jeffery用户的密码就是”123456“。
密码修改成功以后我们可以使用ssh命令去检查一下或者使用XSHELL工具用jeffery账户去登录Linux系统,看是否能够登录成功。
补充:
Linux启用了密码强度检查,以确保密码的复杂性足够强。
Linux 系统可能会要求密码至少包含以下内容:
- 大写字母(A-Z)
- 小写字母(a-z)
- 数字(0-9)
- 特殊字符(例如
!
,@
,#
,$
等
当然我们也可以去更改密码策略文件。
系统密码策略通常由/etc/security/pwquality.conf文件进行控制。
该文件中一些常见的选项如下所示:
- minlen:设置最小密码长度。
- minclass:设置密码必须包含多少种不同类型的字符(大写字母、小写字母、数字、特殊字符)。
- maxrepeat:允许的最大重复字符数。
2.3 查看用户信息
id 用户名
2.4 修改用户属性
我们可以使用usermod命令来修改用户的属性,包括用户名、主目录、默认 shell 等。
usermod命令常见参数如下所示:
- -d:新的用户主目录
- -e:新的过期日期
- -f:指定日期后密码失效
- -g:指定新的主用户组
- -G:指定新的附加用户组
- -l:新的登录名称
- -L:锁定用户账号
- -U:解锁用户账号
- -u:新的用户uid
- -p:修改密码
- -s:新的用户登录shell类型
修改用户信息除了用usermod命令也可以用其它命令。
修改用户主目录
usermod -d 新的用户主目录 -m 用户名
配置用户的默认shell
chsh或usermod -s shell路径 用户名
查看用户账户的密码过期信息
chage -l username
设置用户账户的过期日期
chage -E YYYY-MM-DD 用户名
2.5 删除用户
对于用户的删除我们可以使用userdel命令来完成。
当然如果我们要强制删除一个用户可以加上-r参数。
userdel 用户名
userdel -r 用户名
三、用户组管理
上述我们在创建和修改用户信息的时候提到了用户组这个概念,那么什么是用户组呢?
3.1 概念
用户组 是 Linux 系统中的一种重要的权限管理机制,它可以将多个用户组织到一起,从而允许对这些用户进行统一的管理。每个用户可以属于一个或多个用户组,而每个用户组通常用于控制用户对文件和资源的访问权限。
用户组的几个概念如下所示:
- 组名:每个用户组有一个名称,用来标识该组。
- 组ID(GID):每个用户组有一个唯一的组ID(Group ID),类似于用户ID(UID)。该ID用于系统内部标识该组。
- 用户与组的关系:每个用户至少属于一个用户组,用户可以通过用户组来管理访问权限。一个用户也可以是多个用户组的成员。
3.2 用户组的必要性
简化权限管理
用户组可以帮助系统管理员以更高效的方式管理权限。例如,如果有一组用户都需要访问同一个资源,管理员可以将这些用户放入同一个用户组,并为该组设置访问权限。这样就不需要单独为每个用户配置权限,从而简化了管理工作。例如,假设有三个用户user1、user2和user3需要访问一个特定的文件夹,那么可以将这三个用户都加入同一个用户组(比如group1),然后设置该组对文件夹的读写权限,所有组内用户都能继承该权限。
增强安全性
通过合理使用用户组,系统管理员能够更容易地控制谁可以访问哪些资源。每个用户组可以有不同的访问权限,确保只有授权的用户可以访问敏感信息。例如,某些文件或目录可以设置只允许特定用户组(如管理员组)访问,而其他用户组则无法访问。
便于管理和维护
当用户人数较多时,逐个管理用户的权限非常繁琐。使用用户组可以将相同权限需求的用户集中管理。例如,某些用户可能只需要读取文件,而另一些用户则需要修改文件。通过创建不同的用户组(如只读组和读写组),管理员可以根据不同的工作需求将用户分配到相应的组中,从而使权限管理更加高效。
方便软件与服务的权限控制
许多软件和服务(如Web服务器、数据库、应用程序等)在运行时会用到用户组权限。例如,Apache HTTP 服务器可能会以某个特定用户组运行,为了让该服务能够访问指定的文件,管理员可以将该服务的运行用户添加到相关的用户组中,进而授权访问相应的资源。
防止资源冲突
通过合理的用户组管理,管理员可以防止不同用户之间对同一资源的访问冲突。如果用户之间的权限和访问控制设计不当,可能会导致一些问题,比如多个用户同时修改同一个文件。通过将具有相似访问需求的用户组织到一个用户组内,可以减少这类问题的发生。
3.3 创建用户组
groupadd命令可以用于创建一个新的用户组。
groupadd 用户组名称
我们使用groupadd命令创建好用户组以后就会在/etc/group文件里面创建添加对应的值。
上述文件中存储的用户组的格式是group_name:x:GID:user1,user2,user3,它的含义为:
- group_name:组名
- x:密码字段,通常不使用
- GID:用户组id
- user:属于该用户组的用户
3.4 用户添加到用户组
如果我们想要将某个用户添加到指定的用户组,我们可以使用usermod命令,这个命令前面我们已经了解过了。
usermod -aG 用户组名 用户
上述命令中的两个参数-a和-G的含义如下所示:
- -a:表示追加(附加)到组,而不会将用户从其他组中移除。
- -G:表示指定要添加的组名。
3.5 删除用户组
如果我们想要删除某个用户组,可以使用groupdel命令。
groupdel 用户组名
3.6 查看用户组信息
查看某个用户所属的用户组
groups 用户名
查看某个用户组有哪些用户
getent group 用户组名
四、sudo命令
4.1 简介
sudo是 SuperUser Do 的缩写,它是一种用于以管理员权限执行命令的工具。通过sudo,用户能够执行需要 root 权限的操作,而不需要切换到 root 用户。使用sudo可以减少误操作的风险,因为普通用户仅能执行被授权的命令。
4.2 sudo工作原理
-
用户验证: 每次使用sudo时,系统会要求用户输入自己的密码,而不是 root 用户的密码。系统会验证该用户是否有权限使用sudo执行指定的命令。
-
权限配置: sudo的权限配置通常存储在/etc/sudoers文件中。该文件定义了哪些用户或用户组可以使用sudo,以及他们可以执行哪些命令。
-
执行命令: 如果用户有权限,sudo会以 root 用户的身份执行命令。命令执行完成后,用户返回到原始权限状态。
4.3 sudo操作
【sudo安装】
在Centos7系统上一般默认是安装了sudo命令。
如果没有安装可以使用下述命令进行安装。
su -c "yum install sudo"
【sudo命令】
sudo 其它命令
【sudo常见权限】
sudo命令常见选项如下所示:
- -u:以其他用户身份运行命令
- -i:以交互模式运行一个新的 shell(模拟登录)
- -s:执行指定的命令并启动一个 shell
- -l:列出当前用户的sudo权限
- -k:清除缓存的时间戳
- -v:延长密码的有效时间
这里我们简单举两个例子:
4.4 sudo权限配置
前面的教程我都是使用的是root账号进行操作,现在我切换为上述创建的tom用户。
假设现在我们以tom的身份要去关闭防火墙服务。
上述命令执行以后,说权限不够需要认证,因此我们先要输入root账号的密码。
既然权限不够那么我们就使用sudo命令去执行。
上述命令执行完成以后,我们需要输入tom账户的命令,然后提示tom用户没有在sudoer文件里面。
那么这到底是怎么回事呢?
这是因为sudo的权限配置通常存储在/etc/sudoers文件中。该文件定义了哪些用户或用户组可以使用sudo,以及他们可以执行哪些命令。
因此我们需要先用root账户去修改/etc/sudoers文件。
注意:为了安全起见,应该使用visudo命令编辑/etc/sudoers文件。visudo会自动检查语法错误,并且在编辑时锁定文件,以防止多用户同时编辑,当然你想要用文本编辑工具去编辑/etc/sudoers文件也可以。
这里为了安全我们直接在root账户下使用visudo命令去执行编辑。
visudo
注意:这里直接输入visudo命令即可,执行后就会帮我们打开/etc/sudoers文件,具体操作和前面学习的vi/vim文本编辑器类似。
/etc/sudoers文件中的每一行的格式通常如下所示:
<user> <hostname> = (<runas_user>) <commands>
上述命令中的各个参数含义如下所示:
- user:用户名,指明要配置权限的用户名。
- hostname:此规则所适用的主机。
- runas_user:指定user用户可以使用sudo以哪些身份运行命令。
- commands:指明user用户使用sudo可以执行的命令。
假设这里我们要给tom配置sudo权限。
上述配置表示tom使用sudo时拥有和root相同的权限。
当然我们也可以只给tom配置指定的sudo权限,例如只允许tom用户以sudo去执行yum和ls命令。
tom ALL=(ALL) /usr/bin/yum, /bin/ls
配置完成以后我们就可以保存退出。
注意:我们在保存退出的时候一定要强制保存退出即在命令行模式下执行wq!命令。
接下来我们就来检验一下tom用户是否拥有sudo权限以及拥有哪些权限。
sudo -l -U tom
现在我们切换为tom账户,然后看下能不能使用sudo去操作防火墙服务。
现在我们可以看出此时tom用户可以去执行防火墙服务了。
我们在执行上述sudo命令的时候我们可以发现,执行sudo命令需要输入用户的密码,那么能不能不输入密码直接执行sudo命令呢?
答案是当然可以的,我们只需要去修改/etc/sudoers文件即可。
tom ALL=(ALL) NOPASSWD: ALL
修改以后我们再来以tom身份去操作防火墙服务。
修改以后我们就可以发现,此时执行sudo命令就不需要输入tom用户的密码了。
注意:我们在给用户配置sudo权限和免密的时候一定要慎重要根据业务需求来,一定要确保账户和系统的安全,如果可能的话,使用最小权限原则,即只授予 tom
必需的命令权限。
五、su命令
我们在日常操作过程中可能会出现一个场景:同时操作几个账户,按照前面教程的做法,我们需要重新开个系统登录账户或者使用XSHELL重新构建一个会话。这样操作就很麻烦,那么能不能再一个会话或者一个系统中进行账号的自由切换呢?答案当然是可以的。
su(substitute user)是一个允许你以不同用户身份登录系统的命令。它通常用于切换到 root 用户或者其他普通用户。
su - 用户名
注意:当我们不去指明用户名的时候默认切换到root账号。
su 用户名
当我们使用"su 用户名"的时候,若用户名是root,那么就需要输入密码,若不是root则不需要输入密码。
“su - 用户名”命令和“su 用户名”命令都可以切换用户,那么它们之间有啥区别呢?
特性 | su 用户名 | su - 用户名 |
---|---|---|
切换用户身份 | 是 | 是 |
切换工作目录 | 保持当前目录(原用户目录) | 切换到指定用户的家目录(/home/用户名) |
加载环境变量 | 否 | 是 |
加载用户配置文件 | 否(不会加载.bash_profile) | 是(会加载.bash_profile 或.bashrc) |
行为模拟 | 不完全模拟登录 | 完全模拟登录,类似登录到用户的 shell |
su命令常见选项如下所示:
-
-:加载目标用户的环境。
-
-c:执行一条命令后退出。例如,我们要以 root 身份执行某个命令而不切换整个用户。
su -c 'ls /root'
这个命令会以 root 用户身份执行ls /root,并显示 /root 目录下的内容,然后退出 root 用户。
上述我们讲解sudo命令的时候,讲解过sudo -u命令可以实现以某个身份执行命令,那么它们之间的区别如何呢?
- su:直接切换到目标用户,通常需要输入目标用户的密码(尤其是 root)。如果使用 su -,会加载目标用户的环境。
- sudo:允许你以特定用户(通常是 root)的身份执行命令,而不需要切换用户。你只需要输入自己的密码,而不是目标用户的密码。
但是更多的时候我们可以选择使用sudo命令,理由如下:
- 安全性:sudo只授权执行特定的命令,而不是完全切换用户。这可以减少潜在的安全风险。
- 日志记录:sudo会记录执行的命令和操作,而su通常不会。管理员可以通过查看 sudo/var/log/auth.log来了解用户的活动。
- 灵活性:通过sudo,你可以精确控制哪些用户能够执行哪些命令,这为系统管理提供了更高的灵活性和可控制性。
本节教程内容就到这里,更多内容在后续教程中讲解。