当前位置: 首页 > article >正文

从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 能够设置和管理环境变量,如 PATHHOMEUSER 等。

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/sudo​​​​​​​ers文件中。该文件定义了哪些用户或用户组可以使用sudo​​​​​​​,以及他们可以执行哪些命令。

因此我们需要先用root账户去修改/etc/sudoers文件。

注意:为了安全起见,应该使用visudo命令编辑/etc/sudo​​​​​​​ers文件。visudo会自动检查语法错误,并且在编辑时锁定文件,以防止多用户同时编辑,当然你想要用文本编辑工具去编辑/etc/sudoers文件也可以。

这里为了安全我们直接在root账户下使用visudo命令去执行编辑。 

visudo

 注意:这里直接输入visudo命令即可,执行后就会帮我们打开/etc/sudo​​​​​​​ers文件,具体操作和前面学习的vi/vim文本编辑器类似。

 /etc/sudo​​​​​​​ers文件中的每一行的格式通常如下所示:

<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/sudo​​​​​​​ers文件即可。

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命令,理由如下:

  1. 安全性:sudo只授权执行特定的命令,而不是完全切换用户。这可以减少潜在的安全风险。
  2. 日志记录:sudo会记录执行的命令和操作,而su通常不会。管理员可以通过查看 sudo/var/log/auth.log来了解用户的活动。
  3. 灵活性:通过sudo,你可以精确控制哪些用户能够执行哪些命令,这为系统管理提供了更高的灵活性和可控制性。

本节教程内容就到这里,更多内容在后续教程中讲解。


http://www.kler.cn/a/392271.html

相关文章:

  • Flutter Getx状态管理
  • jmeter常用配置元件介绍总结之后置处理器
  • openSUSE 环境下通过 zypper 安装软件
  • java导出pdf
  • Linux 进程线程间通信总结
  • AtomicInteger 和 AtomicIntegerFieldUpdater的区别
  • 索引的工作流程与执行原理
  • 【Qt】QtCreator安装安卓环境
  • React Query在现代前端开发中的应用
  • Mysql高可用架构方案
  • 腾讯云产品推荐----轻量级云服务器
  • 重学 Android 自定义 View 系列(六):环形进度条
  • Input子系统(一)、从内核文档入门(草稿,进度:10%)
  • 进程调度算法
  • 高频 SQL 50 题(基础版)连接部分
  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • Python中的闭包和装饰器
  • 方案丨车险保单OCR:3秒钟完成保单审核
  • 从0开始学习机器学习--Day24--核函数
  • LeetCode 328.奇偶链表
  • 【Lucene】原理学习路线
  • Redis架构模式有几种?适用哪些场景?
  • Three.js性能优化和实践建议
  • Leetcode 3350 Adjacent Increasing Subarrays Detection II
  • ResNet网络详解
  • 【Spring】@Autowired与@Resource的区别