第五章 Linux 基本操作和用户及组管理本节所讲内容:
- 设置系统光盘开机自动挂载
- 配置本地 YUM 源
- 创建可用实验快照
- 用户和组的相关配置文件
- 管理用户和组
- 实战:进入 Centos 紧急模式恢复 root 密码
0.1 设置系统光盘开机自动挂载
[root@xuegod63 ~]# vim /etc/fstab #在文档最后,添加以一下红色内容:
/dev/cdrom /mnt iso9660 defaults 0 0
[root@xuegod63 ~]# mount -a [root@xuegod63 ~]# lsblk
mount: /dev/sr0 写保护,将以只读方式挂载
[root@xuegod63 ~]# ls /mnt/ #可以查看到此目录下有内容,说明挂载成功AppStream BaseOS EFI images isolinux media.repo TRANS.TBL
/etc/fstab 说 明第一列 Device
磁盘设备文件或者该设备的 Label 或者 UUID 第二列 Mount point
设备的挂载点,就是你要挂载到哪个目录下第三列 filesystem
磁盘文件系统的格式,包括 ext2、ext3、reiserfs、nfs、vfat 等第四列 parameters
文件系统的参数
第五列:能否被 dump 备份命令作用
dump 是一个用来作为备份的命令。通常这个参数的值为 0 或者 1

