开始系统学习Linux(1):RHEL、SSH、Shell
目录
前言
Linux 在我的生活中可以说是最熟悉的陌生人,一方面因为工作或学习而熟悉基本的命令及应用,另一方面大部分都是以实用为主的现学现用所以并无体系。最近整理技术栈时打算把它作为基础内容重新系统化的过一遍,以拿下红帽 RHCE 为验收,以写博客输出为过程。
我打算做一个连载系列记录我的学习笔记,本篇则是正式开始之前的杂谈,做一些基本梳理。
初识红帽
Red Hat(红帽)是一家以开源软件和企业级 Linux 解决方案为核心业务的软件公司,也是 Linux 企业级发行版领域的重要厂商。旗下有多款开源产品。比如企业级 Linux 发行版 RHEL、开源分布式存储 Ceph、开源自动化工具 Ansible。
RHEL 全称 Red Hat Enterprise Linux 红帽企业级 Linux 操作系统。Linux 是一个开源的操作系统内核。内核+软件包组成一个操作系统,也就是我们所说的 Linux 发行版。RHEL 即 Linux 的一个发行版,由 Linux 内核+红帽软件包组成。
Linux 发行版生态非常庞大,其中 Debian 系和 Red Hat 系是企业服务器领域常见的两类发行版生态。
不同发行版生态在软件包格式和包管理工具等方面存在差异,例如 Debian 系通常使用 .deb 软件包和 apt,RHEL 系通常使用 .rpm 软件包,并通过 dnf 等工具进行软件包管理。
Linux 由于其开源、长时间运行稳定等特性,更多用于企业服务器领域,虽然有面向个人终端 PC 的发行版比如 Ubuntu,但主流还是将 Linux 部署在服务器、嵌入式等领域。
操作系统本质是一套软件,跑在硬件之上,作为软件运行的介质,连接软件和硬件。操作系统的作用有启动时初始化、内存和网络管理、文件系统管理、识别硬件资源等,最重要的就是为跑在上面的软件分配硬件资源,这是操作系统的核心功能。

认识工作环境
Shell
Shell 经常会和终端、命令行、bash、cmd 这些概念所混淆,事实上它们处于不同层次,想要弄清楚它们之间的关系需要先认识人与计算机交互的两种模式:GUI 和 CLI 。
GUI 即 Graphical User Interface 图形化界面,用户通过桌面环境与图标、菜单、按钮等图形元素交互从而操作计算机启动程序、呈现多媒体数据信息。
CLI 即 Command Line Interface 命令行界面,是一种通过输入文本命令与计算机系统进行交互的方式。终端或控制台则是这种交互方式常见的承载环境。
其中,GUI 交互方式通常通过桌面环境来实现,比如 Windows 的 Windows 桌面、Linux 的 GNOME 或 KDE 桌面环境,这些图形化的桌面提供了一系列交互按键与图标给用户,用户通过点击即可启动程序、浏览数据信息。GUI 交互方式是我们最常用的交互方式。而 CLI 交互方式则通常通过终端与 shell 实现,而终端和 shell 又由具体的软件实现。
终端(terminal)负责提供字符输入输出环境,为用户呈现字符界面,在这里接收用户的命令输入,并展示执行的结果。终端在不同的操作系统上通常由不同的具体软件实现,比如 Windows 上的 Terminal,Linux 上的 GNOME Terminal。
shell 负责解析用户输入的命令、执行 shell 内建命令或启动相应的外部程序和建立标准输入、标准输出、标准错误。bash、cmd、powershell 都是具体的 shell ,即 shell 的软件实现,不同的 shell 通常有着不同的语法和解释特性。
注意 shell 并不负责提供输入输出接口,换言之是终端负责接收用户的输入并将输入送给 shell 进行解析和执行。
具体而言,用户通过键盘向终端输入命令,终端接收到用户的字符输入并将之交给 shell,shell 解析命令后,会根据命令的语法和重定向、管道等操作,为启动的进程建立和组织标准输入、标准输出和标准错误。例如,命令行参数会作为参数传递给程序,而程序的标准输入、标准输出和标准错误则可以连接到终端、文件或其他进程。
举一个具体的例子:
打开 win、搜索 Terminal,找到 Windows 上的终端,点击打开