第六列 是否检验扇区
开机的过程中,系统默认会以 fsck 检验我们系统是否为完整(clean)。
0.2 配置本地 YUM 源
yum 的一切配置信息都储存在一个叫 xxx.repo 的配置文件中,这些.repo 文件,通常位于
/etc/yum.repos.d 目录下什么是 repo 文件
repo 文件是 yum 源(软件仓库)的配置文件,通常一个 repo 文件定义了一个或者多个软件仓库的详细信息,例如我们将从哪里下载、安装、升级软件包,repo 文件中的设置将被 yum 读取和应用
查看原有的文件
[root@xuegod63 ~]# cd /etc/yum.repos.d [root@xuegod63 yum.repos.d]# ls
CentOS-AppStream.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Base.repo CentOS-Extras.repo CentOS-PowerTools.repo CentOS-centosplus.repo CentOS-fasttrack.repo CentOS-Sources.repo CentOS-CR.repo CentOS-HA.repo CentOS-Vault.repo
实战 1:在 centos7 上,基于光盘镜像创建一个本地 yum 源。创建一个新的 yum 源配置文件, yum 源配置文件的结尾必须是.repo。 CentosStream8 和 centos7 配置 yum 源不一样。
[root@xuegod63 ~]# mv /etc/yum.repos.d/* /opt #先移走自带的 yum 配置文件,方便查看本地源的效果在 centos7 做法如下:
[root@xuegod63 yum.repos.d]# vim /etc/yum.repos.d/centos7.repo # 写入以下红色内
容
[CentOS7] name=CentOS-server baseurl=file:///mnt enabled=1 gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
RHEL 在发布其官方的 RPM 包时(如本地 RHEL 光盘及 FTP 空间包),会提供一个 GPG 密钥文件 gpgkey。用户下载安装 RPM 包时,引入 RPM GPG 密钥,用来验证 RPM 包是不是 RHEL 官方签名的。
参数说明:
[CentOS7] —->yum 源的 ID,必须唯一name=CentOS-server >描述信息
baseurl=file:///mnt > /mnt 表示的是光盘的挂载点,file:后面有 3 个///
baseurl=https://mirrors.163.com/centos/7.9.2009/os/x86_64/ baseurl=https://mirror.tuna.tsinghua.edu.cn/centos/7.9.2009/os/x86_64
———-> 以上两个地址是基于 web 服务器提供的 yum 源
baseurl=ftp://192.168.1.63/pub ———-> ftp://192.168.1.63/pub 这是基于 FTP 服务器提供的 yum 源
enabled=1 >开启仓库
gpgcheck=0 >0 取消密钥验证。如果为 1,表示启动密钥验证
gpgkey ———> 指定密钥的位置,比如阿里源密钥的位置如下gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
清空并生成缓存列表
[root@xuegod63 yum.repos.d]# yum clean all #清空 yum 缓存
[root@xuegod63 yum.repos.d]# yum list #查看仓库中的软件包列表,同时生成缓存列表,也可以写成 yum makecache
为 repo ‘CentOS7’ 下载元数据失败
错误:为 repo ‘CentOS7’ 下载元数据失败
注:失败很正常。因为你在 centos8 下操作,换成 centos7 下就可以了。
[root@xuegod63 yum.repos.d]# mv centos7.repo /opt/ #将 centos7.repo 移到/opt 目录
下
阿 里 源 地 址 : https://developer.aliyun.com/mirror/centos https://developer.aliyun.com/mirror/epel
扩展: epel 是(Extra Packages for Enterprise Linux)的缩写,是额外的扩展包。网易源地址:
http://mirrors.163.com/centos/ 清华源地址:
https://mirror.tuna.tsinghua.edu.cn/centos/
实战 2:在 Centos-Stream8 上,基于光盘镜像创建一个本地 yum 源。在 CentOS-Stream8 光盘镜像中把 yum 软件源分成了两部分
一个是 BaseOS
一个是 AppStream
BaseOS 存储库 - BaseOS 存储库以 RPM 格式提供操作系统核心功能的软件
AppStream 存储库 - Application Stream 存储库以 RPM 格式提供用户空间中运行的软件。在 centos7 的光盘镜像,rpm 软件安装包都是放在/mnt/Packages/下
在 centos8 的光盘镜像,rpm 软件安装包分别放在/mnt/BaseOS/Packages/和
/mnt/AppStream/Packages/下
repodata 目录下的文件记录了 Packages 下 RPM 软件安装包的相互依赖关系配置方法和 yum 一样
[root@xuegod63 yum.repos.d]# cd /etc/yum.repos.d/ [root@xuegod63 yum.repos.d]# mkdir /opt/oldyum [root@xuegod63 yum.repos.d]# mv * /opt/oldyum [root@xuegod63 yum.repos.d]# ls
[root@xuegod63 yum.repos.d]# vim centos-stream8.repo #插入以下内容[cs8-BaseOS]
name=CentOS-BaseOS baseurl=file:///mnt/BaseOS gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[cs8-AppStream] name=CentOS-AppStream baseurl=file:///mnt/AppStream gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[root@xuegod63 yum.repos.d]# yum clean all [root@xuegod63 yum.repos.d]# yum makecache [root@xuegod63 yum.repos.d]# yum -y install httpd
安装一个 httpd 服务器,如果你之前用网络源安装过 httpd 服务,需要先 yum -y remove httpd*
卸载服务,然后用本地源安装,但是你用网络源安装的 httpd 服务的依赖库可能比本地光盘镜像源的版本高,所以有可能导致本地光盘源安装 httpd 服务失败,继续使用网络源则不会出现此问题。
[root@xuegod63 yum.repos.d]# yum -y install lrzsz #安装一个 lrzsz 包确认本地 yum 源配置可用。
实战 3:在 Centos-Stream8 上,创建一个网络 yum 源
[root@xuegod63 yum.repos.d]# vim centos-stream8.repo #修改以下内容[cs8-BaseOS]
name=CentOS-BaseOS
baseurl=https://mirror.tuna.tsinghua.edu.cn/centos/8-stream/BaseOS/x86_64/os/ gpgcheck=0
enabled=1
[cs8-AppStream] name=CentOS-AppStream
baseurl=https://mirror.tuna.tsinghua.edu.cn/centos/8-stream/AppStream/x86_64/os/ gpgcheck=0
enabled=1
[root@xuegod63 yum.repos.d]# yum clean all [root@xuegod63 yum.repos.d]# yum makecache [root@xuegod63 yum.repos.d]# yum -y install httpd
附:阿里 centos-stream8 YUM 源http://mirrors.aliyun.com/centos/8-stream/BaseOS/x86_64/os/ http://mirrors.aliyun.com/centos/8-stream/AppStream/x86_64/os/
新安装 centos7 后,yum 运行出现下面的错误:
解决办法:rm -rf /var/run/yum.pid
0.3 创建可用实验快照
今天的虚拟机是真正可以使用的环境,为了保证后期误操作可能导致不可用的情况,所以要做一个快照,方便到时直接恢复到当前可用情况。
具体步骤如下:

虚拟机——》快照——》拍摄快照 》自定义快照名如“可用实验快照”
用户一般来说是指系统的使用者,使用者可以使用这些名称来登录使用计算机,除了使用者之外,一些系统服务也需要含有部分特权的用户账户运行;因此出于安全考虑,用户管理应运而生,它加以明确限制各个用户账户的权限,root 在计算机中用拥有至高特权,所以一般只作管理用,非特权用户可以通过SU 或 SUDO 程序来临时获得特权。
Linux 系统通过用户和用户组实现访问控制,包括对文件访问、设备使用的控制。
1 人可以拥有很多账户,只不是彼此名称不同,比如 root 名称已经占用就不能再用了,此外,任意用户可能从属某个用户组,此用户可以加入某些已经存在的组来获得该组的特权。
每 1 个文件的属性中都有一个文件拥有者和所属组。另外,还有三种类型的访问权限:读(read)、写(write)、运行(execute)。我们可以针对文件的属主、属组、而设置相应的访问权限。再次,我们可以通过 ll 或 stat 命令查询文件属主、属组和权限。
[root@xuegod63 ~]# ll | tail -2
-rw———-. 1 root root 1374 3 月 12 17:34 anaconda-ks.cfg
-rw-r—r—. 1 root root 1529 3 月 12 18:10 initial-setup-ks.cfg [root@xuegod63 ~]# stat anaconda-ks.cfg
文件:”anaconda-ks.cfg”
大小:1680 块:8 IO 块:4096 普通文件设备:803h/2051d Inode:16797763 硬链接:1
权限:(0600/-rw———-) Uid:( 0/ root) Gid:( 0/ root)
0.4 用户账号
1. **用户的分类**
Linux 用户三种角色:超级用户,普通用户,虚拟用户。超级用户: root 拥有对系统的最高的管理权限,UID=0 普通用户:
系统用户 UID 范围:1-999(centos7/8 版本) 1-499(centos6 版本) 本地用户 UID 范围:1000+(centos7/8 版本) 500+(centos6 版本)
UID:即每个用户的身份标示,类似于每个人的身份证号码.
虚拟用户:伪用户 一般不会用来登录系统的,它主要是用于维持某个服务的正常运行.如:ftp, apache
用户基本信息保存位置:/etc/passwd 下图是用户和组的关系:
一对一:一个用户可以存在一个组中; 一对多:一个用户可以存在多个组中多对一:多个用户可以存在一个组中; 多对多:多个用户可以存在多个组中