打开后,它默认的选项卡是 Windows PowerShell,即提供一个输入输出界面与 Windows PowerShell 这个 shell 交互,点击选项卡右侧的加号或者小下三角,可以打开多个终端,每一个选项卡表示你正在对哪个 shell 做输入并展示输出。这个就是所谓的终端负责提供输入输出界面并将用户输入交给 shell。

shell 则负责解析命令并建立标准输入、标准输出、标准错误通道。这个怎么理解呢?简单来说,命令本身是可执行程序,shell 解析命令后在环境变量中找到这个命令可执行程序所在的路径然后启动该程序,CPU 执行该可执行程序的二进制机器指令,执行完成后输出到 shell 指定的位置。(当然,内建命令由 cmd 自己实现,不用去环境变量里找可执行程序路径,这里描述的是外部程序实现的命令)
比如在 Windows Terminal 中,向 cmd 这个 shell 键入命令:
ipconfig
Terminal 接收到用户输入此命令,交给 cmd,cmd 发现这不是一个内建命令,是一个外部程序,因此 cmd 会在 PATH 这个环境变量的值中记录的地址尝试搜索该命令代表的程序并最终在 C:\Windows\System32\ipconfig.exe 这个路径找到了此应用程序,接下来建立标准输入标准输出,由于没有使用重定向符,ipconfig.exe 的标准输出默认连接到当前终端,因此输出会显示在 Terminal 窗口中,接下来 cmd 启动该应用程序,由 CPU 执行 ipconfig.exe 的机器指令,并最终把执行结果返回到终端页面,于是我们在 Terminal 里看到了执行命令的结果。

如果我们传给 shell 的命令中有重定向符,那么 shell 就会在解析命令的时候建立标准输出到你指定的位置:
ipconfig > D:\ip.txt
这一次在 Terminal 终端上见不到 ipconfig 命令的输出了,因为我们重定向到了一个文件里,执行结果会被输出到该文件中。


同理 Linux 系统,接下来展示的是在 RHEL9 虚拟机上,打开 GNOME Terminal,向 bash 这个 shell 输入指令,并要求 shell 建立重定向输出到指定位置。
ifconfig > /tmp/ip.txt

总结
GUI 和 CLI 是两种常见的人机交互方式。GUI 通常通过桌面环境等图形界面实现;CLI 则通常通过终端环境和 Shell 实现。Terminal 负责提供字符输入输出环境,Shell 负责解析用户输入的命令,并执行内建命令或启动相应程序。Bash、cmd.exe、PowerShell 都是具体的 Shell。Shell 启动的程序由 CPU 执行其机器指令,并通过系统调用请求内核提供文件、网络、设备等系统资源。
Linux 访问方式
Linux 操作系统是软件,软件要跑在硬件上,所以要么真的组装一台物理机然后安装 Linux 操作系统,要么使用虚拟机在已有的物理机上虚拟出来一套硬件然后安装 Linux 操作系统。无论如何,Linux 系统常见访问方式主要有以下这几种:
IO设备直连
这是最传统的方式,在机房的机柜上有一台装载了 Linux 操作系统的服务器,它的背板上向外暴露了几个线缆接口,通过将 IO 设备(键盘、鼠标、显示屏)带到机柜面前,连接上这些接口,随后就可以看到该服务器的图形化界面或者命令行界面显示在显示屏上。