1. **配置文件**
| 名 称 | 文件路径 | 说 明 |
|---|---|---|
| 用户配置文件 | /etc/passwd | 记录了每个用户的一些基本属性,并且对所有用户可 读,每一行记录对应一个用户 |
| 用户组文件 | /etc/group | 用户组信息存放文件,并且组名不能重复 |
| 用户密码信息文件 | /etc/shadow | 因为 passwd 文件对所有用户是可读的,为安全起见把密码从 passwd 中分离出来放入这个单独的文件,该文 件只有 root 用户拥有读权限,从而保证密码安全性 |
0.5 用户管理
1. **用户命令**
命令:useradd
useradd -d -u “UID” -g “初始组” -G “附加组” -s “登陆的 shell” 用户
-u: 指 定 uid
-d: -d 用户主目录路径, 可以指定用户家目录
-M: 不创建用户的家目录
-g:设置用户初始组的名称或数字 ID;该组必须是存在的;如果没有设置该选项,useradd 会根据
/etc/login.defs 文件中的 USERGROUPS_ENAB 环境变量进行设置。默认 USERGROUPS_ENAB yes 会用和用户名相同的名字创建群组.
-G:用户要加入的附加组列表;使用逗号分隔多个组,不要添加空格;如果不设置,用户仅仅加入初始组。(一个用户只允许有一个主组,可以有多个附属组)
-s:用户默认登录 shell 的路径;启动过程结束后,默认启动的登录 shell 在此处设定;请确保使用的 shell 已经安装,默认是 Bash。有时候需要禁止某些用户执行登录动作,例如用来执行系统服务的用户。将 shell 设置成 /sbin/nologin 就可以禁止用户登录。
1. **添加登录用户**
例:添加一个名为 harry 的用户,并使用 bash 作为登录的 shell [root@xuegod63 ~]# useradd harry
[root@xuegod63 ~]# tail -1 /etc/passwd harry:x:1001:1001::/home/harry:/bin/bash
说明:此命令会自动创建 harry 组,并成为 harry 用户的默认主组,同时默认的登录 shell 是 bash 用户帐户的全部信息被保存在/etc/passwd 文件。这个文件以如下格式保存了每一个系统帐户的所
有信息 (字段以“:”分割)
harry:x:1001:1001::/home/harry:/bin/bash #每行含意如下: harry:用户名
x:密码占位符
1001:用户的 UID,使用正整数表示,范围可以是 0-65535
1001:用户所属组的 GID,它都是用数字来表示的
用户描述信息:对用户的功能或其它来进行一个简要的描述,此字段会出现在登录用户界面,可以通过点击输入对应密码进行登录,却并不能手动输入此字段代替用户名。
/home/harry:用户主目录(shell 命令提示符中用“~”表示)
/bin/bash:用户登录系统后使用的 shell
例:查看系统中,支持哪些 shell
[root@xuegod63 ~]# cat /etc/shells #查看系统中,支持哪些 shell
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
再 安 装 一 种 名 叫 zsh 的 shell [root@xuegod63 ~]# yum install zsh -y
[root@xuegod63 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/bin/zsh
/bin/zsh
[root@xuegod63 ~]# zsh
[root@xuegod63]~# cd /etc/sysconfig/network-scripts [root@xuegod63]/etc/sysconfig/network-scripts# 注:zsh 这种 shell 会显示绝对路径
1. **指 定 用 户 UID : useradd -u 用 户 ID**
[root@xuegod63 ~]# useradd -u 1100 oracle [root@xuegod63 ~]# id oracle
uid=1100(oracle) gid=1100(oracle) 组 =1100(oracle) [root@xuegod63 ~]# tail -1 /etc/passwd oracle:x:1100:1100::/home/oracle:/bin/bash [root@xuegod63 ~]# ls -a /home/oracle/
. .. .bash_logout .bash_profile .bashrc .mozilla
1. **指定用户主目录**
[root@xuegod63 ~]# useradd -d /opt/ftp ftp1 [root@xuegod63 ~]# ls -a /opt/ftp [root@xuegod63 ~]# tail -1 /etc/passwd ftp1:x:1101:1101::/opt/ftp:/bin/bash
1. **指定用户的主组例:**
[root@xuegod63 ~]# useradd xuegod [root@xuegod63 ~]# id xuegod
uid=1103(xuegod) gid=1103(xuegod) 组 =1103(xuegod) [root@xuegod63 ~]# useradd -g xuegod xuegod2 [root@xuegod63 ~]# id xuegod2
uid=1104(xuegod2) gid=1103(xuegod) 组 =1103(xuegod)
1. **指定用户的附加组**
我们也可以把这个附属组称为补充组,用户可以有 0 个或多个附加组的成员
如果一个组有多个成员,我们是可以在/etc/group 文件中最后一个字段看到的[root@xuegod63 ~]# useradd -G xuegod,oracle,root xuegod3 [root@xuegod63 ~]# id xuegod3
uid=1104(xuegod3) gid=1104(xuegod3) 组
=1104(xuegod3),1100(oracle),1102(xuegod),0(root) [root@xuegod63 ~]# vim /etc/group

1. **创建用户的另外一个命令[root@xuegod63 ~]# adduser xuegod4 [root@xuegod63 ~]# id xuegod4**
uid=1106(xuegod4) gid=1106(xuegod4) 组 =1106(xuegod4) [root@xuegod63 ~]# which adduser
/usr/sbin/adduser
[root@xuegod63 ~]# ll /usr/sbin/adduser
lrwxrwxrwx. 1 root root 7 9 月 19 2017 /usr/sbin/adduser -> useradd 注: adduser 是 useradd 的软链接
1. **删除用户**
语法: userdel [options] 用户名
选项:-r 删除的时候,会同时删除用户的家目录和/var/mail 下的目录[root@xuegod63 ~]# userdel -r xuegod3
1. **密码的文件**
[root@xuegod63 ~]# head -3 /etc/shadow root:$6$C88LCVx5ZjfBU7xv$cKcdyNeTFmOYTs9NbRZDTA4hGcbMXc/5hQEWZKCtNyLql
Bagrjct.pMfs39iEaF1UbEvcOzWZHMDf9Q5KojXM1::0:99999:7:::
给用户添加密码:
[root@panda home]# passwd oracle #交互式修改密码Changing password for user oracle.
New password:
BAD PASSWORD: The password is shorter than 8 characters Retype new password:
passwd: all authentication tokens updated successfully. [root@xuegod63 ~]# echo 123456 | passwd —stdin xuegod #不交互[root@xuegod63 ~]# echo 123456 | passwd —stdin harry
互动: 两个用户的密码都是 123456 一样的, 那么 shadow 中加密的 hash 值一样吗? 答: 不一样。 因为 salt(撒盐加密)不一样
把 2 段加密的互换还能登陆吗?salt 什么时候指定的?
答:可以登录,salt 在加密过程中随机生成,保护了加密密码的机密性。
1. **查看用户相关命令: 查看用户相关命令:**
id #用户和组的信息#whoami #查看当前有效用户名
#who #显示目前登入系统的用户信息。
#w # w 命令用于显示已经登陆系统的用户列表#users #用于显示当前登录系统的所有用户的用户列表
1. **修改用户信息**
语法:usermod 【参数】用户名常用参数:
| -u | UID | |
|---|---|---|
| -d | 宿主目录 | |
| -g | 起始组 | #只能有一个 |
| -G | 附加组 | #可以有多个 |
| -s | 登录 shell | |
| -L | 锁定 |
例 1:修改 UID
[root@xuegod63 ~]# id oracle
uid=1100(oracle) gid=1100(oracle) 组 =1100(oracle) [root @xuegod63 ~]# usermod -u 1111 oracle [root @xuegod63 ~]# id oracle
uid=1111(oracle) gid=1100(oracle) 组 =1100(oracle)
例 2:修改 shell
例 3:更改用户主目录
[root@xuegod63 ~]# usermod -m -d /opt/aaa xuegod
-m 选项会自动创建新目录并且移内容到新目录里面例 4:添加用户描述信息
[root@xuegod63 ~]# usermod -c “hello world” xuegod [root@xuegod63 ~]# grep xuegod /etc/passwd mk:x:1000:1000:hello world:/opt/aaa:/bin/bash
总结:如果你记不住命令, 那么直接改 vim /etc/passwd 一样的。
0.6 实战:进入紧急模式恢复root 密码
1. **实战场景找回 centos7 系统中 root 密码**
公司一台 centos7 系统,忘记 root 密码了,需要你快速把 root 密码修改为 xuegod,找回 root 身份。
实验环境:开启一台 Centos7 系统
首先重启,按↑↓键,进入如下界面,选择第一项,按下 e 键进行编辑
#进入编辑模式后会看到这些信息。找到“Linux16”开头的行,在 Linux16 的行尾空格后添加“rd.break”


这里改成 rw,则不需要重新挂载,直接以读写挂载改完之后,按下 Ctrl+X 进入紧急模式
原理:打断系统正常启动,然后进一个 bash 环境,系统并没有真正的启动
emergency [iˈmɜ:dʒə nsi] 紧 急查看系统根挂载情况:

发现是只读的。需要重新以 rw 方式挂载/sysroot 。
mount -o remount,rw /sysroot #重新挂载,使其拥有读写权限
换根,修改密码
chroot 命令用来在指定的根目录下运行指令
chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/ 位置
在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件。
输入:LANG=en_US.UTF-8 #修改语言环境为英文,这样不会显示乱码passwd #开始修改密码
注:如果系统的 selinux 开启着,则需要执行命令: touch /.autorelabel 以更新系统信息让SELinux 生效,否则重启之后密码修改不会生效,先退出当前根,reboot 重启系统。我们已经关闭selinux,不需要创建/.autorelabel 。

扩展:创建此文件:开启 selinux 的情况下需要创建此文件,因为在 rd.break 环境下 SELinux 是不生效的。在不生效的情况下我们修改了用户的密码,也就是修改了/etc/shadow 文件,所以密码文件的安全上下文的特性会被取消。如果没有让系统在启动时自动恢复 SELinux 的安全上下文,系统会报错“无法登录”,所以 SELinux 在 Enforcing 模式下的时候(如在 disabled 模式下则不用),在根目录下 touch 隐藏文件 autorelabel 会让系统在重启时以 SELinux 默认类型重新写入 SELinux 安全上下文。