虚拟机控制台
在学习或个人实验环境下通常使用这种方式访问 Linux 系统,使用类似 VMware 的虚拟化软件创建一个虚拟机并安装 Linux 操作系统,随后在 VMware 的页面里启动虚拟机进入使用。从使用体验上看,它类似于直接操作一台物理机:虚拟机软件提供虚拟的显示器、键盘和鼠标,用户可以直接进入 Linux 的 GUI 或 CLI。
网络远程访问
这是目前最实用的方式,由于云计算的兴起,目前大部分中小型企业的业务模式都是将业务部署在租用的数据中心的云服务器上,作为运维管理人员总不可能一有问题就专门抱着键盘去一趟数据中心的机房,因此通常会采用远程管理的方式。具体而言则是本地通过在终端执行 SSH 命令或者使用基于 SSH 协议的远程软件比如 Xshell 获得远程服务器的 Shell 会话。在终端中用户输入的命令会通过加密连接传输到远程服务器主机并由服务器的 Shell 执行,结果也会适时的通过加密传输返回到本地终端中。
初步使用 shell
远程登录
接下来通过演示一台 RHEL9 虚拟机来初步使用 shell。
首先在 VMware 选项卡中启动虚拟机。

该虚拟机的网络使用 NAT 模式,应用 VMnet8 这张虚拟网卡,本次实验宿主机 IP 地址 192.168.200.1,RHEL9 虚拟机 IP 地址 192.168.200.129。


我们首先演示在 Windows 的 cmd 直接使用 SSH 命令连接。命令如下:
ssh root@192.168.200.129
输入该命令后键入 root 用户密码,即可以 root 用户身份登录 RHEL9 虚拟机并执行命令。

该命令拆解如下
ssh:命令程序名
root:登录的身份,即用户名
@:分隔符,分开登录的用户名以及目标主机IP地址
192.168.200.129:登录的操作系统所在的物理机或虚拟机的IP地址
接下来演示使用 Xshell 远程软件登录 RHEL9 。打开 Xshell ,在弹出的窗口单击左上角新建来创建一个新的会话。

其中,名称用于在 Xshell 内标记该会话,主机是该会话目标主机的 IP 地址。

点击连接开始验证登录凭证。

为了测试方便我们就用 root 身份登陆了。


接下来即可在 Xshell 提供的命令行页面中远程执行命令。

当然 Xshell 也可以当作类似 cmd 的终端使用,CTRL+D 断开当前会话,输入刚刚在 cmd 中输入的 SSH 命令,依旧会进入身份验证,通过后完成远程登录。

最后还是简单解释一下,以上我们的实验中,使用了 Windows Terminal 和 Xshell 这两种终端,而在宿主机的 shell 中执行的命令只有 SSH 命令,在下面的实验中我们会在获得到的虚拟机 shell 会话中输入命令,此时解析该命令的 shell 就不是宿主机的 shell,而是 REHL9 虚拟机的 bash shell。
我们的行为概括为:宿主机启动终端,键入 SSH 命令,在宿主机的 cmd shell 中解析命令并执行,拉起 SSH 进程,建立网络连接,连接的两端进程分别是宿主机的 ssh 和虚拟机的 sshd,接下来我在宿主机终端中输入的命令会由该网络连接送到虚拟机由虚拟机的 bash shell 执行再通过网络连接送回到宿主机终端显示。
在这个通信中,宿主机的 Shell 负责执行 SSH 客户端;SSH 客户端与远程 sshd 建立 SSH 会话;登录后,用户输入的命令由远程 RHEL 9 上的 Bash 解析和执行,命令输出再通过 SSH 会话返回终端显示。
认识命令行
无论是直接呼出终端还是远程登录进入 shell ,登录后都会看到这个

或者

拆解如下:
[root@myRHEL9 ~]#
[test@myRHEL9 ~]$
————————————————————————————————————————————————————————————————————————————————————
root/test:当前登录的用户的用户名
@:分隔符,隔开用户名和主机名
myRHEL9:当前登录到的主机的主机名,这里采用简短显示,即只显示主机名的一部分。比如你的主机名叫做 test.example.com ,那么这里显示的就只有 test(第一个.之前的字符)。
~:当前工作目录的显示结果,这里的~是家目录的缩写,代表当前登录用户的家目录。
#/$:分隔符,键入的命令显示在其之后,同时它也提示用户权限。在 RHEL 默认 Bash 提示符中,root 用户通常显示 #,普通用户通常显示 $
简单命令
认识了 shell 上显示的内容,接下来通过完成以下示例来初步使用 Linux 命令。
示例一:检查当前系统的时间和日期
使用 date 命令和 cal 命令显示当前系统的时间和日期。
[root@myRHEL9 ~]# date
Tue Aug 25 06:02:03 PM CST 2026
[root@myRHEL9 ~]# cal
August 2026
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
示例二:创建 test1 用户
使用 useradd 命令创建一个用户,id 命令用于查看该用户的 uid、gid,因此也可通过 id 一个用户名,看是否有正常执行结果来检查该用户是否存在于系统中。
[root@myRHEL9 ~]# useradd test1
[root@myRHEL9 ~]# id test1
uid=1001(test1) gid=1001(test1) groups=1001(test1)
示例三:使用 root 用户给 test1 用户设置密码使之能够 SSH 远程登录
本次实验使用 SSH 密码认证远程登录,在配置文件的默认配置下不支持无密码验证登录用户,新创建的 test1 用户尚未设置密码,因此无法使用账密登录,需要先使用 passwd 为其设置密码。
passwd 指令用于修改用户密码,当后面不加用户名时表示修改当前登录用户的密码。当后面加用户名时表示修改指定用户的密码。
[root@myRHEL9 ~]# passwd test1
Changing password for user test1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@myRHEL9 ~]#
接下来在 Windows 的 cmd 中使用 SSH 命令测试使用密码登录。
C:\Users\20335>ssh test1@192.168.200.129
test1@192.168.200.129's password:
Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard
[test1@myRHEL9 ~]$
示例四:使用 test1 用户登录,修改自己的密码
当前我们是以 root 用户身份登录,切换用户使用 su 指令;密码修改则使用 passwd 指令。
以下是使用这两个指令时需要注意的:
- 对于 su : root 使用 su 切换到其他用户时不需要验证目标用户密码;非 root 用户使用 su 切换到其他用户时,通常需要验证目标用户密码
- 对于 passwd :
- passwd 指令后面可以接参数指定修改密码的用户,但只有超级管理员或具有相应权限的用户才可以指定修改其他用户的密码。普通用户无权修改其他用户的密码。
- passwd 指令修改密码时,超级管理员无需验证原密码,普通用户需要验证原密码再修改。
- passwd 指令修改密码时,超级管理员可以无视安全密码策略设置密码,普通用户需要遵守。比如设置一个过于简单的密码 123 ,它既不符合长度也不符合安全策略,超级管理员可以无视警告设置,普通用户则会被拒绝并要求重新设置。
#root用户切普通用户不用验证密码
[root@myRHEL9 ~]# su - test1
#普通用户不允许指定修改密码的对象,哪怕是自己
[test1@myRHEL9 ~]$ passwd test1
passwd: Only root can specify a user name.
#普通用户修改密码需要验证原密码且遵守密码策略,不遵守则无法完成密码修改
[test1@myRHEL9 ~]$ passwd
Changing password for user test1.
Current password:
New password:
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
passwd: Authentication token manipulation error
#遵守密码策略设置密码,则可完成密码修改
[test1@myRHEL9 ~]$ passwd
Changing password for user test1.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
#普通用户切其他用户需要验证密码
[test1@myRHEL9 ~]$ su - root
Password:
#超级管理员可以修改其他用户密码,并且无需验证原密码,无需遵守密码策略
[root@myRHEL9 ~]# passwd test1
Changing password for user test1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
写在最后
以上,我们完成了 Linux 的基本介绍以及一些简单的命令使用,接下来我会开始连载 RHCE 的复习笔记。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)