Linux基础
计算机
当谈到计算机时,我们通常指的是一种能够接受用户输入、进行运算处理并生成或存储有用信息的电子设备。计算机可以分为硬件和软件两个主要部分。
计算机硬件组成:
中央处理器 (CPU): 作为计算机的大脑,负责执行指令和进行运算处理。
内存 (RAM): 用于临时存储正在运行的程序和数据,提高计算速度。
存储设备: 包括硬盘驱动器 (HDD) 和固态驱动器 (SSD),用于永久存储数据和程序。
主板: 连接所有硬件组件的主要电路板。
图形处理器 (GPU): 主要用于处理图形相关任务,如游戏、图像处理等。
输入设备: 包括键盘、鼠标、触摸屏等,用于向计算机输入指令和数据。
输出设备: 如显示器、打印机,用于向用户呈现计算机处理的结果。
网络接口卡: 用于连接计算机到网络,实现数据通信。
计算机软件:
操作系统 (OS): 控制和管理计算机硬件资源,提供用户界面,例如Windows、macOS、Linux等。
应用软件: 由用户使用的程序,如文字处理软件、图形设计软件、游戏等。
计算机的功能:
数据处理: 计算机能够执行各种数学和逻辑运算,处理大量数据。
信息存储和检索: 计算机可以存储大量的数据,并根据用户的需求检索信息。
通信: 通过网络,计算机可以进行数据交流和远程通信。
控制外部设备: 计算机可以控制与之连接的外部设备,如打印机、摄像头等。
生活周围的电器用品:
现代电器产品常常内置计算机组件,以提供更智能、便捷的功能。一些例子包括:
智能手机: 具有强大的计算能力和多种传感器,运行各种应用程序。
智能家居设备: 如智能音响、智能灯具,通过计算机技术实现智能化控制。
电视: 现代电视通常具有智能功能,可以连接互联网、运行应用程序。
汽车: 现代汽车中的许多系统,如导航、娱乐、安全系统,都涉及计算机技术。
数码相机: 包含图像处理和存储功能的计算机组件。
CPU的种类
计算机的中央处理器(CPU)是电脑的核心组件之一,它执行各种指令来完成计算和处理任务。CPU的设计理念主要分为两种:精简指令集(RISC)和复杂指令集(CISC)。下面将详细介绍这两种不同类型的CPU。
精简指令集(RISC):
RISC指的是Reduced Instruction Set Computer,即精简指令集计算机。以下是RISC的主要特点和一些常见的RISC架构:
特点:
- 微指令集较为精简,每个指令的执行时间短,动作单纯。
- 执行效能较佳,但复杂任务可能需要多个指令完成。
常见RISC架构:
- SPARC系列(例如升阳公司的SPARC)
- Power Architecture系列(包括IBM公司的PowerPC)
- ARM系列(广泛用于手机、PDA、导航系统、网络设备等)
应用举例:
- SPARC架构常用于学术领域大型工作站和银行金融服务器。
- PowerPC架构应用于Sony公司的Play Station 3(PS3)的Cell处理器。
- ARM架构广泛应用于手机、PDA、导航系统等,是世界上使用范围最广的CPU之一。
复杂指令集(CISC):
CISC指的是Complex Instruction Set Computer,即复杂指令集计算机。以下是CISC的主要特点和一些常见的CISC架构:
特点:
- 微指令集中的每个小指令可以执行一些较低阶的硬件操作。
- 指令数目多而且复杂,每条指令的长度不相同。
- 每条指令执行较为复杂,花费的时间较长,但可以处理丰富的工作。
常见CISC架构:
- x86架构,包括由AMD、Intel、VIA等开发的CPU。
应用举例:
- x86架构的CPU广泛应用于个人计算机(PC),因此常被称为x86架构计算机。
- x86架构最早由Intel的8086 CPU发展而来,后续发展包括80286、80386等。
64位架构:
- 最早的x86架构CPU是8086,后来发展为64位架构,被统称为x86_64。AMD修改了新一代CPU为64位。
差异:
- 差异主要在微指令集的不同,包括对多媒体程序、虚拟化效能和能源效率的优化。
什么是Linux?
Linux是一个类Unix操作系统内核的名称,它是由Linus Torvalds于1991年首次创建。Linux操作系统的内核是一个自由、开放源代码的软件,它在许多不同的计算机系统上运行,包括个人计算机、服务器、移动设备等。
GNU/Linux发展简史
1983年:GNU项目启动
- 主要人物: 理查德·斯托曼(Richard Stallman)
- 事件: GNU项目启动,旨在开发一个自由、开放的类Unix操作系统。目标是创建一个完整的操作系统,称为GNU(GNU’s Not Unix)。
1991年:Linux内核的诞生
- 主要人物: 林纳斯·托瓦兹(Linus Torvalds)
- 事件: 林纳斯·托瓦兹发布了Linux内核的第一个版本,这是一个自由、开放源码的Unix-like内核。此后,Linux内核与GNU项目结合,形成了GNU/Linux操作系统。
1992年:发行版的出现
- 事件: 发布了第一个Linux发行版,即Yggdrasil Linux。此后,出现了一系列的发行版,如Slackware、Debian等,使得Linux更易于安装和使用。
1998年:Open Source Initiative成立
- 事件: 开放源码倡议(Open Source Initiative,简称OSI)成立,提倡开源软件的理念。这使得GNU/Linux更为广泛接受,并有助于推动其在商业环境中的发展。
2004年:Ubuntu的推出
- 事件: Ubuntu Linux发布第一个版本,由南非企业家马克·沙特尔沃思(Mark Shuttleworth)发起。Ubuntu通过提供友好的用户界面和易用性,使得更多用户对GNU/Linux产生兴趣。
2007年:Android操作系统
- 事件: Google发布Android操作系统,该系统基于Linux内核。Android在移动设备领域取得了巨大成功,成为全球最流行的移动操作系统之一。
2011年:Linux基金会成立
- 事件: Linux基金会成立,旨在推动Linux的发展和采用。该基金会通过合作、资助和管理各种Linux项目,促进了Linux技术在多个领域的应用。
今天:Linux的广泛应用
- 事件: Linux已经成为各种设备和系统的首选操作系统,包括服务器、嵌入式系统、超级计算机等。许多企业和组织都在使用Linux来支持其关键业务。
GNU/Linux的发展经历了多个阶段,从最初的GNU项目和Linux内核的结合,到今天的广泛应用于各种领域。开源理念和合作共赢的文化使GNU/Linux成为计算机领域中的一支强大力量。
计算机系统与操作系统
在计算机章节,我们介绍了计算机系统的概念,指出计算机是由一系列硬件组成的。
为了有效地管理这些硬件资源,操作系统应运而生。
操作系统不仅负责高效地分配硬件资源,还提供计算机运行所需的各种功能,包括网络功能。此外,为了方便程序设计师开发软件,操作系统还提供一组系统调用接口。
操作系统的职责:
硬件资源管理: 操作系统负责管理计算机的硬件资源,包括处理器、内存、存储设备、输入输出设备等,以确保它们被有效地利用。
提供系统功能: 操作系统提供了计算机运行所需的基本功能,例如文件管理、进程管理、网络功能等,使用户和应用程序能够方便地与计算机交互。
系统调用接口: 为了方便软件设计师开发应用程序,操作系统提供一整套系统调用接口,程序可以通过这些接口调用操作系统的功能。
Linux操作系统:
Linux是一套开源的操作系统,如下图所示,它包括两个主要组成部分:
- Linux内核(Kernel): 操作系统的核心部分,负责管理硬件资源、进程调度等。
- 系统调用接口: 提供给应用程序和开发者使用的接口,通过这些接口可以访问操作系统的功能。
应用程序与Linux的关系:
应用程序并不算是Linux的一部分。Linux由内核和系统调用接口组成,而应用程序是在这个基础上开发的。应用程序通过系统调用接口与操作系统进行交互,利用操作系统提供的功能完成各种任务。
系统安装
系统下载地址:
系统 | 下载地址 |
---|---|
Oracle Linux | https://yum.oracle.com/oracle-linux-isos.html |
Ubuntu Linux | https://ubuntu.com/download/server |
Rocky Linux | https://rockylinux.org/zh_CN/ |
Centos Linux | https://www.centos.org/download/ |
安装过程看操作。
如果你真的不想装系统,那么用运行在浏览器的Linux也行:https://bellard.org/jslinux/index.html
$与#区别
Bash Shell 是一种基于文本的命令行界面,用于向计算机系统输入指令。Linux 命令行由名为 shell 的程序提供。在类似 UNIX 的系统中,历经漫长的发展历史,涌现出多种不同的 shell。在 Red Hat Enterprise Linux 中,用户默认使用的 shell 是 GNU Bourne-Again Shell(bash)。Bash 是 Bourne Shell(sh)的一种改进版本,广泛应用于类 UNIX 系统。
交互式使用 shell 时,它会在等待用户输入命令时显示一个字符串,被称为 shell 提示符。普通用户启动 shell 时,默认提示符以字符 “s” 结尾,例如:
1 | [student@desktopX ~]$ |
当以超级用户 root 运行 shell 时,提示符中的 “$” 被替换为 “#”,这更加明显地表明正在使用超级用户 shell。这有助于避免在特权帐户中发生意外和错误。例如:
1 | [root@desktopX ~]# |
使用 bash 执行命令非常强大。Bash Shell 提供了脚本语言的支持,可用于自动化任务。此外,shell 还提供了额外的功能,可以简化或实现利用图形化工具难以高效完成的操作。
Bash Shell 在概念上与 Windows 的 cmd.exe 和 Windows PowerShell 相似,但其脚本语言更为复杂。对于使用 Mac OS X 的管理员来说,bash 是默认的 shell。这种相似性使得从 Windows 或 Mac OS X 切换到 Linux 时,用户更容易适应命令行环境。 Bash 的强大脚本语言为自动化和高级脚本编程提供了更大的灵活性。
虚拟控制台
用户通过终端访问 bash shell,可以是物理控制台或通过串口。Linux支持多个虚拟控制台,每个都有独立的登录会话。在图形环境下,通常第一个虚拟控制台运行图形桌面,其他控制台提供文本登录。通过按下 Ctrl + Alt + F2 到 F6,可以切换到其他虚拟控制台。按 Ctrl + Alt + F1 返回图形桌面所在的第一个虚拟控制台。这样的设置方便用户在不同控制台之间切换执行任务。
shell基础知识
在 shell 提示符下输入的命令由三个基本部分组成:要运行的命令、用于调整命令行为的选项、通常作为命令目标的参数。
命令是要运行的程序的名称,其后可以跟着一个或多个选项和参数。选项通常以一个或两个破折号开头,以与参数区分。了解命令接受的选项和参数以及它们的正确排列顺序对有效使用命令至关重要。
大多数命令包含 --help
选项,用于打印命令的说明,包括语法、选项列表和用法语句。用法语句可能包含方括号表示可选项目、省略号表示任意长度列表、竖线表示只能指定其中一个项目,以及尖括号表示变量数据。例如,<filename>
表示在此处插入要使用的文件名。
以 date
命令为例,其用法语句为:
1 | [student@desktopX ~]$ date --help |
这表示 date
可以接受一个可选选项列表 ([OPTION]...
),其后为可选的格式字符串,以加号字符 +
为前缀,用于定义当前日期的显示方式 (+FORMAT
)。由于这两项都是可选的,即使未指定选项或参数,date
也将执行,并使用默认格式打印当前日期和时间。
在退出 shell 会话时,用户可以使用 exit
命令终止当前的 shell 会话,也可以按下 Ctrl+D
来结束会话。
术语 | 描述 |
---|---|
Shell | 解释并执行以字符串形式键入的命令的程序。 |
提示符 | 指示用户可以键入命令的视觉标志。 |
命令 | 运行的程序的名称。 |
选项 | 命令行中用于调整命令行为的部分。 |
参数 | 命令行中指定命令所要操作的目标的部分。 |
物理控制台 | 通过硬件显示和键盘与系统交互的设备。 |
虚拟控制台 | 多个逻辑控制台之一,支持独立的登录会话。 |
终端 | 提供显示输出和接受键盘输入的界面。 |
GNOME环境
在 RHEL 9 中,默认的桌面环境是使用 GNOME Shell 在 Wayland 上运行的 GNOME Standard 环境。然而,由于一些 Wayland 的限制,您可能想要将图形协议堆栈切换到 X11。您还可以从 GNOME Standard 切换到 GNOME Classic。
X11(X Window System)自 1987 年推出以来一直是类 Unix 系统的主要显示服务器协议。它提供了在 Linux 和 Unix 系统上显示图形用户界面的基础架构。然而,随着技术的进步,X11的局限性变得更加明显。
Wayland 于 2008 年由 Kristian Hogsberg 推出,作为一种新协议和 X 的现代替代品。它旨在克服 X11 的局限性,并提供更加精简、安全和高性能的系统。
一些快捷键:
屏幕锁定:Ctrl+Alt+L
关机或重启:Ctrl+Alt+Del
使用Bash Shell执行命令
GNU Bourne-Again Shell(bash)是用于解读用户键入命令的程序。每个键入到 shell 中的字符串最多包含三个部分:命令、选项(以 - 或 – 开头)以及参数,它们通过空格隔开。命令代表系统中已安装程序的名称,每个命令都可能有自己的选项和参数。
当用户准备执行命令时,按下 Enter 键。每个命令在单独的一行中键入,系统会显示各个命令的输出,然后再显示 shell 提示符。若用户希望在一行中键入多个命令,可使用分号 (;) 作为命令分隔符,分号是一类称为元字符的字符的成员,对于 bash 具有特殊的含义。
上下左右按键在命令行作用
方向键在 shell 中的历史记录中用于导航之前的命令行:
- 向上箭头用于编辑历史记录列表中的上一个命令,向下箭头用于编辑历史记录列表中的下一个命令。
- 向左箭头和向右箭头可在当前编辑的命令行中向左和向右移动光标。
- 使用组合键
Esc+.
可以将上一个命令的最后一个单词复制到当前命令行光标所在的位置。如果反复使用,它将继续复制更早的命令的最后一个单词。
快捷方式 | 描述 |
---|---|
Ctrl+a | 跳到命令行的开头。 |
Ctrl+e | 跳到命令行的结尾。 |
Ctrl+u | 将光标处到命令行开头的内容清除。 |
Ctrl+k | 将光标处到命令行末尾的内容清除。 |
Ctrl+向左箭头键 | 跳到命令行中的前一字的开头。 |
Ctrl+向右箭头键 | 跳到命令行中下一字的开头。 |
Ctrl+r | 在历史记录列表中搜索某一模式的命令。 |
Ctrl+d | 关闭退出终端会话。 |
关机重启命令
重启:
1 | reboot |
立即关机:
1 | shutdown now |
1 | shutdown -h +30 |
上述命令中的参数含义如下:
-h
: 关机的标志,表示系统将在关机后停止。+30
: 表示在 30 分钟后执行关机操作。可以根据需要调整数字,以设定不同的关机时间。
date命令
以下是一个简单的命令示例,使用 date
命令显示当前日期和时间。超级用户也可以使用该命令设置系统时钟。参数以加号(+)开头,用于指定 date
命令的格式字符串。
1 | [root@oraclelinux ~]# date |
passwd命令
passwd
命令用于用户更改自己的密码,但在更改之前必须提供原始密码。默认情况下,passwd
配置为需要强密码,要求密码包含小写字母、大写字母、数字和符号,并且不能基于字典中的单词。超级用户可以使用 passwd
命令更改其他用户的密码。
1 | [root@oraclelinux ~]# passwd |
file命令
在 Linux 中,文件不需要通过文件扩展名来进行类型分类。相反,可以使用 file
命令,该命令通过扫描文件内容的开头来确定文件的类型。要对文件进行分类,只需将文件作为参数传递给该命令。
1 | [root@oraclelinux ~]# file /etc/passwd |
head和tail命令
head
和 tail
命令分别用于显示文件的开头和结尾部分。它们默认显示文件的前后10行,但可以使用 -n
选项指定显示的行数。要操作的文件作为参数传递给这两个命令。
显示头部5行
1 | [root@oraclelinux ~]# head -n 5 /etc/passwd |
显示尾部5行:
1 | [root@oraclelinux ~]# tail -n 5 /etc/passwd |
wc命令
wc
命令用于计算文件中的行数、字数和字符数。它可以使用 -l
、-w
或 -c
选项,分别用于仅显示行数、字数或字符数。
1 | [root@oraclelinux ~]# wc /etc/passwd |
Tab补全
Tab 补全是一种允许用户在提示符下键入足够的内容,以便系统能够快速完成命令或文件名的功能。如果输入的字符足够唯一,单次按 Tab 键即可完成。如果输入的字符不唯一,按 Tab 键两次将显示所有以输入字符开头的命令或文件名。
对命令补全:
1 | [root@oraclelinux ~]# pas<Tab键><Tab键> |
对文件路径补全:
1 | [root@oraclelinux ~]# ls /etc/p<Tab键><Tab键> |
还可以对参数补全:
1 | [root@oraclelinux ~]# useradd --<Tab键><Tab键> |
有些Linux系统没安装bash-completion
可能没有Tab补全功能。
1 | yum install bash-completion |
history命令
history
命令用于显示之前执行的命令列表,每个命令都带有一个命令编号作为前缀。感叹号字符 !
是一个元字符,用于扩展之前执行的命令,而无需重新键入它们。!number
将扩展为与指定编号匹配的命令,而 !string
将扩展为最近一个以指定字符串开头的命令。
1 | [root@oraclelinux ~]# history |
命令行管理文件
Linux文件系统层次结构
Linux 系统中的所有文件存储在文件系统中,它们被组织到一个颠倒的目录树中,称为文件系统层次结构。这棵树是颠倒的,因为树根在该层次结构的顶部,树根的下方延伸出目录和子目录的分支。
根目录(/)位于文件系统层次结构的顶部,同时也是文件名中的目录分隔符。
举例来说,如果 etc
是 /
目录的子目录,我们称之为 /etc
目录。同样,如果 /etc
目录包含一个名为 hostname
的文件,我们将该文件表示为 /etc/hostname
。
系统根目录的子目录被通常用于标准化的管理,尽可能不要在根目录下再创建其他文件夹。这种系统结构有助于更方便地查找文件。
例如,在根目录下,子目录 /boot
通常用于存储启动系统所需的文件。
重要的Red Hat Enterprise Linux目录
位置 | 用途 |
---|---|
/usr |
存放安装的软件、共享的库,包括用户命令(/usr/bin )、系统管理命令(/usr/sbin )、本地自定义软件(/usr/local )等。 |
/etc |
存放特定于此系统的配置文件。 |
/var |
存放特定于此系统的可变数据,在系统启动之间保持永久性。这包括动态变换的文件(如数据库、缓存目录、日志文件、打印机后台处理文档和网站内容)。 |
/run |
存放自上一次系统启动以来启动的进程的运行时数据,包括进行ID文件和锁定文件等。内容在重启时重新创建。(整合了旧版RedHat Enterprise Linux中的/var/run 和/var/lock 。) |
/home |
存放普通用户存储其个人数据和配置文件的主目录。 |
/root |
存放管理员超级用户 root 的主目录。 |
/tmp |
提供全局可写的临时文件使用空间,10天内未访问、未更改或未修改的文件将自动删除。还有一个临时目录/var/tmp ,其中的文件如果在30天内未访问、更改或修改过,将被自动删除。 |
/boot |
存放开始启动过程所需的文件。 |
/dev |
包含特殊的设备文件,供系统用于访问硬件。 |
绝对路径和相对路径
文件或目录的路径指定了它在文件系统中的唯一位置。可用正斜杠 (/) 分隔,拼接一个或多个子目录来指定的路径,直到到达目标位置。目录(也称为文件夹)与其他文件类型一样,遵循标准的文件行为定义。
绝对路径
绝对路径是完全限定的名称,从根目录 (/) 开始,通过正斜杠 (/) 拼接每个子目录,直到达到唯一代表单个文件的位置。每个文件在文件系统中都有一个唯一的绝对路径名,以正斜杠 (/) 开头。
例如,系统消息日志文件的绝对路径名是 /var/log/messages
。尽管绝对路径名可能很长且不方便键入,但文件也可以通过相对路径查找。
用户登录并打开命令窗口时,初始位置通常是用户的主目录。系统进程也有初始目录。用户和进程可以根据需要导航到其他目录,术语”工作目录”或”当前工作目录”指的是它们的当前位置。
相对路径
相对路径标识唯一文件,仅指定从工作目录到达该文件所需的路径。相对路径名以除了正斜杠 (/) 之外的其他字符开头。
例如,位于 /var
目录的用户可以将消息日志文件相对指代为 log/messages
。
在标准的Linux文件系统中,文件路径名长度(包含所有 / 字符)不可超过4095字节,每个路径名部分的长度不可超过255字节。文件名可以使用任何UTF-8编码的Unicode字符,但不能包含 / 和 NUL 字符。Linux文件系统,如ext4、XFS、BIRFS、GFS2和GusterFS,都是区分大小写的。
在同一目录中创建 FileCase.txt
和 filecase.txt
将生成两个不同的文件。尽管Linux支持许多非Linux文件系统,每种系统都具有独特的文件命名规则。
例如,VFAT文件系统不区分大小写,只允许创建上述两个示例文件中的一个。然而,VFAT以及Microsoft的NTFS和Apple的HFS+具有大小写保留行为。尽管这些文件系统不区分大小写(主要是为了支持向后兼容性),但它们确实使用文件创建时的原始大小写形式显示文件名。
pwd命令
pwd
命令显示当前位置的完整路径名。
1 | [root@oraclelinux ~]# pwd |
ls命令
ls
命令用于列出指定目录的内容,如果未指定目录,则列出当前目录的内容。可通过这个命令查看当前工作目录中的文件和子目录。
1 | [root@oraclelinux ~]# ls |
cd命令
使用 cd
命令可以更改当前工作目录。当工作目录为 /root
时,以下是到达 Videos
子目录的相对路径和到达 Video
子目录的绝对路径的语法:
到达 Videos 子目录的相对路径语法:
1 | cd Videos |
通过执行上述命令,可以在当前工作目录中切换到 Videos
子目录,无需指定完整的路径。
到达 Documents 子目录的绝对路径语法:
1 | cd /root/Videos/ |
通过执行上述命令,可以直接切换到 /root/Videos/
目录,使用绝对路径完全指定了目标目录的位置。
简明提示符
为简明起见,shell 程序提示符仅显示当前目录路径的最后一个部分。例如,对于 /root/Videos
,只会显示 Videos
。
返回到用户的家目录:在任何位置,都可以通过 cd
命令返回到用户的家目录,无需指定目标位置。用户的当前目录是其主目录时,提示符会显示波浪符 (~
) 字符,表示用户的主目录。
1 | cd ~ |
返回上一层:
1 | cd ../ |
返回上一个:
1 | cd - |
touch命令
touch
命令通常用于更新文件的时间戳为当前的日期和时间,而不对文件进行其他修改。这一特性经常用于创建空文件,因为使用 touch
命令可以触发文件的创建,尤其是当指定的文件名不存在时。
利用 touch
命令,你可以在 Documents
和 Videos
子目录中创建练习文件。以下是使用 touch
命令的示例:
1 | # 在 Documents 子目录中创建练习文件 |
通过执行上述命令,可以在指定的子目录中创建相应的练习文件,而不需要文件内容变化。
ls命令
ls
命令具有多个选项,用于显示文件的不同属性。以下是一些最常见且最有用的选项:
-l
(长列表格式):以详细的长列表格式显示文件信息,包括文件权限、所有者、组、大小、修改时间等。-a
(包含隐藏文件):显示包括隐藏文件在内的所有文件,隐藏文件通常以点 (.
) 开头。-R
(递归方式):以递归方式显示所有子目录及其内容,包括文件的详细信息。
这些选项可以根据需要组合使用,以满足不同的列示要求。
1 | [root@oraclelinux ~]# ls -l |
特殊目录:
列表顶部的两个特殊目录是:
.
(当前目录):代表当前所在的目录。..
(父目录):代表当前目录的上一级目录。
这两个特殊目录存在于系统中的每一个目录中。当练习文件管理命令时,它们的作用变得显而易见,用于引用当前目录或父目录。
复制移动删除文件和目录
文件管理
文件管理涉及以下基本操作:创建、删除、复制和移动文件和目录。
这些操作对于组织文件和目录结构以及执行直接任务非常重要。在命令行执行文件管理时,使用绝对或相对路径语法能够实现最高效率,有助于清晰地组织和操作文件。
活动 | 单一来源 | 多来源 |
---|---|---|
复制文件 | cp file1 file2 | cp file1 file2 file3 dir |
移动文件 | mv file1 file2 | mv file1 file2 file3 dir |
删除文件 | rm file1 | rm -r file1 file2 file3 |
创建目录 | mkdir dir | mkdir -p par1/par2/dir |
复制目录 | cp -r dir1 dir2 | cp -r dir1 dir2 dir3 dir4 |
移动目录 | mv dir1 dir2 | mv dir1 dir2 dir3 dir4 |
删除目录 | rm -r dir1 | rm -rf dir1 dir2 dir3 |
mkdir命令
mkdir
命令用于创建一个或多个目录或子目录。如果文件名已存在或尝试在不存在的父目录中创建目录,将会产生错误。使用 -p
(父级)选项可以创建多个缺失的父目录。
1 | [root@oraclelinux ~]# mkdir qqq |
cp命令
cp
命令将一个或多个文件复制到当前或另一个目录中。在任何目标位置上,新文件名都必须是唯一的,如果新文件名不唯一,复制命令将覆盖已存在的文件。
1 | [root@oraclelinux ~]# cd Videos/ |
用cp
命令复制多个文件时,最后一个参数必须为目录,复制的文件在新的目录中保留其原有名称,目标位置上存在的冲突文件名可能会被盖。为防止用户意外覆盖带有内容的目录,多文件cp 命令将忽略指定为来源的目录。
1 | [root@oraclelinux Videos]# cp a/a.txt b/ |
复制带有内容的非空目录要求使用 -r 归选项。
1 | [root@oraclelinux Videos]# cp -r b c |
mv命令
my命令可以对文件进行重命名操作,或者将文件移动到新的目录中,且文件内容保持不变。
mv
命令的本质:将文件移动到另一文件系统要求通过复制源文件创建新的文件,然后再删除源文件。
尽管通常对用户透明但移动大型文件所需的时间可能会明显较长。
1 | [root@oraclelinux Videos]# ls |
rm命令
rm
的默认语法将删除文件,而不是目录。
要删除目录以及其下可能存在的许多子目录和文件,需要使用-r
递归选项。
注意:没有取消删除的方法,Linux也没有像Windows一样的可在文件回收站中恢复的文件的操作。
1 | [root@oraclelinux Videos]# ls |
加上-f
选项可以强制删除文件,而且没有任何提示:
1 | [root@oraclelinux Videos]# ls |
rmdir命令
rmdir命令仅删除空的目录。
1 | [root@oraclelinux Videos]# mkdir ccc |
文件通配:路径名扩展
Bash Shell 路径名匹配
Bash Shell 模式匹配是一种功能,通常称为通配符或模式匹配,允许使用特殊字符(通配符)来匹配文件名和路径名。这使得在执行命令时能够一次性操作一组文件,从而方便管理大量文件。通常,扩展的元字符用于表示匹配的模式,例如使用星号 *
表示零个或多个字符,问号 ?
表示一个字符。这样的功能在处理文件操作和命令时非常有用。
模式匹配
模式匹配是一种 shell 命令解析操作,它将通配符模式扩展为一组匹配的路径名。在执行命令之前,命令行元字符由匹配列表替换。不返回匹配项的模式(尤其是方括号括起的字符类)将原始模式请求显示为字面上的文本。以下是常见的元字符和模式类:
模式 | 匹配项 |
---|---|
* | 由0个或以上字符组成的任何字符串。 |
? | 任何一个字符。 |
~ | 当前用户的主目录。 |
~username | username用户的主目录。 |
~+ | 当前工作目录。 |
~- | 上一个工作目录。 |
[abc…] | 括起的类中的任何一个字符。 |
[!abc…] | 不在括起的类中任何一个字符。 |
[^abc…] | 不在括起的类中的任何一个字符。 |
[[:alpha:]] | 任何字母字符。 |
[[:lower:]] | 任何小写字符。 |
[[:upper:]] | 任何大写字符。 |
[[:alnum:]] | 任何字母字符或数字。 |
[[:punct:]] | 除空格和字母数字以外的任何可打印字符。 |
[[:digit:]] | 任何数字,即0-9。 |
[[:space:]] | 任何一个空白字符;可能包含制表符、换行符或回车符,以及换页符和空格。 |
创建一组文件用于演示:
1 | [root@oraclelinux Videos]# mkdir glob; cd glob |
使用*
或?
的简单模式匹配项
1 | [root@oraclelinux glob]# ls a* |
波形符扩展
波形符(~)后接斜杠分隔符时,可用于匹配当前用户的主目录。
1 | [root@oraclelinux /]# pwd |
如果波形符后接一个字符串直到斜杠,系统会解释为用户名,并尝试寻找匹配项。如果找到匹配的用户名,则波形符后的字符串被解释为该用户的主目录,如果找不到匹配的用户名,则返回实际波形符加上该字符串。
1 | [root@oraclelinux ~]# cd ~lijunjie/ |
大括号扩展
大括号扩展用于生成任意字符串。大括号包括字符串的逗号分隔列表或顺序表达式。结果包含大括号定义之前或之后的文本。大括号扩展可以互相嵌套。
1 | [root@oraclelinux ~]# echo {Sunday,Monday,Tuesday,Wednesday}.log |
命令替换
命令替换是一种允许将命令的输出嵌入到另一个命令中的机制。
它通过在命令前使用美元符号和括号的形式进行,即$(command)。
相比于较陈旧的反引号`command`形式,$(command)更为现代化且具有两个优势:
1)在视觉上更清晰,避免与单引号混淆;
2)可以嵌套多个命令扩展,而反引号形式则无法实现这种嵌套。
1 | [root@oraclelinux ~]# echo Today is `date +%A` |
防止参数被扩展
在 Bash shell 中,许多字符具有特殊含义。为了忽略元字符的特殊含义,可以使用引用和转义来防止它们被 shell 扩展。
反斜杠 (\
) 是 Bash 中的一个转义字符,用于防止其后的一个字符被特殊解释。如果要保护较长的字符串,可以使用单引号 ('
) 或双引号 ("
) 括起字符串。
使用双引号可以阻止通配和 shell 扩展,但仍然允许命令和变量替换。
变量替换在概念上与命令替换相似,但可能使用可选的大括号语法。
1 | [root@oraclelinux ~]# host=$(hostname); echo $host |
使用单引号 ('
) 可以按字面解释所有的文本。
不要搞错了,大家可以观察屏幕和键盘的单引号 (‘) 和命令替换反引号 (`) 上的区别。
1 | [root@oraclelinux ~]# echo "Will variable $host evaluate to $(hostname)?" |
除了阻止通配和 shell 扩展外,单引号还指示 shell 阻止命令替换和变量替换。问号 (?
) 也是一个需要防止扩展的元字符。
使用man命令读取文档
man
页面的源自过去的 Linux 程序员手册,该手册内容庞大,足以打印成多卷书册。手册被分为如下所列的章节,每个章节包含特定主题的信息。这些主题被称为页面,因为手册页面的概念已经不再适用。以下是主要章节的概述:
章节 | 内容类型 |
---|---|
1 | 用户命令(可执行命令和shell程序) |
2 | 系统调用(从用户空间调用的内核例程) |
3 | 库函数(由程序库提供) |
4 | 特殊文件(如设备文件) |
5 | 文件格式(用于许多配置文件和结构) |
6 | 游戏(过去的有趣程序章节) |
7 | 惯例、标准和其他(协议、文件系统) |
8 | 系统管理和特权命令(维护任务) |
9 | Linux内核API(内核调用) |
为了区分不同章节中相同的主题名称,man
页面参考在主题后添加了章节编号(用括号括起)。例如,passwd(1)
介绍了更改密码的命令,而 passwd(5)
说明了用于存储本地用户帐户的 /etc/passwd
文件格式。
要阅读特定的 man
页面,请使用 man topic
命令。每次只会显示一个屏幕的主题内容。你可以使用箭头键单行滚动,或者使用空格键显示下一个屏幕。man
命令按照配置的顺序搜索手册章节,首先显示常用的章节。例如,man passwd
默认情况下显示 passwd(1)
。要显示特定章节的 man
页面主题,请附上章节编号参数:man 5 passwd
显示 passwd(5)
。
man命令查阅的导航按键
能够高效搜索主题并在 man 手册中导航是一项重要的管理技能。下表列出了基本的 man 导航命令:
导航man page
命令 | 结果 |
---|---|
空格键 | 向前(向下)滚动一个屏幕 |
PageDown | 向前(向下)滚动一个屏幕 |
PageUp | 向后(向上)滚动一个屏幕 |
向下箭头键 | 向前(向下)滚动一行 |
向上箭头键 | 先后(向上)滚动一行 |
d | 向前(向下)滚动半个屏幕 |
u | 向后(向上)滚动半个屏幕 |
/string | 在man page中重复之前的向前(向下)搜索 |
n | 在man page中重复之前的向前(向下)搜索 |
N | 在man page中重复之前的向后(向上)搜索 |
g | 转到man page的开头。 |
G | 转到man page的末尾。 |
q | 退出man,并返回到命令shell提示符。 |
重要:在执行搜索时,string
允许使用正则表达式语法。简单的文本(如 passwd
)按照预期工作,而正则表达式则使用元字符(如 $
、*
、.
和 ^
)进行更复杂的模式匹配。因此,搜索包含程序表达式元字符的字符串(如 make $$$
)可能会产生意外的结果。
根据关键字搜索man page
使用 man -k keyword 对 man page 执行关键字搜索,这会显示与关键字匹配的 man page 主题和章节编号的列表。
有时,man -k
的搜索结果可能不是最新的。你可以尝试更新man
数据库,以确保它包含最新的信息。运行下面的命令:
1 | sudo yum install man-db |
查看passwd相关的命令:
1 | [root@oraclelinux ~]# man -k passwd |
常见的系统管理主题在 第1节(用户命令)、第5节(文件格式) 和 第8节(管理命令) 中。运用特定故障排除工具的管理员也使用 第2节(系统调用),剩余的章节通常供序员参考或用于高级管理。
如果,你要查看passwd
的文档。首先:
1 | man -k passwd |
输入如下命令,
1 | man 1 passwd |
使用pinfo命令读取文档
Info文档的结构由超链接式的info节点组成,相较于man page更为灵活。与man page类似,可以通过使用info或pinfo命令从命令行访问info节点。
一些命令和实用工具同时具有man page和info文档,然而,通常来说,info文档的内容更为详尽。
为了比较tar文档的差异,可以使用man和pinfo命令来查看两种文档之间的区别。这种比较有助于用户更深入地了解命令和工具的功能及使用方法。
1 | man tar |
1 | pinfo tar |
Pinfo是一个比原始的info命令更高级的info文档阅读器。它的设计考虑了与lynx文本Web浏览器相似的键盘操作,同时还增加了颜色的支持。用户可以使用pinfo topic
命令来浏览特定主题的info节点,而仅输入pinfo
则会显示info主题目录。
值得注意的是,当安装了相应的软件包时,pinfo中会显示新的文档节点,提供更为全面的信息和功能。这使得通过pinfo阅读info文档更为灵活和便捷。
pinfo和man快捷键对比:
导航 | pinfo | man |
---|---|---|
向前(向下)滚动一个屏幕 | PageDown或空格键 | PageDown或空格键 |
向后(向上)滚动一个屏幕 | PageUp或b | PageUp或b |
显示主题目录 | d | - |
向前(向下)滚动半个屏幕 | - | d |
显示主题的父节点 | u | - |
显示主题的顶部(上部) | 主页 | 1G |
向后(向上)滚动半个屏幕 | - | u |
向前(向下)滚动到下一超链接 | 向下箭头键 | - |
打开光标处的主题 | Enter | - |
向前(向下)滚动一行 | - | 向下箭头键或Enter |
向后(向上)滚动上一超链接 | 向上箭头键 | - |
向后(向上)滚动一行 | - | 向上箭头键 |
搜索某种模式 | /string | /string |
显示主题中的下一节点(章节) | n | - |
重复之前的向前(向下)搜索 | /,再按Enter | n |
显示主题中的上一节点(章节) | p | - |
重复之前的向后(向上)搜索 | - | N |
退出程序 | q | q |
读取 /usr/share/doc 中的文档
在软件包的文档方面,除了man和pinfo之外,开发人员还有可能选择将文档存储在RPM分发软件包中。
在安装软件时,被识别为文档的文件通常会被移动到/usr/share/doc/packagename目录中。
软件包的开发者可能会在安装包中包含有用的内容,作为对man页面的补充,从而避免内容的重复。
对于GNU软件包而言,它们也会使用/usr/share/doc作为info节点的一个补充。大多数软件包中都包含了有关软件包分发许可的文件。有些软件包甚至包含大量基于PDF或HTML格式的文档。
因此,浏览软件包的一种有用方式是将所选择的浏览器指向file:///usr/share/doc,然后通过鼠标进行操作。这种方式使用户能够方便地查看软件包的许可信息和其他相关文档。
1 | [root@oraclelinux ~]# firefox file:///usr/share/doc/at |
创建、查看和编辑文本文件
标准输入、标准输出和标准错误
为了有效地管理打开的文件,所以建立了一个有编号标记的通道(文件描述符)的进程结构。
这个结构可以让进程与文件建立连接,访问这些文件所包含的数据内容或设备。
在Linux系统中,通过默认的连接方式,即通道0、1和2(分别是标准输入、标准输出和标准错误),来创建进程。
这意味着进程可以通过这些标准通道进行输入和输出。
此外,进程还可以使用编号为3及以上的通道,以连接到其他文件,扩展了其与外部数据源和目标的连接能力。
这种进程结构使得处理文件和数据流变得更加灵活和易于管理。
编号 | 通道名称 | 描述 | 默认连接 | 用法 |
---|---|---|---|---|
0 | stdin | 标准输入 | 键盘 | 仅读取 |
1 | stdout | 标准输出 | 终端 | 仅写入 |
2 | stderr | 标准错误 | 终端 | 仅写入 |
3+ | filename | 其他文件 | 无 | 读取或写入 |
重定向输出到文件
重定向输出到文件就像给计算机一个指令,告诉它把原本应该显示在屏幕上的东西,放到一个文件里。
这个过程通过通道重定向完成,就好像是改变了一个通道的目的地。你可以选择把程序的输出和错误消息保存到文件中,或者发送到其它设备,甚至直接丢弃掉。
如果你只重定向程序的标准输出(stdout),那么程序的正常输出就不会显示在屏幕上了。但是要注意,这并不会影响错误消息(stderr),它们仍然会显示在屏幕上。如果你希望完全屏蔽输出,可以使用一个特殊的文件 /dev/null
,把通道的输出悄悄地丢弃到这个文件里。这样,就实现了对输出的静默处理。
用法 | 说明 | 视觉辅助 |
---|---|---|
>file | 重定向stdout到文件 | 标准输出到文件,错误输出到屏幕 |
>>file | 重定向stdout到文件,附加到当前文件内容后面 | 标准输出追加到文件,错误输出到屏幕 |
2>file | 重定向stderr到文件 | 标准输出到屏幕,错误输出到文件 |
2>/dev/null | 将stderr错误信息重定向到/dev/null,从而将它丢弃 | 标准输出到屏幕,错误输出丢弃 |
&>file | 将stdout和stderr合并到一个文件 | 标准和错误输出都输出到文件 |
>>file 2>&1 | 合并stdout和stderr,并且附加到当前文件内容后面 | 错误输出与标准输出合并成标准输出,然后将这合并输出输出到文件 |
示例:
保存时间戳
1 | date > /tmp/saved-timestamp |
将日志文件的最后100行复制到另一个文件
1 | tail -n 100 /var/log/dmesg > /tmp/last-100-boot-messages |
将四个文件连接为一个
1 | cat file1 file2 file3 file4 > /tmp/all-four-in-one |
将隐藏文件名和常规文件名列出到文件中
1 | ls -a > /tmp/my-file-names |
将输出附加到现有文件
1 | echo "new line of information" > /tmp/many-lines-of-information |
下列示例中将生成错误,因为普通用户对系统目录的访问会被拒绝。
在终端上查看普通命令输出时,将错误重定向到文件。因此做此实验,需要切换到普通用户。
1 | find /etc -name passwd 2 > /tmp/errors |
将进程输出和错误消息分别保存到不同的文件中。
1 | find /etc -name passwd > /tmp/output 2 > /tmp/errors |
忽略并丢弃错误消息
1 | find /etc -name passwd > /tmp/output 2 > /dev/null |
将输出和生成的错误消息保存在一起。
1 | find /etc -name passwd & > /tmp/save-both |
将输出和生成的错误附加到现有文件。
1 | find /etc -name passwd >> /tmp/save-both 2>&1 |
构建管道
如果我们使用重定向,可以控制通道的输出流向文件,将数据保存到文件中。
如果我们使用传达,通道的输出将被传递给另一个进程,这个进程可以进一步处理这些数据。
这两种操作都是关于如何处理通道输出的不同方式,一个是保存到文件,一个是传递给其他进程。
进程传送重定向示例
分页命令的长输出:
1 | ls -l /usr/bin | less |
计算输出或列表中的行数。
1 | ls | wc -l > /tmp/how-many-files |
抓取命令输出的前几行、后几行或选定的行
1 | ls -t | head -n 10 > /tmp/ten-last-changed-files |
使用tee命令进行传送的示例
tee命令显示或重定向通常因传送而被隐藏的中间结果。在第一个示例中,在终端上查看ls列表,同时将该列表存储到文件中。
1 | ls -l | tee /tmp/saved-output |
tee命令
将其输出既保存到filename中,又将其输出到屏幕(stdout)
1 | ls -l | tee filename |
将输出既保存到filename1、filename2,又将其输出到屏幕(stdout)
1 | ls -l | tee filename1 filename2 |
tty命令
tty(teletypewriter)显示出连接到当前标准输入的终端设备文件名。
1 | [root@oraclelinux ~]# tty |
确定当前窗口的终端设备。将结果作为邮件发送,并在此窗口中查看相同结果。
1 | ls -l | tee /dev/pts/0 | mail -s subject student@desktop1.example.com |
从shell提示符编辑文本文件
通过游戏学习vim:http://www.vimgenius.com/lessons/vim-intro
一些系统只自带了vi,没有vim。而vim是vi的升级版。
可以通过一下命令进行安装:
1 | yum install vim |
Vim(Vi Improved)是一个文本编辑器,它有不同的工作模式,主要分为以下几种模式:
普通模式(Normal Mode): 这是默认模式,在这个模式下,你可以使用键盘上的键执行各种命令,比如移动光标、删除文本、复制粘贴等。在普通模式下,键入的字符不会直接插入到文本中,而是被解释为命令。
插入模式(Insert Mode): 在插入模式下,你可以像普通的文本编辑器一样输入文本。要进入插入模式,可以在普通模式下按下
i
键。在插入模式中,你可以像使用其他文本编辑器一样输入文字。可视模式(Visual Mode): 可视模式用于选择文本块,以便执行一些操作,如复制、删除或替换。你可以通过按下
v
键进入可视模式,然后选择文本。还有一些变体的可视模式,如行可视模式(按V
进入)和块可视模式(按Ctrl + V
进入)。命令行模式(Command-Line Mode): 在命令行模式下,你可以执行一些高级的操作,如保存文件、退出 Vim、搜索等。要进入命令行模式,可以在普通模式下按下
:
键。
按键 | 含义 |
---|---|
h | 向左 |
j | 向下 |
k | 向上 |
l | 向右 |
:q | 退出 |
:q! | 退出且不保存 |
:w | 将修改写入到文件 |
:wq 或 :x 或 ZZ | 保存并关闭文件 |
x | 删除光标处字符 |
i | 在光标处切换插入模式 |
I | 在起始行切换插入模式 |
a | 在光标处后切换插入模式 |
A | 在尾行切换插入模式 |
escape 或 ctrl+[ | 退出插入模式 |
dw | 删除单词 |
d$ | 删除本行直到行尾 |
w | 下一个单词 |
$ | 移动到文本尾部 |
^ | 移动到文本首部 |
0 | 移动到当前行文本首部 |
2w | 前进两个单词的位置 |
3e | 转到前面第三个单词的末尾 |
d2w | 删除两个单词 |
dd | 删除整行 |
2dd | 删除两行 |
u | 撤销最后一次的操作 |
U | 撤销整行操作 |
ctrl+r | 重做更改 |
p | 在光标后粘贴 |
P | 在光标前粘贴 |
r | 替换光标下的字符 |
cw | 改变词 |
c$ 或 C | 改变到行尾 |
c2w | 改变两个单词 |
50G 或 :50 | 去到50行 |
G | 去到最后一行 |
gg | 去到第一行 |
/waldo | 搜索waldo |
n | 去到下一个搜索结果位置 |
N | 去到上一个搜索结果位置 |
?carmen | 向上搜索carmen |
ctrl+o | 跳转到前一个位置 |
ctrl+i | 跳转到下一个位置 |
% | 转到匹配的圆括号或方括号 |
:%s/bad/good | 在当前行,将单词bad替换成单词good |
:%s/hi/bye/g | 将整个文件的单词hi替换成单词bye |
:%s/x/y/gc | 将整个文件x替换成y,并提示更改 |
:!ls | 运行ls命令 |
v | 打开可视模式 |
vw | 在可视模式选择单词 |
vwd 或 vwz | 在可视模式选择单词后删除单词 |
:w play.rb | 将当前文件另存为“play.rb” |
:r hat.rb | 读取”hat.rb“文件 |
o | 在下方插入新行 |
O | 在上方插入新行 |
e | 去到下一个单词尾部 |
2e | 去到下两个单词的尾部 |
R | 进入替换模式 |
yw | 复制一个单词 |
y$ | 复制到行尾 |
set ignorecase or set ic | 修改搜索设置:区分大小写 |
set noignorecase or set noic | 修改搜索设置:不区分大小写 |
:e sun.rb | 打开”sun.rb”文件 |
:help e | 查询e命令的文档 |
:help w | 查询w命令的文档 |
管理本地LINUX用户和组
用户和组
什么是用户?
在操作系统中,每个进程(运行的程序)都以特定的用户身份运行。此外,每个文件和目录也都关联着一个特定的用户,决定了对其的访问权限。
id 命令
id
命令用于显示有关用户的信息,包括用户的身份 (uid)、组身份 (gid) 以及与用户相关的组。通过提供用户名作为 id
命令的参数,可以获取其他用户的基本信息。
示例命令
获取当前用户信息:
1
id
获取其他用户信息:
1
id <用户名>
ps命令
在常见的Unix和类Unix系统中,ps aux
和 ps au
是两种不同的 ps
命令的用法,它们之间的主要区别在于选项的格式。
ps aux
:a
表示显示所有用户的进程,而不仅仅是当前用户的进程。u
表示以用户为基础显示详细的进程信息。
因此,
ps aux
会列出系统上所有用户的所有进程,并显示详细的进程信息,包括用户、进程ID、CPU使用率、内存使用等。ps au
:a
表示同样是显示所有用户的进程。u
表示以用户为基础显示简要的进程信息。
在 ps
命令的输出中,以下列出的各列提供了关于系统中正在运行的进程的详细信息:
USER: 显示拥有该进程的用户名。
PID: 进程ID(Process ID),是用于唯一标识正在运行的进程的数字。
%CPU: 进程使用的CPU百分比。表示进程占用CPU资源的百分比。
%MEM: 进程使用的物理内存百分比。表示进程占用系统内存的百分比。
VSZ: 虚拟内存大小(以千字节为单位)。表示进程使用的虚拟内存的总量。
RSS: 常驻集大小(以千字节为单位)。表示进程占用的物理内存的总量。
TTY: 与进程关联的终端设备(如果有的话)。
STAT: 进程的状态。常见的状态包括运行(R)、等待(S)、睡眠(D)、僵尸(Z)等。
START: 进程启动的时间或日期。
TIME: 进程占用CPU的累计时间。
COMMAND: 启动进程的命令行。
默认情况下,不使用选项运行 ps
将选择与当前用户相同的有效用户 ID(EUID)并与调用 ps
的终端关联的所有进程。
- 方括号中的进程(通常位于顶部)是调度的内核线程。
- 僵尸进程在
ps
列表中显示为 exiting 或 defunct。 ps
仅显示一次,如需重复更新的进程显示,请运行top(1)
。ps
可以采用树形格式显示,以查看父/子关系。- 默认输出未排序,显示顺序与系统进程表的顺序匹配,在进程终止和新进程创建时重新使用列表行。输出可能按时间顺序显示,但不一定,除非使用明确的
-o
或--sort
选项。
树形结构:
1 | ps aux --forest |
/etc/passwd 文件说明
/etc/passwd
文件是一个包含系统用户信息的文本文件,其中包含了用户的基本信息及其对应的用户编号(UID)和其他相关信息。以下是 /etc/passwd
文件的基本格式和说明:
格式:
1 | 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell |
说明:
用户名: 用户的登录名。
口令: 存放用户密码的字段。在现代系统中,实际的密码信息通常存储在
/etc/shadow
文件中,而在/etc/passwd
中显示的是一个占位符(通常是x
或*
)。用户标识号(UID): 用于唯一标识用户的数字。
组标识号(GID): 用户的主要组的标识号。用户可以属于多个组,但这是用户主要属于的组。
注释性描述: 包含有关用户的其他信息,通常是用户的真实姓名或其他说明。
主目录: 用户登录后的初始工作目录。
登录Shell: 用户登录后启动的Shell。
示例:
1 | john:x:1000:1000:John Doe:/home/john:/bin/bash |
上述示例表示:
- 用户名是
john
。 - 口令字段显示
x
或*
。 - 用户标识号(UID)是
1000
。 - 组标识号(GID)是
1000
。 - 注释性描述是
John Doe
。 - 主目录是
/home/john
。 - 登录Shell 是
/bin/bash
。
/etc/passwd
文件提供了用户与其UID之间的映射关系,这对于系统管理和权限控制非常重要。
什么是组?
在Unix和类Unix系统中,组是用户的集合,用于管理和组织用户,并定义了用户对文件和资源的访问权限。以下是有关组的基本概念和相关信息:
主要组(Primary Group):
- 定义: 每个用户有且仅有一个主要组。
- 关联: 本地用户的主要组通过
/etc/passwd
文件中的第三个字段(组标识号 GID)定义。 - 文件所有权: 用户创建的新文件通常属于其主要组。
- 默认设置: 通常,新建用户的主要组是与用户同名的新建组。这个同名组通常被称为用户专用组(User Private Group,UPG),而用户是该组的唯一成员。
补充组(Supplementary Group):
成员身份: 用户可以是零个或多个补充组的成员。
定义: 补充组成员身份在
/etc/group
文件中的组条目的最后一个字段中定义。对于本地组,该字段由逗号分隔的用户列表确定。权限辅助: 补充组成员身份有助于确保用户具有对系统中文件和其他资源的适当访问权限。
示例 /etc/group
条目:
1 | example_group:x:1001:user1,user2,user3 |
上述示例表示:
- 组名是
example_group
。 - 组标识号(GID)是
1001
。 - 用户
user1
、user2
和user3
是该组的补充成员。
组是系统中管理和分配权限的重要概念,有助于组织和控制用户对资源的访问。
获取超级用户访问权限
Root 用户和超级用户权限
在大多数操作系统中,包括 Red Hat Enterprise Linux,存在一种特殊的用户,被称为超级用户或 root 用户。以下是关于 root 用户和超级用户权限的一些关键信息:
Root 用户特权:
权限范围: Root 用户具有系统中所有权限,包括对文件系统、用户管理、软件安装和系统配置等方面的完全控制。
系统管理: 用于执行需要系统管理员权限的任务,如安装、配置和维护软件,以及对系统文件和目录的管理。
安全性: Root 用户拥有无限制的权限,但也因此带来了潜在的系统破坏和滥用的风险。
用户升级到 Root 权限:
普通用户登录: 系统管理员通常以普通用户身份登录系统。
权限升级: 在需要执行需要超级用户权限的任务时,管理员通过各种工具(如
sudo
)临时升级到 root 用户,以执行特权操作。
安全建议:
最小权限原则: 建议管理员仅在必要时升级到 root 用户,以最小化潜在的安全风险。
正常用户登录: 推荐管理员使用普通用户帐户登录系统,仅在必要时切换到 root 用户执行任务。
限制 Root 权限: 避免在不必要的情况下使用 root 用户,以减少潜在的系统破坏风险。
Root 用户在 Linux 系统中类似于 Windows 上的本地 Administrator 帐户,是系统管理中不可或缺的一部分。然而,为了提高系统的安全性,推荐管理员在正常情况下使用普通用户权限。
利用su切换用户
su命令
su
命令允许用户在终端中切换到另一个用户帐户。以下是关于 su
命令的一些重要信息:
基本用法:
命令格式:
su [选项] [用户名]
切换到 root 用户: 如果未指定用户名,系统将默认切换到 root 帐户。
作为普通用户调用:
- 密码提示: 当以普通用户身份调用
su
时,系统将提示输入要切换到的帐户的密码。
作为 root 用户调用:
- 无需密码: 当以 root 用户身份调用
su
时,通常无需输入帐户密码。
安全性注意事项:
密码保护: 为了安全性,推荐在切换用户时使用密码,即使是以 root 用户身份调用
su
。最小权限原则: 建议在完成需要超级用户权限的任务后,立即返回到普通用户身份,以最小化潜在的安全风险。
su
命令是在终端中方便地切换用户的工具,但在使用时需要注意安全性,尤其是在切换到超级用户权限时。
1 | [root@oraclelinux lijunjie]# su - lijunjie |
su username
对比 su - username
su username
- 启动类型:non-login shell
- 环境设置:不改变环境,仅切换用户身份。
su - username
- 启动类型:login shell
- 环境设置:类似完全登录该用户,重新加载用户配置文件。
主要区别:
su -
更彻底切换用户,重新加载配置文件,改变环境。su
轻量,仅切换用户身份,不改变环境。
sudo命令
在Linux中,权限模型较为粗糙,root用户拥有执行任何操作的特权,而其他用户对系统相关的操作受到限制。常见解决方案是使用su
允许标准用户暂时切换为root用户,但这带来了一些缺点,如需要知道root用户的密码以获取超级用户特权。
sudo命令的优势
- sudo允许用户根据
/etc/sudoers
文件的设置,以root或其他用户身份运行命令。 - 与
su
不同,sudo要求用户输入自己的密码进行身份验证,而不是目标用户的密码。 - 管理员可以将特定的权限委派给用户,而无需共享root密码。
- sudo允许用户根据
sudo的使用示例
- 如果sudo已配置为允许名为student的用户以root身份运行
usermod
命令,那么student用户可以运行以下命令锁定用户帐户:1
sudo usermod -L lijunjie
- 如果sudo已配置为允许名为student的用户以root身份运行
通过sudo,管理员可以更细粒度地控制用户对系统的访问权限,从而提高安全性。
使用 sudo的另一个优点在于,通过 sudo 执行的所有命令都默认为将日志记录到/var/log/secure中。
1 | tail /var/log/secure |
在红帽企业 Linux7 中 wheel
组的所有成员都可使用 sudo 以包括 root 在内的任何用户的身份运行命令,这是与红帽企业 Linux 6 和更早版本之间的区别。
管理本地用户帐户
可使用很多命令行工具来管理本地用户帐户。
useradd命令
useradd
命令是Linux和Unix系统中用于创建新用户的命令。它用于在系统中添加新的用户账户,并可以设置一些与用户相关的属性。以下是useradd
命令的基本用法和一些常见选项:
- 基本语法:
1 | sudo useradd [options] username |
- 常见选项:
-c, --comment COMMENT
: 设置用户的备注信息(通常是用户的全名)。1
sudo useradd -c "John Doe" username
-g, --gid GROUP
: 指定新用户所属的初始用户组。1
sudo useradd -g staff username
-m, --create-home
: 创建用户的主目录。1
sudo useradd -m username
-s, --shell SHELL
: 指定用户的默认登录shell。1
sudo useradd -s /bin/bash username
-u, --uid UID
: 为新用户指定一个UID。1
sudo useradd -u 1001 username
-G, --groups GROUPS
: 指定用户的附加组。1
sudo useradd -G wheel,staff username
-e, --expiredate EXPIRE_DATE
: 设置账户的过期日期。1
sudo useradd -e 2023-12-31 username
-p, --password PASSWORD
: 设置用户的密码(通常建议使用passwd
命令进行密码设置)。1
sudo useradd -p 'encrypted_password' username
示例用法:
创建用户并设置密码:
1
2sudo useradd -m username
sudo passwd username创建用户并指定组和shell:
1
sudo useradd -m -g staff -s /bin/bash username
创建用户并设置过期日期:
1
sudo useradd -e 2023-12-31 username
创建用户并指定UID:
1
sudo useradd -u 1001 username
请注意,useradd
命令通常需要以管理员权限运行,因此使用sudo
来执行。此外,密码的最佳实践是使用passwd
命令进行设置,而不是直接在useradd
命令中指定密码。
usermod命令
usermod
命令是Linux和Unix系统中用于修改用户账户属性的命令。通过usermod
命令,管理员可以更改现有用户的各种属性,例如用户组、登录shell、密码等。以下是usermod
命令的基本用法和一些常见选项:
- 基本语法:
1 | sudo usermod [options] username |
- 常见选项:
-c, --comment COMMENT
: 修改用户的备注信息。1
sudo usermod -c "John Doe" username
-g, --gid GROUP
: 修改用户所属的主要用户组。1
sudo usermod -g staff username
-G, --groups GROUPS
: 修改用户的附加组(注意:这会覆盖用户的当前附加组列表)。1
sudo usermod -G wheel,staff username
-s, --shell SHELL
: 修改用户的默认登录shell。1
sudo usermod -s /bin/bash username
-u, --uid UID
: 修改用户的UID。1
sudo usermod -u 1001 username
-e, --expiredate EXPIRE_DATE
: 设置账户的过期日期。1
sudo usermod -e 2023-12-31 username
-p, --password PASSWORD
: 设置用户的密码(同样,建议使用passwd
命令进行密码设置)。1
sudo usermod -p 'encrypted_password' username
示例用法:
修改用户组:
1
sudo usermod -g newgroup username
添加附加组:
1
sudo usermod -aG additionalgroup username
修改登录shell:
1
sudo usermod -s /bin/zsh username
修改过期日期:
1
sudo usermod -e 2023-12-31 username
修改UID:
1
sudo usermod -u 1001 username
userdel命令
userdel
命令是Linux和Unix系统中用于删除用户账户的命令。
该命令删除指定的用户账户以及与之相关的文件和信息。以下是userdel
命令的基本用法和一些常见选项:
- 基本语法:
1 | sudo userdel [options] username |
- 常见选项:
-r, --remove
: 删除用户的主目录以及与用户相关的所有文件。1
sudo userdel -r username
示例用法:
仅删除用户账户(保留主目录):
1
sudo userdel username
删除用户账户及其主目录:
1
sudo userdel -r username
注意事项:
删除用户账户时,建议使用
-r
选项,以便同时删除用户的主目录和相关文件。如果不使用-r
选项,用户主目录和某些其他文件可能会保留在系统中。在执行删除操作之前,请确保该用户不再需要系统中。删除用户将导致与该用户相关的文件和数据永久丢失。
删除用户账户可能会影响与之相关的进程和文件权限,因此在删除用户之前,请确保了解其对系统的影响。
passwd命令
passwd
命令是Linux和Unix系统中用于更改用户密码的命令。该命令允许用户更改其自己的密码,也可以由系统管理员用于更改其他用户的密码。以下是passwd
命令的基本用法和一些常见选项:
- 基本语法:
1 | passwd [options] [username] |
- 常见选项:
无选项: 如果没有提供用户名,
passwd
将更改调用者的密码。如果提供了用户名,将更改指定用户的密码。1
2passwd
passwd username-l, --lock
: 锁定用户账户,禁止用户登录。1
sudo passwd -l username
-u, --unlock
: 解锁之前被锁定的用户账户。1
sudo passwd -u username
-d, --delete
: 删除用户密码,使账户变成没有密码状态。1
sudo passwd -d username
示例用法:
更改当前用户密码:
1
passwd
更改其他用户密码:
1
sudo passwd username
锁定用户账户:
1
sudo passwd -l username
解锁用户账户:
1
sudo passwd -u username
删除用户密码(设置为空):
1
sudo passwd -d username
注意事项:
更改密码时,请遵循系统密码策略,例如密码长度、复杂性要求等。
在使用
-d
选项时,需要管理员权限,以确保对密码文件的更改得到正确执行。锁定用户账户后,用户将无法使用密码登录系统。解锁用户账户后,用户可以再次使用密码登录。
UID范围
这个表格简要概述了在红帽企业 Linux 系统中的不同UID范围的分配和用途。UID是用于唯一标识用户的数字,而Linux系统使用这些范围来划分不同类型的用户。
UID 范围 | 描述 |
---|---|
0 | 超级用户帐户 root |
1-200 | 系统用户,静态分配给红帽的系统进程 |
201-999 | 系统用户,用于文件系统中没有自己文件的系统进程。通常在需要时动态分配。这些用户通常用于以非特权身份运行的程序。 |
1000+ | 可供分配给普通用户的范围 |
管理本地组帐户
groupadd命令
groupadd
命令是Linux和Unix系统中用于创建新用户组的命令。用户组是具有相似权限的一组用户的集合。groupadd
命令用于在系统中添加新的用户组。以下是groupadd
命令的基本用法和一些常见选项:
- 基本语法:
1 | sudo groupadd [options] groupname |
- 常见选项:
无选项: 使用最简单的形式,仅提供用户组名。
1
sudo groupadd groupname
-g, --gid GID
: 为新用户组指定一个GID(组标识符)。1
sudo groupadd -g 1001 groupname
示例用法:
创建新用户组:
1
sudo groupadd groupname
创建指定GID的用户组:
1
sudo groupadd -g 1001 groupname
注意事项:
用户组的名称和GID在系统中应该是唯一的。在创建用户组时,请确保不会与现有用户组产生冲突。
可以使用
/etc/group
文件来查看系统中已有的用户组信息。
groupmod命令
groupmod
命令是Linux和Unix系统中用于修改用户组属性的命令。通过groupmod
命令,管理员可以更改现有用户组的各种属性,例如用户组名或GID。以下是groupmod
命令的基本用法和一些常见选项:
- 基本语法:
1 | sudo groupmod [options] groupname |
- 常见选项:
-n, --new-name NEW_GROUPNAME
: 修改用户组的名称。1
sudo groupmod -n newgroupname oldgroupname
-g, --gid GID
: 修改用户组的GID(组标识符)。1
sudo groupmod -g 1002 groupname
示例用法:
修改用户组名称:
1
sudo groupmod -n newgroupname oldgroupname
修改用户组的GID:
1
sudo groupmod -g 1002 groupname
注意事项:
修改用户组名称或GID时,请确保不会与系统中其他用户组产生冲突。
在使用
groupmod
命令时,需要以管理员权限运行,因此使用sudo
来执行。
groupdel命令
groupdel
命令是Linux和Unix系统中用于删除用户组的命令。用户组是具有相似权限的一组用户的集合。
通过groupdel
命令,管理员可以从系统中删除不再需要的用户组。以下是groupdel
命令的基本用法和一些常见选项:
- 基本语法:
1 | sudo groupdel groupname |
示例用法:
删除用户组:
1
sudo groupdel groupname
注意事项:
删除用户组时,请确保不会影响到系统中的用户或文件。
在执行删除操作之前,请确保不再需要删除的用户组,因为删除后将无法恢复。
在使用
groupdel
命令时,需要以管理员权限运行,因此使用sudo
来执行。
管理用户密码
阴影密码和密码策略
在过去,密码以加密形式存储在可读的 /etc/passwd
文件中。然而,随着字典式攻击的增加,安全性受到威胁。为了提高密码存储的安全性,密码哈希被移到更安全的 /etc/shadow
文件中,同时引入了密码策略功能。
- 密码哈希存储结构:
现代密码哈希存储三段信息:
这是一个典型的 /etc/shadow
文件中用户的密码哈希条目。以下是它的解释:
1 | lijunjie:$6$V8ophHap.r5h1geb$RRf1RfwyN.SpiHH2ko3la3wuE1PZwCkVmeUgiVSnxQyBIiLskEp/iAZE9lBgPjY3HJHGdoav9CAxGaPoTBk71.:19663:0:99999:7::: |
- 用户名:
lijunjie
- 密码哈希:
$6$V8ophHap.r5h1geb$RRf1RfwyN.SpiHH2ko3la3wuE1PZwCkVmeUgiVSnxQyBIiLskEp/iAZE9lBgPjY3HJHGdoav9CAxGaPoTBk71.
- 其他字段:
19663:0:99999:7:::
(包含密码更改时间、密码过期时间等)
密码哈希字段的结构如下:
- 哈希算法:
$6$
表示使用SHA-512哈希算法。 - Salt 值:
V8ophHap.r5h1geb
是用于混淆密码哈希的随机值。 - 密码哈希值:
RRf1RfwyN.SpiHH2ko3la3wuE1PZwCkVmeUgiVSnxQyBIiLskEp/iAZE9lBgPjY3HJHGdoav9CAxGaPoTBk71.
是经过哈希加密的密码。
这样的密码哈希结构提高了密码的安全性,同时通过使用不同的 salt 值,即使两个用户使用相同的密码,它们的哈希值也会有所不同,增加了密码破解的难度。
- 密码验证过程:
用户登录尝试时,系统:
- 查询
/etc/shadow
中的用户条目。 - 将用户的Salt与输入的未加密密码组合。
- 使用指定的哈希算法加密组合,创建加密的密码哈希。
- 比较结果与存储的已加密哈希。
如果匹配,用户输入正确密码;否则,登录尝试失败。这种方式确保系统判断用户密码正确性,同时不以明文形式存储密码。
- 密码策略功能:
/etc/shadow
文件还支持密码策略,包括:
- 密码期限: 强制用户定期更改密码。
- 密码到期: 禁用未及时更改密码的用户。
密码策略有助于提高系统的安全性,降低受到密码攻击的风险。
密码哈希和密码策略的引入,使得密码存储更加安全,同时提供了额外的安全层级,增强了系统的整体安全性。
/etc/shadow
文件格式
采用以下格式,九个冒号分隔的字段。
字段 | 描述 |
---|---|
① name | 用户的用户名 |
② password | 加密的密码哈希 |
③ lastchange | 上次更改密码的日期(自1970年1月1日以来的天数) |
④ minage | 允许两次密码更改之间的最小天数 |
⑤ maxage | 密码有效的最大天数 |
⑥ warning | 在密码过期前几天用户会收到警告 |
⑦ inactive | 密码过期后账户被禁用之前的天数 |
⑧ expire | 账户将被禁用的日期(自1970年1月1日以来的天数) |
⑨ blank | 保留字段,目前未使用 |
chage命令
当密码过期,可以通过 chage
命令调整相关密码过期参数,如下图所示:
chage
命令: 用于修改用户密码过期信息。参数说明:
-l
:显示用户密码过期信息。-E
:设置密码失效日期(过期日期)。-m
:设置密码最短更改间隔。-M
:设置密码最长更改间隔。-W
:设置密码过期警告天数。
使用示例:
1
2
3
4
5chage -l username # 显示用户密码过期信息
chage -E YYYY-MM-DD username # 设置密码失效日期
chage -m MIN_DAYS username # 设置密码最短更改间隔
chage -M MAX_DAYS username # 设置密码最长更改间隔
chage -W WARN_DAYS username # 设置密码过期警告天数
通过 chage
命令的不同选项,可以对用户密码的过期策略进行灵活调整。
限制访问
直接锁用户:
1 | [root@oraclelinux lijunjie]$ sudo usermod -L lijunnan |
设置锁期限:
1 | [root@oraclelinux lijunjie]$ sudo usermod -L -e 1 lijunjie |
命令说明:
sudo
:以超级用户权限执行命令。usermod
:用于修改用户账户的命令。-L
:锁定用户账户,防止用户登录。-e 1
:设置用户的过期日期为 1,即将用户账户的有效期限设置为 1970 年 1 月 2 日,实际上就是过期用户账户。lijunjie
:表示要修改的用户名,这里是 elvis。
将用户的登录程序变成nologin,使之进入不了shell
1 | [root@oraclelinux lijunjie]$ sudo usermod -s /sbin/nologin lijunjie |
利用LINUX文件系统权限控制文件访问
Linux文件系统权限
Linux 文件系统权限通过文件所有者、文件所属组和其他用户这三个类别来控制对文件的访问。以下是对文件系统权限的整理:
文件所有者(User):
- 文件通常由创建文件的用户所有。
- 文件所有者具有最具体的权限,其权限设置覆盖其他用户类别的权限。
文件所属组(Group):
- 文件归属于一个主要用户组,通常是创建文件的用户组。
- 组成员可以通过设置组权限来影响文件的访问。
其他用户(Others):
- 其他用户是指既不是文件所有者也不是文件所属组成员的用户。
- 文件的权限设置可用于控制其他用户的访问权限。
权限设置:
- 读权限(Read): 允许查看文件内容和属性。
- 写权限(Write): 允许修改文件内容和属性。
- 执行权限(Execute): 对于目录,允许用户进入该目录;对于文件,允许执行文件。
权限组合规则:
- 用户权限覆盖组权限,文件所有者的权限优先级最高。
- 具有相同组权限的组成员在文件访问方面有共同的权限。
示例场景:
- 如果文件需要协作,与一个或多个特定的组关联,并设置适当的组权限。
- 例如,joshua 和 allison 协作时,文件可关联到 web 组,组权限设置以允许所需的访问。
只有三种权限可应用:读取、写入和执行。这些权限对访问文件和目录的影响如下:
对文件和目录权限的影响
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
r(读取) | 可以读取文件的内容。 | 可以列出目录的内容(文件名)。 |
w(写入) | 可以更改文件的内容。 | 可以创建或删除目录中的任一文件。 |
x(执行) | 可以作为命令执行文件。 | 可以访问目录的内容(取决于文件中文件的权限)。 |
查看文件/目录权限和所有权
ls
命令的-l
选项将展开文件列表,以包括文件的权限和所有权:
1 | [root@oraclelinux lijunjie]# ls -ld /home |
从命令行管理文件系统权限
更改文件/目录的权限
chmod
是用于从命令行更改文件或目录权限的命令,其全称为 “change mode”,也称为 “更改模式”。以下是有关 chmod
命令的整理:
- 命令:
chmod
:用于更改文件或目录的权限。
- 含义:
- 全称为 “change mode”,指的是更改文件或目录的权限模式。
- 权限说明:
- 权限说明指的是对文件或目录所设置的读(r)、写(w)、执行(x)权限。
- 权限设置方式:
符号法(Symbolic Mode): 使用符号表示权限的添加或移除。
+
:添加权限。-
:移除权限。=
:设置权限。
数值法(Numeric Mode): 使用数字表示权限。
- 每个权限用三位二进制数表示,总共九位,分为三组。
- 第一组表示文件所有者的权限,第二组表示文件所属组的权限,第三组表示其他用户的权限。
- 权限分别用 4(读)、2(写)、1(执行) 表示,相加得到相应权限值。
符号法关键词:
1 | chmod WhoWhatWhich file|directory |
- Who 是指u、g、o、a(代表用户、组、其他、全部)
- What是指+、-、=(代表添加、删除、精确设置)
- Which是指 r、w、x(代表读取、写入、可执行)
例子:
1 | chmod u=rw test |
数值法:
1 | chmod ### file|directory |
- 每个数字代表一个访问级数:用户、组、其他。
- #是r=4、w=2和x=1的和。
例子:
1 | chmod 777 test |
更改文件/目录的用户或组所有权
chown命令
chown
是用于更改文件或目录所有者的命令,其全称为 “change owner”,用于将文件或目录的所有权从一个用户更改为另一个用户。以下是有关 chown
命令的整理:
命令:
chown
:用于更改文件或目录的所有者。
含义:
- 全称为 “change owner”,指的是更改文件或目录的所有者。
用法:
chown new_owner:new_group filename
:将文件或目录的所有者更改为new_owner
,同时将所属组更改为new_group
。
选项:
-R
:递归地更改文件夹及其子文件夹的所有者。--from=old_owner:old_group
:仅更改指定旧所有者和旧组的文件。
示例用法:
- 更改文件所有者:
chown new_owner filename
- 更改文件所有者和所属组:
chown new_owner:new_group filename
- 递归更改文件夹及其子文件夹的所有者:
chown -R new_owner:new_group directory
- 更改文件所有者:
管理默认权限和文件访问
特殊权限:setuid 和 setgid
setuid(Set User ID):
- 将可执行文件的 setuid 位设置后,执行者将以文件所有者的权限执行该文件,而不是以执行者自己的权限。
setgid(Set Group ID):
- 将可执行文件的 setgid 位设置后,执行者将以文件所属组的权限执行该文件,而不是以执行者自己的权限。
示例 - passwd 命令:
- 对于
passwd
命令,设置了 setuid 权限后,普通用户执行时以 root 用户权限运行,允许修改密码并写入/etc/shadow
文件。
- 对于
使用场景:
- 主要用于允许普通用户执行某些系统命令,以满足需要特殊权限的场景,而无需赋予完全的超级用户权限。
注意事项:
- 使用这些权限需谨慎,确保可执行文件仅执行受信任的操作,以防潜在的安全风险。
特殊权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
u+s (suid) | 以拥有文件的用户身份,而不是以运行文件的用户身份执行文件。 | 无影响。 |
g+s (sgid) | 以拥有文件的组身份执行文件。 | 在目录中最新创建的文件将其组所有者设置为与目录的组所有者相匹配。 |
o+t (sticky) | 无影响。 | 对目录具有写入权限的用户仅可以删除其所拥有的文件,而无法删除或强制保存到其他用户所拥有的文件。 |
设置特殊权限
用符号表示:setuid = u+s; setgid = g+s; sticky = o+t
用数组表示(第四位):setuid = 4; setgid = 2; sticky = 1
示例:
在directory目录上添加setgid
位:
1 | chmod g+s directory |
设置setgid位,并对directory中的用户和组设置读取/写入/执行权限。
1 | chmod 2770 directory |
默认文件权限
umask命令
umask(文件创建屏蔽)是一个权限屏蔽值,它会从新创建文件的默认权限中去除特定的权限位。
具体来说,umask 的值会从默认权限中减去。
文件的默认权限通常是由创建进程和系统的默认权限设定决定的。当使用 touch
命令创建文件时,其默认权限会受到 umask 的影响。
对于大多数 Linux 系统,全局 umask
值通常在 /etc/profile
或 /etc/bashrc
中设置。你可以编辑这些文件,找到 umask
行,并将其设置为你想要的值。例如:
1 | umask 022 |
例如,如果 umask 的值是 0022
,它表示不允许其他用户有写权限。假设系统默认将新文件权限设置为 0666
,即所有用户都有读写权限。应用 umask 后,新文件的权限将变为 -rw-r--r--
。这就是为什么你通过 touch
创建的文件权限是 -rw-r--r--
的原因。
你可以通过运行 umask
命令查看当前 shell 的 umask 值。例如:
1 | $ umask |
这样你就能了解 umask 对新创建文件权限的影响。
1 | [root@oraclelinux lijunjie]# touch aaa |
使用umask设置之后:
1 | [root@oraclelinux lijunjie]# umask 0777 |
监控和管理LINUX进程
进程
进程是操作系统中的基本概念,它代表正在运行的程序的实例,包含了程序的代码、数据、以及相关的系统资源。每个进程都是独立运行的实体,有自己的内存空间和执行环境。
定义: 进程是已启动的可执行程序的运行中实例。
组成部分:
- 已分配内存的地址空间。
- 安全属性,包括所有权凭据和特权。
- 一个或多个执行线程的程序代码。
- 进程状态。
环境:
- 本地和全局变量。
- 当前调度上下文。
- 分配的系统资源,如文件描述符和网络端口。
多任务处理与进程状态
在多任务处理操作系统中,每个CPU(或CPU核心)在一个时间点上处理一个进程。在进程运行时,它对CPU时间和资源分配的直接要求会发生变化。进程分配有一个状态,它随着环境要求而改变。
多任务处理:
- 多任务处理系统允许多个任务(进程)在同一时间内运行,通过在不同任务之间进行切换,实现同时性。
CPU时间分配:
- 每个CPU在某一时刻只处理一个进程,通过时间分片或优先级等方式切换不同进程,以实现对CPU时间的合理分配。
资源分配:
- 进程对系统资源的需求可能随着时间和任务的不同而变化,系统需要动态地分配和回收资源以满足进程的要求。
进程状态:
- 进程状态反映了进程在其生命周期中所处的阶段。主要状态包括就绪、运行、阻塞等,根据不同的操作系统和模型可能有所差异。
环境要求:
- 进程状态的变化通常受到环境要求的影响,例如用户输入、系统资源可用性等。
多任务处理系统通过灵活的进程状态管理和资源调度,有效地支持多个任务在同一时间内共享系统资源,提高系统整体的效率和响应速度。
名称 | 标志 | 内核定义的状态名称和描述 |
---|---|---|
运行中 | R | TASK_RUNNING:进程正在CPU上执行或等待运行。在此状态下,进程可能在执行用户例程、内核例程(系统调用)或者已排队并准备就绪。 |
睡眠 | S | TASK_INTERRUPTIBLE:进程正在等待某一条件,如硬件请求、系统资源访问或信号。一旦事件或信号满足条件,进程将返回到运行中状态。 |
睡眠 | D | TASK_UNINTERRUPTIBLE:类似于S状态,但不响应传递的信号。仅在特定条件下使用,其中进程中断可能导致设备状态问题。 |
睡眠 | K | TASK_KILLABLE:与不可中断的D状态相似,但允许等待中的任务通过响应信号而被中断(完全退出)。通常作为可中断的D状态显示。 |
已停止 | T | TASK_STOPPED:进程已被停止(暂停),通常是由用户或其他进程发出的信号引起的。进程可以通过另一信号返回到运行中状态,继续执行(恢复)。 |
已停止 | T | TASK_TRACED:正在被调试的进程也会临时停止,与STOPPED状态共享同一个T状态标志。 |
僵停 | Z | EXIT_ZOMBIE:子进程在退出时向父进程发出信号,所有资源除进程身份(PID)外都已释放。 |
僵停 | X | EXIT_DEAD:进程已经完全释放,不会在进程列表实用程序中看到。由父进程清理(获取)剩余的子进程结构时达到此状态。 |
列出进程
参考:管理本地Linux用户和组-用户和组章节
1 | ps aux |
1 | ps aux | head |
1 | ps aux --forest |
控制作业
作业与会话
作业与会话:
作业控制允许 shell 管理多个命令的运行。在没有作业控制时,父级 shell 分出子进程运行命令,一直保持睡眠状态,直到子进程退出。使用作业控制,可以选择性地暂停、恢复和异步运行命令,使得 shell 在子进程运行期间能够接受其他命令。
前台进程:
- 前台进程在终端窗口中运行,其控制终端设备 ID 与进程相关联。
- 接收键盘输入和信号,可以从终端读取或向终端写入(通过 stdin 和 stdout)。
会话:
- 进程会话在终端第一次打开时创建,所有从该终端启动的进程共享相同的会话 ID。
- 会话内一次只能有一个进程处于前台。
后台进程:
- 以无控制终端的形式启动,通常用于服务守护进程和内核进程线程。
- 在 ps 列表中,后台进程将在 TTY 列中显示一个问号 (?)。
- 后台进程不需要终端交互,因此如果尝试与终端交互,可能会被暂停。
在后台运行作业
任何命令都可以在后台启动,只需在命令行中附加 & 符号 (&)。
bash shell显示作业编号(对于该会话唯一)和新的子进程的 PID。
命令 shell 不等待子进程,并且重新显示 shell 提示符。
例如:
1 | sleep 3 & |
jobs命令
bash 命令 shell 根据会话跟踪作业,这些作业可通过 jobs 命令显示在一张表中。
1 | [root@oraclelinux lijunjie]# sleep 10 & |
fg命令
通过 fg 命令和作业 ID(%job number) 将后台作业带到前台,后台作业可以重新和控制终端连接。
1 | [root@oraclelinux lijunjie]# sleep 100 & |
ctrl+z将进程切换到后台并且暂停
例如:
1 | vim |
可以通过fg恢复
ps 选项j显示作业信息,如各个会话的初始命令 shell。
1 | [root@oraclelinux lijunjie]# sleep 10 & |
bg命令
bg
命令用于将作业(job)置于后台运行,允许其继续执行但不再占用前台。
1 | [root@oraclelinux lijunjie]# sleep 1000 [ctrl+z] |
中断进程
使用信号控制进程
信号是传递至进程的软件中断,用于向执行中的程序报告事件。这些事件可能包括错误、外部事件(例如I/O请求或计时器过期),或明确请求(例如使用信号发送命令或键盘序列)。
下表列出了系统管理员用于日常进程管理的基本信号。请通过短名称 (HUP) 或正确名称(SIGHUP)指代信号。
基本进程管理信号
信号编号 | 短名称 | 定义 | 用途 |
---|---|---|---|
1 | HUP | 挂起 | 用于报告终端控制进程的终止。也用于请求进程重新初始化(重新加载配置)而不终止。 |
2 | INT | 键盘中断 | 导致程序终止。可以被拦截或处理。通知键入INTR字符)(Ctrl+c)发送。 |
3 | QUIT | 键盘退出 | 与SIGINT相似,但也在终止时生成进程转储。通过键入QUIT字符(Ctrl-\)发送。 |
9 | KILL | 中断,无法拦截 | 导致立即终止程序。无法被拦截、忽略或处理;总是致命的。 |
15 | TERM | 终止 | 导致程序终止。和SIGKILL不同,可以被拦截、忽略或处理。要求程序终止的友好方式;允许自我清理。 |
18 | CONT | 继续 | 发送至进程使其恢复(若已停止)。无法被拦截。即使被处理,也始终恢复进程。 |
19 | STOP | 停止,无法拦截 | 暂停进程。无法被拦截或处理。 |
20 | TSTP | 键盘停止 | 和SIGSTOP不同,可以被拦截、忽略或处理。通过键入SUSP字符(Ctrl+z)发送。 |
每个信号通常都有一个默认操作,其行为可以是以下之一:
- 终止(Termination):导致程序立即终止(退出)。
- 核心转储(Core Dump):导致程序保存内存映像(核心转储),然后终止。
- 停止(Stop):导致程序停止执行(暂停),等待继续(恢复)。
程序可以通过实施信号处理例程来为预期的信号事件做准备,以忽略、替换或扩展信号的默认操作。
通过明确请求发送信号的命令,用户可以向当前的前台进程发送信号,具体操作包括键入键盘序列以执行暂停(Ctrl-Z
)、中断(Ctrl-C
)或核心转储(Ctrl-\
)。要向后台进程或另一会话中的进程发送信号,需要使用信号发送命令。可以通过信号名称(例如-HUP或-SIGHUP)或编号(例如-1)指定信号。用户可以中断自己的进程,但要终止由其他用户拥有的进程则需要root特权。
kill
命令根据 ID 向进程发送信号。虽然其名称为 kill
,但该命令可用于发送任何信号,而不仅仅是终止程序的信号。
1 | kill PID |
1 | [root@localhost ~]# kill -l |
使用 killall
可发送信号到一个或多个与选择条件匹配的进程,如命令名称、由特定用户拥有的进程,或者系统范围内的所有进程。
命令格式:
1 | killall command_pattern |
pkill
命令类似于 killall
,可以向多个进程发送信号。不同之处在于,pkill
使用高级选择条件,可以包含以下条件的组合:
- 命令: 具有模式匹配的命令名称的进程。
- UID: 由某一Linux用户帐户拥有的进程,无论是有效的还是真实的。
- GID: 由某一Linux组帐户拥有的进程,无论是有效的还是真实的。
- 父级: 特定父进程的子进程。
- 终端: 运行于特定控制终端的进程。
pkill
命令的基本用法和一些选择条件的示例:
1 | # 根据命令名称终止进程 |
这些选项允许用户根据不同的条件来选择要终止的进程。
以管理员身份注销用户
要以管理员身份注销用户,可以使用 pkill
或 kill
命令向指定用户的进程发送终止信号。
以下是一般的步骤:
使用
w
命令查看当前登录系统的用户以及他们的活动。通过TTY和FROM列可以确定用户的位置。找到要注销用户的进程,并记下其进程ID(PID)。
使用
pkill
或kill
命令发送终止信号给该用户的进程。
下面是一个简单的示例:
1 | # 使用 w 命令查看当前登录用户 |
请注意,这里的 username
是要注销的用户的用户名。
要查看会话的登录时间以了解用户在系统上的活动时长,你可以使用 w
命令。 w
命令不仅显示用户登录的时间和会话时长,还提供了有关当前作业占用的CPU资源以及前台进程的CPU占用情况等信息。以下是相关信息的整理:
使用
w
命令查看会话信息:1
w
1 |
|
这将终止指定用户的所有进程。
注意:在执行类似于强制注销的操作时,请确保了解并确认要终止的用户的身份,并具有足够的权限执行这些操作。此类操作应当慎重进行,以免造成数据丢失或其他潜在问题。
重要: 虽然SIGTERM
是默认的信号,但SIGKILL
是管理员偏爱常常误用的信号。由于SIGKILL
信号无法被处理或忽略,它总是致命的。然而,它会强行终止进程,而不允许被中断的进程运行自我清理例程。建议先发送SIGTERM
,只有在进程未能响应时再通过SIGKILL
重试。
可以逐一向进程和会话发送信号,也可以集体发送。要终止一个用户的所有进程,可使用pkill
命令。由于登录会话中的初始进程(会话首进程)设计为可以处理会话终止请求并忽略不想要的键盘信号,中断某一用户的所有进程和登录 shell
需要使用 SIGKILL
信号。
1 | [root@localhost ~]# pgrep -l -u lijunjie |
当需要注意的进程位于同一登录会话中时,可能并非必须中断用户的所有进程。
可以通过以下步骤确定会话的控制终端,然后仅中断引用同一终端 ID 的进程。
请注意,除非明确指定了 SIGKILL
信号,否则会话的首进程(通常是bash
登录shell)有可能成功处理终止请求并保持活动,而所有其他会话进程将被终止。
1 | [root@localhost ~]# pgrep -l -u lijunjie |
也可利用父进程和子进程关系来应用相同的选择性进程终止。使用pstree
命令查看系统或单个用户的进程树。使用父进程的 PID 中断其创建的所有子进程。此时,父进程 bash
登录 shell
可以保留,因为信号仅定向至它的子进程。
1 | [root@localhost ~]# pstree -p lijunjie |
监控进程活动
负载平均值
Linux内核使用负载数来衡量系统的活动程度,该负载数是指数移动均值计算的结果。
这个负载数代表了活动系统资源请求的CPU累计数。
以下是关于Linux负载平均值计算的整理:
负载数计算:
- 负载数是通过活动请求数的指数移动均值计算得出的。
- 活动请求数包括运行中的线程和等待I/O的线程的每个CPU队列数。
- 内核跟踪进程资源活动,考虑进程状态的变化。
指数移动平均数:
- 指数移动平均数是用于平滑趋势数据的数学公式,可以提高当前活动的重要性,降低老化数据的权重。
负载平均值:
- 负载平均值是负载数计算例程的结果,表示最近1分钟、5分钟和15分钟内系统活动数据的三个显示值的平均值。
- 默认情况下,每隔五秒运行一次计算例程,累计所有CPU的活动请求数,并计算平均值。
Linux负载平均值的理解:
- 负载平均值代表一段时间内系统负载的感知。
- Linux通过预期服务等待时间(不仅包括CPU,还包括磁盘和网络I/O)来实施平均负载计算。
线程和进程计数:
- Linux不仅计算进程数,还独立计算线程数。
- 运行中的线程(nr_running)和等待I/O资源的线程(nr_iowait)的CPU请求队列对应于运行中和不可中断的睡眠状态的进程。
- 等待I/O包括处于睡眠状态并等待磁盘和网络响应的任务。
负载数的全局计数器:
- 负载数是全局计数器的计算结果,是所有CPU的总和。
- 由于从睡眠状态返回的任务可能会重新调度到不同的CPU,因此难以获得每个CPU的精确计数,但累计数的准确度是有保障的。显示的平均负载代表所有的CPU。
CPU核心和超线程的表示:
- Linux将各个物理CPU核心和微处理器超线程计为独立执行单元,在逻辑上表示和指代为个体CPU。
- 每个CPU拥有独立的请求队列,可以通过查看
/proc/cpuinfo
了解系统CPU的核心表示。
1 | [root@localhost lijunjie]# grep "model name" /proc/cpuinfo |
在一些UNIX系统中,系统负载的指示可能仅考虑CPU使用率或运行队列长度。
然而,Linux负载平均值的设计更为综合,它不仅考虑了CPU的活动,还包含了对I/O的考量。
以下是相关信息的整理:
UNIX系统的负载指示:
- 一些UNIX系统可能仅考虑CPU使用率或运行队列长度来指示系统的负载情况。
Linux负载平均值的考虑因素:
- Linux负载平均值更为综合,不仅考虑了CPU的活动,还包含了对I/O的考量。
- 负载平均值是通过指数移动均值计算的,涵盖了活动系统资源请求的CPU累计数。
空闲CPU和等待时间的关系:
- 具有空闲CPU的系统可能因磁盘或网络资源的忙碌而遇到很长的等待时间。
- 当负载平均值很高但CPU活动很低时,需要检查磁盘和网络活动,因为这可能是系统性能问题的指示。
负载平均值是由三个数值表示,分别代表了最近1分钟、5分钟和15分钟的加权值。通过观察这些值,可以迅速判断系统的负载是在增加还是减少。另外,通过计算近似的每CPU负载值,可以判断系统是否正在经历显著的等待。以下是相关信息的整理:
负载平均值的表示:
- 这三个值分别代表了系统在最近1分钟、5分钟和15分钟内的负载情况的加权值。
判断系统负载趋势:
- 通过观察这三个值,可以迅速判断系统的负载是在增加还是减少。较高的负载值可能表示系统资源紧张。
计算近似的每CPU负载值:
- 通过将负载平均值除以系统的CPU核心数,可以得到近似的每CPU负载值。
- 这有助于判断系统是否正在经历显著的等待。如果每CPU负载值远高于1,说明系统可能存在性能问题。
top
、uptime
、w
和gnome-system-monitor
显示负载平均值。
top命令:
top 命令是系统进程的动态视图,显示一个摘要标题,以及与 ps 信息类似的进程或线程列表。
与静态的ps输出不同,top 以可配置的间隔持续刷新,而且也提供列重新排列、排序和突出显示功能。
用户配置可以保存,变为永久。
默认输出列可以从其他资源工具识别:
- 进程ID (PID)。
- 用户名称(USER) 是进程所有者。
- 虚拟内存VIRT)是进程正在使用的所有内存,包括常驻集合、共享库,以及任何映射或交换的内存页。(ps 命令中标为 VSZ。)
- 常驻内存(RES)是进程所用的物理内存,包括任何驻的共享对象。 (ps 命令中标为 RSS)
- 进程状态(S) 显示为: D = 不可中断睡眠、R = 运行中或可运行、S = 睡眠中、T= 已停止或已跟踪、Z= 僵停
- CPU 时间(TIME)是进程启动以来总的处理时间·可以切换为包含所有过去子进程的累计时间。
- 进程命令名称(COMMAND)。
top中的快捷方式:
键 | 用途 |
---|---|
?或 h | 交互式击剑操作的帮助。 |
l、t、m | 切换到负载、线程和内存标题行。 |
1 | 标题中切换显示单独CPU信息或所有CPU的汇总。 |
s(1) | 更改刷新率,以带小数的秒数表示(如0.5、1、5)。 |
b | 切换反向突出显示运行中的进程;默认为仅粗体。 |
B | 在显示中使用粗体,用于标题以及运行中的进程。 |
H | 切换线程;显示进程摘要或单独线程。 |
u、U | 过滤任何用户名称(有效、真实) |
M | 按照内存使用率,以降序方式对进程列表排序。 |
P | 按照处理器使用率,以降序方式对进程列表排序。 |
K(1) | 中断进程。若有提示,输入PID,再输入signal。 |
r(1) | 调整进程的nice值。若有提示,输入PID,再输入nice_value。 |
W | 写入(保存)当前的显示配置,以便在下一次重新启动top时使用。 |
q | 退出。 |
注意:如果top在安全模式中启动,则不可用。
uptime命令:
1 | [root@localhost lijunjie]# uptime |
w命令:
1 | [root@localhost lijunjie]# w |
gnome-system-monitor命令:
将显示的负载平均值除以系统中的逻辑 CPU 数,值低于表示资源利用率较好,等待时间很短,值高于 1表示资源饱和,而且有一定的服务等待时间。
认识开机自启动管理工具
systemd简介
系统启动和服务管理概述
系统启动和服务器进程由systemd系统和服务管理器进行管理。
该程序提供了在系统启动时和运行中激活系统资源、服务器守护进程和其他进程的方式。
守护进程
守护进程是在后台等待或运行的进程,执行各种任务。通常在系统启动时自动启动,并持续运行至关机或手动停止。按照惯例,许多守护进程的名称以字母“d”结尾。
套接字与通信
为了侦听连接,守护进程使用套接字作为与本地或远程客户端的主要通信通道。套接字可能由守护进程创建,也可能从守护进程中分离,并通过另一进程(如systemd)创建。当客户端建立连接时,套接字传递给守护进程。
服务概念
服务通常指一个或多个守护进程,但启动或停止服务可能对系统状态进行一次性更改,不会留下守护进程继续运行(称为oneshot)。
历史
多年来,Linux和UNIX系统中,进程ID 1属于init进程,负责激活系统中的其他服务,是”init系统”术语的来源。
常见的守护进程通过System V和LSB init脚本在系统启动时启动。在Red Hat Enterprise Linux 7中,进程ID 1属于systemd,作为新的init系统。
systemd的功能
systemd引入了一些新功能,包括:
- 并行化功能: 提高系统启动速度。
- 按需启动守护进程: 无需单独的服务。
- 自动服务依赖关系管理: 防止长时间超时,例如在网络不可用时不启动网络服务。
- 利用Linux控制组: 以一种跟踪相关进程的方式。
这些功能有助于提高系统管理和启动的效率,解决了以前一些系统的限制。
systemctl 和 systemd 单元概述
systemctl 命令
systemctl
是用于管理 systemd 系统的命令行工具。它提供了对各种 systemd 对象的操作,这些对象被称为单元。
systemd 单元
systemd 单元是 systemd 系统中的配置单元,代表了各种系统资源、服务、套接字等。以下是一些常见的单元类型:
- 服务单元 (service units): 代表后台运行的服务或守护进程。例如 web 服务器。
- 套接字单元 (socket units): 用于定义套接字,它们通常由服务单元使用。
- 设备单元 (device units): 表示系统中的硬件设备。
- 挂载单元 (mount units): 定义文件系统的挂载点。
- 目标单元 (target units): 用于分组和关联其他单元,类似于运行级别的概念。
- 路径单元 (path units): 观察文件或路径的状态。如打印系统。
- 定时器单元 (timer units): 触发定时操作,类似于 cron 作业。
systemctl 的常见用法
systemctl start <unit>
: 启动指定单元。systemctl stop <unit>
: 停止指定单元。systemctl restart <unit>
: 重启指定单元。systemctl status <unit>
: 显示指定单元的状态信息。systemctl enable <unit>
: 设置指定单元在系统启动时自动启用。systemctl disable <unit>
: 禁用指定单元,使其在系统启动时不自动启用。systemctl mask <unit>
: 创建服务/dev/null
软链接,占位。systemctl unmask <unit>
: 取消占位。systemctl list-units
: 列出当前加载的所有单元。systemctl -t help
: 显示可用单元类型的列表。
服务状态
通过 systemctl status name.type
可以查看服务的状态。如果未提供单元类型,systemctl
将显示服务单元的状态(如果存在)。
服务状态关键字表格
关键字 | 描述 |
---|---|
loadad | 单元配置文件已处理。 |
active(running) | 正在通过一个或多个持续进程进行。 |
active(exited) | 已成功完成一次性配置。 |
active(waiting) | 运行中,但正在等待事件。 |
inactive | 不在运行。 |
enabled | 将在系统启动时启动。 |
disabled | 不会在系统启动时启动。 |
static | 无法启动,但可以由某一启动的单元自动启动。 |
使用systemctl列出单元文件
查询所有单元的状态,以验证系统启动。
1 | systemctl |
查询服务单元的状态
1 | systemctl list-units --type=service |
显示所有活动或者不活动的套接字单元
1 | systemctl list-units --type=socket --all |
查询处于失败或维护状态的任何单元。可以选择添加-l选项来显示完整的输出。
1 | systemctl status chronyd.service -l |
查看是否激活
1 | systemctl is-active sshd |
是否设置开机启动
1 | systemctl is-enabled sshd |
查看失败的服务
1 | systemctl --failed --type=service |
配置和保护OPENSSH服务
使用SSH 访问远程命令行
什么是 OpenSSH Secure Shell(SSH)?
OpenSSH(Open Secure Shell): OpenSSH 是一种安全外壳协议的实现,用于在计算机网络上的加密通信。它提供了加密的通信会话,使得用户可以在不安全的网络上安全地执行远程命令。
Secure Shell (SSH): SSH 是一种用于在网络上安全地执行命令的协议,通常用于远程登录到远程计算机系统。SSH 提供了加密和身份验证机制,以确保通信的机密性和安全性。
OpenSSH 实施: OpenSSH 是对 SSH 协议的自由开源实现,广泛用于各种操作系统,包括 Linux。它包括客户端和服务器组件,支持加密的远程登录和执行命令。
使用 OpenSSH:
远程登录: 在拥有 SSH 服务的远程 Linux 系统中,用户可以使用
ssh
命令远程登录到该系统。1
ssh username@remote_host
运行远程命令: 除了登录,
ssh
命令还可以用于在远程系统上执行各种命令。1
ssh username@remote_host 'command'
这使得用户可以在远程系统上运行命令而无需直接登录到那台机器。
远程用户登录后,可以用w -f
命令查看当前有多少个会话。
SSH主机秘钥
SSH 加密通信:
SSH 使用公钥加密方式来确保通信的安全性。
当 SSH 客户端连接到服务器时,在客户端登录之前,服务器会发送其公钥副本。
这公钥可用于安全加密通信渠道,并用于验证客户端与服务器之间的身份。
公钥储存与验证:
第一次用户使用 SSH 连接到特定服务器时,客户端会将服务器的公钥会存储在用户的 ~/.ssh/known_hosts
文件中。
之后,每次用户进行连接时,客户端会通过比对 ~/.ssh/known_hosts
文件中的服务器条目和服务器发送的公钥,以确保从服务器获取到的是相同的公钥。
安全验证流程:
- 初次连接: 用户首次连接服务器时,服务器公钥存储在
~/.ssh/known_hosts
。 - 后续连接: 每次连接时,客户端会验证服务器公钥,确保其与之前存储的一致。
- 公钥不匹配: 如果公钥不匹配,客户端认为通信可能被劫持或服务器遭到入侵,并中断连接。
更新公钥:
如果服务器的公钥发生更改(例如,由于硬盘驱动器故障导致公钥丢失,或者出于某些正当理由替换公钥),用户需要更新 ~/.ssh/known_hosts
文件,并删除旧的条目,以便进行登录。
例子:
客户端:
1 | ssh lijunjie@192.168.44.3 |
服务器端:
1 | [root@localhost ~]# ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub |
此时,需要对比SHA256的值是否与服务器端的匹配。若匹配客户端,并且确认,生成~/.ssh/known_hosts
文件。此操作目的是为了方便后续链接的公钥对比,防止中间人攻击。
远程登录ssh
输入ssh命令,输入密码,,即可登录对应用户。
1 | 22815@DESKTOP-LI520 MINGW64 ~/.ssh |
配置基于SSH密钥的身份验证
RSA(Rivest–Shamir–Adleman)是一种非对称加密算法,使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密,同时也用于数字签名验证消息的来源和完整性。基于两个大素数相乘的数学原理,RSA在安全通信和网络领域广泛应用,密钥长度影响安全性,通常选择2048或3072比特的密钥长度。
秘钥生成
客户端生成非对称加密秘钥
1 | ssh-keygen -t rsa |
执行该命令后会生成两个密码,则公钥和私钥。
ssh-copy-id命令
将上一步所生成的公钥复制到远程主机
1 | ssh-copy-id -i ~/.ssh/myvm.pub lijunjie@192.168.44.3 |
客户端配置
客户端配置~/.ssh/config
文件
1 | Host 192.168.44.3 |
此时在客户机即可无密码登录
1 | ssh lijunjie@192.168.44.3 |
自定义SSH服务配置
OpenSSH服务器配置文件
/etc/ssh/sshd_config
文件是 OpenSSH 服务器的配置文件,用于指定 SSH 服务器的各种设置和参数。以下是一些常见配置项的说明:
Port:
- 指定 SSH 服务器监听的端口号,默认为 22。通过修改此项,可以增加安全性,避免使用默认端口。
1
Port 2222
PermitRootLogin:
- 允许或禁止 root 用户通过 SSH 登录。设置为
prohibit-password
表示允许,但密码登录会被禁用;设置为yes
表示允许密码登录;设置为no
表示禁止 root 用户登录。
1
PermitRootLogin prohibit-password
- 允许或禁止 root 用户通过 SSH 登录。设置为
PasswordAuthentication:
指定是否允许使用密码进行身份验证。设置为
yes
表示允许密码登录,设置为no
表示只允许使用密钥进行身份验证。1
PasswordAuthentication yes
1 |
|
PubkeyAuthentication:
- 指定是否允许使用公钥进行身份验证。设置为
yes
表示允许,设置为no
表示禁止。
1
PubkeyAuthentication yes
- 指定是否允许使用公钥进行身份验证。设置为
PermitEmptyPasswords:
- 指定是否允许空密码登录。设置为
yes
表示允许,设置为no
表示禁止。
1
PermitEmptyPasswords no
- 指定是否允许空密码登录。设置为
UsePAM:
- 指定是否使用 PAM(Pluggable Authentication Modules)进行身份验证。设置为
yes
表示使用 PAM,设置为no
表示禁用。
1
UsePAM yes
- 指定是否使用 PAM(Pluggable Authentication Modules)进行身份验证。设置为
X11Forwarding:
- 指定是否允许 X11 转发。设置为
yes
表示允许,设置为no
表示禁止。
1
X11Forwarding yes
- 指定是否允许 X11 转发。设置为
PrintMotd:
- 指定是否显示登录时的信息横幅(Message of the Day)。设置为
yes
表示显示,设置为no
表示不显示。
1
PrintMotd yes
- 指定是否显示登录时的信息横幅(Message of the Day)。设置为
Subsystem sftp:
- 指定用于处理 SFTP(SSH 文件传输协议)的子系统。默认是
internal-sftp
。
1
Subsystem sftp /usr/lib/openssh/sftp-server
- 指定用于处理 SFTP(SSH 文件传输协议)的子系统。默认是
分析和存储日志
系统日志架构
系统日志对于操作系统和进程是关键的,用于记录发生的事件,提供系统审核和故障排除。
在Red Hat Enterprise Linux中,系统日志由两个服务负责处理:systemd-journald 和 rsyslog。
systemd-journald:
- systemd-journald 是一个基于系统日志协议的标准日志记录系统,负责收集来自多个来源的日志消息。它可以处理来自内核、启动阶段、标准输出、系统日志和守护进程的错误消息。这些消息被写入结构化事件日志,默认情况下不在重新启动之间保留。这允许系统错过的日志消息和事件被集中记录到一个中央数据库中。
rsyslog:
- rsyslog 服务在系统日志消息被 systemd-journald 收集后,按照类型和优先级对它们进行排列,并将其写入到
/var/log
目录中的永久文件中。这个服务提供了进一步处理系统日志消息的能力。
- rsyslog 服务在系统日志消息被 systemd-journald 收集后,按照类型和优先级对它们进行排列,并将其写入到
/var/log 目录:
/var/log
目录是系统维护各种特定于系统和服务的日志文件的位置。这些文件包含了由 rsyslog 维护的不同类型的日志信息,如/var/log/messages
、/var/log/secure
等。
通过这两个服务的协同工作,系统管理员可以更轻松地管理、审计和故障排除系统。结构化的事件日志和永久存储的日志文件提供了全面的视图,帮助追踪系统活动和解决问题。
以下是系统日志文件的概述:
日志文件 | 用途 |
---|---|
/var/log/messages |
记录大多数系统日志消息,包括与身份验证、电子邮件处理无关的消息和纯粹的调试消息。 |
/var/log/secure |
记录与安全和身份验证相关的消息和错误的日志文件。 |
/var/log/maillog |
记录与邮件服务器相关的消息。 |
/var/log/cron |
记录与定期执行任务相关的日志文件。 |
/var/log/boot.log |
记录与系统启动相关的消息。 |
查看系统日志文件
系统日志
系统日志文件使用 syslog 协议记录事件,每个日志消息都根据设备和优先级进行分类。以下是系统日志优先级的概述,按照标准化和评级进行了编码:
编码 | 优先级 | 严重性 |
---|---|---|
0 | emerg | 系统不可用。 |
1 | alert | 必须立即采取措施。 |
2 | crit | 严重情况。 |
3 | err | 非严重错误情况。 |
4 | warning | 警告状况。 |
5 | notice | 正常但重要的事件。 |
6 | info | 信息性事件。 |
7 | debug | 调试级别消息。 |
rsyslogd 服务使用这些日志消息的设备和优先级来决定如何处理它们。配置是通过 /etc/rsyslog.conf
文件和 /etc/rsyslog.d/*.conf
中的自定义文件完成的。
管理员可以通过在 /etc/rsyslog.d
目录中放置带有 .conf
后缀的自定义文件来更改 rsyslogd 的配置,而不会被 rsyslog 的更新覆盖。
在 /etc/rsyslog.conf
的 #### RULES ####
部分,指定了日志消息的保存位置。
每行左侧表示匹配指令的日志消息的设备和严重性。设备和严重性字段中可能包含 *
字符作为通配符,表示所有设备或所有严重性级别。每行右侧表示要将日志消息保存到的文件,通常保存在 /var/log
目录中的文件中。
/etc/rsyslog.conf
部分示例:
日志文件轮转
日志文件轮转通过 logrotate
工具实现,旨在防止日志文件将包含 /var/log/
的文件系统填满。轮转日志文件的过程包括以下步骤:
重命名日志文件: 使用名称扩展对日志文件进行重命名,通常采用轮转日期作为扩展。例如,如果文件在 2023 年 11 月 22 日轮转,则原来的
/var/log/messages
文件将被重命名为/var/log/messages-20231122
。创建新日志文件: 轮转后,系统会创建一个新的日志文件,以继续接收写入操作。
通知相关服务: 通知正在向日志文件执行写入操作的服务,使其开始写入新的日志文件。
定期丢弃旧日志文件: 经过若干次轮转后,通常是每周一次,原始日志文件会被丢弃,释放磁盘空间。
logrotate
由 cron 作业每天运行,负责检查是否有需要轮转的日志文件。大多数日志文件每周轮转一次,但 logrotate
的轮转速度有时较快,有时较慢,或者会在文件达到特定大小时触发轮转。通过这样的轮转机制,系统管理员可以有效地管理日志文件,避免文件系统过度填满,并确保及时归档和保存日志信息。
分析系统日志条目
由 rsyslog
记录的系统日志在文件的开头显示最旧的消息,在文件的末尾显示最新的消息。
rsyslog
管理的日志文件中的所有日志条目都以标准的格式记录。
以下是 /var/log/secure
日志文件中的日志消息的详细信息:
- 记录该日志条目的时间戳
- 发送该日志消息的主机
- 发送该日志消息的程序或进程
- 发送的实际消息
利用 tail
监控日志文件
tail
命令可以用于监控一个或多个日志文件,对于重现问题特别有帮助。tail -f /path/to/file
命令输出指定文件的最后10行,并在新行写入到被监控文件中时继续输出它们。例如,要监控 /var/log/secure
日志文件中的失败的登录尝试:
1 | tail -f /var/log/secure |
使用 logger
发送系统日志消息
logger
命令可以发送消息到 rsyslog
服务。默认情况下,它将严重性为 notice
(user.notice
)的消息发送给设备用户,除非通过 -p
选项另外指定。测试对 rsyslog
配置的更改将特别有用。例如,要向 rsyslogd
发送消息并记录在 /var/log/boot.log
日志文件中,可以执行:
1 | logger -p local7.notice "Log entry created on serverX" |
查看systemd日志条目
使用 journalctl
查找事件
systemd
日志将日志数据存储在带有索引的结构化二进制文件中,包含了与日志事件相关的额外信息,如原始消息的设备和优先级。
以 root 用户身份运行时,journalctl
命令从最旧的日志条目开始显示完整的系统日志:
1 | journalctl |
journalctl
命令以粗体文本突出显示优先级为 notice
或 warning
的消息,以红色文本突出显示优先级为 error
和更高的消息。成功利用日志进行故障排除和审核的关键在于将日志搜索限制为仅显示相关的输出。
以下是几种减少日志查询输出的策略:
显示最后 N 个日志条目
默认情况下,journalctl -n
显示最后 10 个日志条目。可以通过可选参数指定应显示的最后多少个日志条目。例如,要显示最后 5 个日志条目:
1 | journalctl -n 5 |
按优先级过滤日志输出
在对问题进行故障排除时,根据日志条目的优先级过滤日志输出非常有用。journalctl -p
可以接受已知优先级的名称或编号作为参数,显示所有指定级别及更高级别的条目。已知的优先级为 debug
、info
、notice
、warning
、err
、crit
、alert
和 emerg
。例如,要将输出过滤为仅列出优先级为 err
或以上的日志条目:
1 | journalctl -p err |
按时间范围过滤日志输出
查找具体的事件时,将输出限制为特定的时间段非常有用。journalctl
命令有两个选项可以将输出限制为特定的时间范围:
--since
:显示指定日期和时间之后的日志条目。--until
:显示指定日期和时间之前的日志条目。
这两个选项都接受格式为 YYYY-MM-DD hh:mm:ss
的时间参数。如果省略日期,则命令会假定日期为当天;如果省略时间部分,则假定为自 00:00:00
起的一整天。除了日期和时间字段外,这两个选项还接受 yesterday
、today
和 tomorrow
作为有效的参数。
例如,要输出当天记录的所有日志条目:
1 | journalctl --since today |
这些 journalctl
命令选项帮助限制输出,使系统管理员能够更有效地查找和分析关键的日志事件。
查找指定时间范围的日志条目
要输出从 2023 年 11 月 10 日 20:30:00 到 2023 年 11 月 13 日 12:00:00 的日志条目,可以使用以下 journalctl
命令:
1 | journalctl --since "2023-11-10 20:30:00" --until "2023-11-13 12:00:00" |
此命令将显示指定时间范围内的日志条目。
另外,除了日志的可见内容外,日志条目中还附带了一些字段,这些字段只有在打开详细输出时才可见。可以使用 -o verbose
选项来显示这些额外字段:
1 | journalctl -o verbose |
这些额外字段可以用于过滤日志查询的输出,减少查找特定事件的搜索的复杂性。
其他过滤选项
可以使用其他选项来搜索特定进程或事件的日志行,例如:
COMM
:命令的名称。_EXE
:进程的可执行文件的路径。PID
:进程的 PID。UID
:运行该进程的用户的 UID。SYSTEMD_UNIT
:启动该进程的 systemd 单元。
可以组合使用多个选项。例如,下面的查询显示与 systemd 单元文件 sshd.service
启动并且 PID 为 1182 的进程相关的所有日志条目:
1 | journalctl _SYSTEMD_UNIT=sshd.service PID=1182 |
保存systemd日志
在Red Hat Enterprise Linux 7中,systemd日志默认保存在/run/log/journal
目录,这可能导致在系统重启时日志被清除。为了使日志成为永久存储,可以将其记录在/var/log/journal
目录中。以下是实现这一目标的步骤:
- 创建
/var/log/journal
目录,使systemd日志永久存储:
1 | mkdir /var/log/journal |
- 确保
/var/log/journal
目录的所有权为root用户和组为systemd-journal,并设置权限为2755:
1 | chown root:systemd-journal /var/log/journal |
- 重新启动系统或以root用户身份向
systemd-journald
进程发送USR1信号,以使更改生效:
1 | killall -USR1 systemd-journald |
现在,systemd日志将永久存储在/var/log/journal
目录中。
- 若要查看仅包含上一次启动以来的日志消息,可以使用以下命令:
1 | journalctl -b |
这将减少输出,仅显示系统上一次启动以来的日志消息。
保持准确的时间
确保正确同步系统时间对于在多个系统间分析日志文件非常重要。
可以通过使用网络时间协议(NTP)来确保系统时间的准确性。以下是设置本地时钟和时区的步骤:
确保正确配置系统时区非常关键,而时区的命名是基于 NANA 维护的公共“tz”(或“zoneinfo”)时区数据库。
使用 tzselect
设置时区:
1 | tzselect |
timedatectl
命令来设置时区、时间和启用 NTP 同步的步骤:
- 使用
timedatectl
命令查看当前时间相关的系统设置:
1 | timedatectl |
列出系统提供的时区数据库,以便选择正确的时区:
1
timedatectl list-timezones
作为 root 用户,使用
timedatectl
命令更改当前时区的系统设置。替换Your_Timezone
为tzselect
输出的正确时区名称:
1 | sudo timedatectl set-timezone Your_Timezone |
- 使用
timedatectl
命令更改当前时间设置。时间以“YYYY-MM-DD hh:mm:ss”格式指定,其中可以省略日期或时间。例如,将时间更改为 09:00:00:
1 | sudo timedatectl set-time 09:00:00 |
- 使用
timedatectl
命令启用或禁用 NTP 同步。使用set-ntp
选项,参数为true
表示启用,false
表示禁用。例如,启用 NTP 同步:
1 | sudo timedatectl set-ntp true |
- 验证更改是否已生效:
1 | timedatectl |
配置和监控chronyd
Chrony服务配置和使用
1. 同步时间源和时钟漂移值
Chronyd服务通过与配置的NTP服务器同步,维护本地硬件时钟(RTC)的准确性。时钟漂移值记录在/etc/chrony.conf
配置文件中的driftfile中。
2. 默认NTP服务器配置
默认情况下,Chronyd使用NTP Pool Project的服务器同步时间,无需额外配置。
3. 更改NTP服务器
当计算机位于孤立网络时,可能需要更改NTP服务器。这可以通过编辑/etc/chrony.conf
配置文件实现。
1 | # 配置chronyd服务器为classroom.example.com |
然后重新启动服务:
1 | systemctl restart chronyd |
4. NTP时间源的质量
NTP时间源的质量由stratum值决定,表示计算机与高性能参考时钟的跃点数。Stratum 0为参考时钟,Stratum 1为与之直接关联的NTP服务器,Stratum 2为同步时间的计算机。
5. 配置时间源类型
在/etc/chrony.conf
中,可以配置两种时间源类型:server
和peer
。
server
比本地NTP服务器高一个级别,可指定多个。peer
与同一级别,也可指定多个。
6. 使用chronyc命令
chronyc
命令是chronyd服务的客户端,用于验证系统时钟同步信息。
- 验证同步状态:
1 | chronyc sources |
- 获取详细输出:
1 | chronyc sources -v |
在详细输出的S(源状态)字段中,”*”表示classroom.example.com服务器已被用作时间源,是计算机当前与之同步的NTP服务器。
管理LINUX网络
网络概念
TCP/IP四层模型简介
IPv4地址和子网掩码
IPv4地址是32位数字,通常以点分十进制的四个八位字节表示(取值范围:0到255)。
地址格式: x.x.x.x(每个x为0到255的十进制数字)。
地址分为两部分:
- 网络部分: 用于标识子网,位于同一子网的主机可以直接通信。
- 主机部分: 用于标识子网中的特定主机,同一子网中的主机部分不能相同。
子网掩码:
- 表示方式:
- 传统语法:例如,255.255.255.0 表示 24 位网络部分。
- CIDR表示法:例如,/24 表示 24 位网络部分。
- 作用: 指定了IP地址中属于子网的位数,主机部分可用位数越多,子网中的主机越多。
- 表示方式:
网络地址和广播地址:
- 网络地址: 子网中可能达到的最低地址,主机部分二进制值全为零。
- 广播地址: 子网中可能达到的最高地址,主机部分二进制值全为一,用于广播消息。
示例关系:
- IPv4地址: 192.168.1.100
- 子网掩码: 255.255.255.0 或 /24
- 网络部分: 192.168.1
- 主机部分: 100
计算192.168.1.107/24的网络地址:
主机地址 | 192.168.1.107 | 1100 0000.1010 1000.0000 0001.01101011 |
---|---|---|
网络前缀 | /24 (255.255.255.0) | 1111 1111.1111 1111.1111 1111.0000 0000 |
网络地址 | 192.168.1.0 | 1100 0000.1010 1000.0000 0001.0000 0000 |
广播地址 | 192.168.1.255 | 1100 0000.1010 1000.0000 0001.1111 1111 |
计算10.1.1.18/8的网络地址:
主机地址 | 10.1.1.18 | 0000 1010.0000 0001.0000 0001.0001 0010 |
---|---|---|
网络前缀 | /8 (255.0.0.0) | 1111 1111.0000 0000.0000 0000.0000 0000 |
网络地址 | 10.0.0.0 | 0000 1010.0000 0000.0000 0000.0000 0000 |
广播地址 | 10.255.255.255 | 0000 1010.1111 1111.1111 1111.1111 1111 |
计算172.16.181.23/19的网络地址:
主机地址 | 172.168.181.23 | 1010 1100.1010 1000.1011 0101.0001 0111 |
---|---|---|
网络前缀 | /19 (255.255.224.0) | 1111 1111.1111 1111.1110 0000.0000 0000 |
网络地址 | 172.168.160.0 | 1010 1100.1010 1000.1010 0000.0000 0000 |
广播地址 | 172.168.191.255 | 1010 1100.1010 1000.1011 1111.1111 1111 |
特殊地址 127.0.0.1 始终指向本地系统 (“localhost”),而网络 127.0.0.0/8 属于本地系统,所以它能够使用网络协议与自己通信。
IPv4路由概述
IPv4路由涉及使用路由表来指导通信的路径选择。路由表包含了目标网络、发送接口和中间路由器的信息。默认路由用于处理未匹配更具体路由的通信。路由器根据匹配项或默认路由将通信直接发送到目标主机或转发到其他路由器,直到通信到达最终目标。
以下是关于IPv4路由的要点:
路由表条目:
- 路由表包含目标网络、发送通信的接口以及中间路由器的IP地址。
- 匹配目标网络的路由表条目用于路由通信,选择前缀最长的匹配项。
默认路由:
- 路由表通常包含指向整个IPv4互联网的默认路由条目(0.0.0.0/0)。
- 默认路由指向可到达的子网上的路由器,用于处理未匹配更具体路由的通信。
转发过程:
- 当路由器接收到通信时,根据路由表进行转发。
- 如果通信匹配到更具体的路由,则按照匹配项的指示进行转发。
- 如果没有更具体的匹配项,则使用默认路由将通信转发到互联网或另一子网上的路由器。
目标主机和中间路由器:
- 路由器可能将通信直接发送到目标主机(如果在同一子网上)。
- 也可能将通信转发到其他路由器,这个过程一直持续,直到通信到达最终目标。
目的地 | 接口 | 路由器(若需要) |
---|---|---|
192.0.2.0/24 | w1o1 | |
192.168.5.0/24 | enp3s0 | |
0.0.0.0/0(默认) | enp3s0 | 192.168.5.254 |
网络通信和配置概述
路由表与通信路径选择:
- 通信路径由路由表指导。
- 示例:
- 目的地 192.0.2.102 通过 w1o1 无线接口直接传输。
- 目的地 192.168.5.3 通过 enp3s0 以太网接口直接传输。
- 目的地 10.2.24.1 通过 enp3s0 发送到路由器 192.168.5.254,并由路由器决定下一跳。
名称和IP地址:
- IP协议使用数字字符串进行通信,但通常使用名称更方便。
- DNS用于将主机名映射到IP地址。
- 名称服务器不必与主机在同一子网,只需可访问即可。
DHCP或静态网络配置:
- 系统可以通过DHCP或静态配置获取网络设置。
- DHCP自动获取配置,静态配置需要手动设置。
- DHCP使用硬件地址跟踪分配,每接口一个地址。
- 静态配置可指定多个地址,常见于托管服务系统。
配置流程:
通信路径选择:
- 根据路由表选择通信路径。
- 示例中,匹配度最高的路由用于传输通信。
名称解析:
- DNS将主机名解析为IP地址。
- 名称服务器不受限于与主机同一子网。
DHCP或静态配置:
- 系统可通过DHCP自动获取配置。
- 如果无DHCP,静态配置从本地文件读取。
多IP地址分配:
- DHCP每接口一个地址,静态配置可分配多个地址。
- 常见于基于HTTP IP的多托管服务系统。
验证网络配置
显示 IP 地址
/sbin/ip
命令可用于显示设备和地址信息。
1 | ip addr show eth0 |
ip 命令也可用于显示关于网络性能的统计信息。接收 (RX)和传送(TX)的数据包、错误和丢弃计数器可用于确定由拥塞、内存不足和超限导致的网络问题。
1 | ip -s link show eth0 |
路由故障排除
/sbin/ip
命令还可用于显示路由信息。
1 | ip route |
Ping命令测试连通性:
可以使用以下ping
命令测试与 www.baidu.com
的连通性,该命令将一直运行直到按下 Control-C
组合键,除非指定了限制发送数据包数量的选项。
1 | ping www.baidu.com |
追踪网络路径概述
为了追踪到达远程主机的路径,可以使用 traceroute
或 tracepath
命令。这两个命令都能够追踪 UDP 数据包的路径,但在一些网络中,UDP 和 ICMP 通信可能被阻止。
traceroute
命令支持追踪 UDP(默认)、ICMP(-I)或 TCP(-T)数据包的路径,但可能需要额外安装。
使用 tracepath
命令:
1 | tracepath access.redhat.com |
输出解释:
每行输出表示数据包在源和目标之间经过的路由器或跃点。提供了其他信息,如往返用时(RTT)和最大传输单元(MTU)的变化等。
注意事项:
tracepath
是追踪网络路径的一种轻量级工具,输出信息更为简洁。- 每个跃点表示数据包通过的网络设备。
- 可能需要使用
traceroute
命令进行更详细的路径跟踪。
示例:
1 | $ tracepath access.redhat.com |
端口和服务故障排除
TCP服务和套接字概述:
TCP服务使用套接字作为通信的端点,套接字由 IP 地址、协议和端口号组成。
通常,服务会侦听标准端口,而客户端会使用随机的可用端口。
在 /etc/services
文件中列出了标准端口的常用名称。
套接字统计信息查看:
ss
命令可用于显示套接字统计信息。与 netstat
命令类似,但可能需要额外安装。
示例命令:
1 | ss |
输出解释:
ss
命令显示当前系统上的套接字信息,包括监听的端口、连接状态等。
注意事项:
netstat
命令也可以用于查看套接字信息,但默认情况下可能没有安装。- 套接字是定义网络通信端点的重要概念,包括源 IP 地址、目标 IP 地址、源端口和目标端口。
示例输出:
1 | State Recv-Q Send-Q Local Address:Port Peer Address:Port |
选项 | 描述 |
---|---|
-n | 显示接口和端口的编号,而不是显示名称。 |
-t | 显示TCP套接字。 |
-u | 显示TCP套接字。 |
-l | 仅显示侦听中的套接字。 |
-a | 显示所有(侦听和已建立的)套接字。 |
-p | 显示使用套接字的进程。 |
使用nmcli配置联网
NetworkManager
NetworkManager 是一个监控和管理网络设置的守护进程,它通过 GNOME 通知区域小程序提供网络状态信息。与 NetworkManager 通信的命令行和图形工具将配置文件保存在 /etc/sysconfig/network-scripts
目录中。
使用 nmcli 查看网络信息
通过 nmcli 工具,可以方便地查看网络连接和设备的信息。
显示连接列表:
所有连接列表:
1
nmcli con show
仅显示活动连接:
1
nmcli con show --active
查看连接详细信息:
- 指定连接ID:
1
nmcli con show ens160
- 小写设置表示连接的配置,设置和属性名称在 nm-settings(5) man page 中定义。
- 大写设置包含连接的活动数据。
显示设备状态和详细信息:
设备状态:
1
nmcli dev status
设备详细信息:
1
nmcli dev show eth0
通过nmcli创建网络连接
1 | 添加一个名为“default”新连接 |
NetworkManager 连接类型选项
连接类型选项基于所需的连接类型。以下是一些常见类型和它们的基本选项:
- 以太网类型:
指定 MAC 地址:
1 | nmcli con add type ethernet ifname eth0 mac 00:11:22:33:44:55 |
- Wifi 类型:
指定 SSID 和密码:
1 | # 查看可用的 WiFi 设备 |
- 网桥、绑定、组队:
网桥: 网桥是一种虚拟设备,它在网络层次上起到桥接(或交换)的作用。网桥允许连接到它的不同网络接口之间进行数据包的交换和桥接,形成一个逻辑上的网络。
1 | 创建网桥连接 |
绑定:绑定技术的目的之一是提高网络的可用性和冗余。(大白话讲:网卡A上不了网络,切换到网卡B)
1 | 创建绑定连接,使用 "active-backup" 模式 |
组队:主要目的是提高网络性能和负载均衡。可以选择不同的调度器来决定如何分发数据流量。
1 | 创建组队连接,使用 "activebackup" 调度器 |
- VPN 类型:
创建 OpenVPN 连接:
1
nmcli con add type vpn con-name "MyVPN" ifname tun0 vpn-type openvpn
- VLAN 类型:
创建 VLAN 连接:
1
nmcli con add type vlan con-name "MyVLAN" ifname eth0.100 vlan.id 100
- 查看所有连接类型的选项:
1 | nmcli con add help |
通过nmcli修改网络接口
1 | 显示static信息 |
nmcli常用命令
命令 | 用途 |
---|---|
nmcli dev status | 列出所有设备。 |
nmcli con show | 列出所有连接。 |
nmcli con up |
激活连接。 |
nmcli con down |
取消激活连接。如果自动重新连接为是,则该连接将重新启动。 |
nmcli dev dis |
中断接口,并且暂时禁用自动连接。 |
nmcli net off | 禁用所有管理的接口。 |
nmcli con add … | 添加新连接。 |
nmcli con mod |
修改连接。 |
nmcli con del |
删除连接。 |
编辑网络配置文件
如果要修改网络配置时,可以通过编辑接口配置文件来实现。
新的网络配置文件路径:/etc/NetworkManager/system-connections/
这个文件是 NetworkManager 使用的连接配置文件,通常存储在 /etc/NetworkManager/system-connections/
目录下。以下是文件中各个部分的解析:
[connection] 部分:
- id: 连接的唯一标识符,这里是
ens160
。 - uuid: 连接的 UUID(Universally Unique Identifier),用于唯一标识连接。
- type: 连接的类型,这里是
ethernet
,表示以太网连接。 - interface-name: 接口的名称,这里是
ens160
。
- id: 连接的唯一标识符,这里是
[ethernet] 部分:
- 该部分没有设置任何具体的以太网配置。
[ipv4] 部分:
- address1: IPv4 地址和子网掩码的列表,这里是
192.168.44.3/24
和192.168.44.1
。 - dns: 指定 DNS 服务器的地址,这里是
8.8.8.8
。 - ignore-auto-dns: 设置为
true
,表示忽略自动分配的 DNS 设置。 - method: 配置 IP 地址的方法,这里是
manual
,表示手动配置。
- address1: IPv4 地址和子网掩码的列表,这里是
[ipv6] 部分:
- addr-gen-mode: IPv6 地址生成模式,这里是
eui64
。 - method: 配置 IPv6 地址的方法,这里是
auto
,表示自动配置。
- addr-gen-mode: IPv6 地址生成模式,这里是
[proxy] 部分:
- 该部分没有设置任何具体的代理配置。
旧的网络配置文件路径:/etc/sysconfig/network-scripts/ifcfg-<name>
以下是在这些配置文件中可以设置的一些标准变量:
DEVICE: 指定接口的名称,例如
DEVICE=eth0
。BOOTPROTO: 指定引导协议,可以是
dhcp
(动态分配)或static
(静态分配)。ONBOOT: 指定接口是否在系统启动时启用,可以是
yes
或no
。IPADDR: 如果使用静态 IP 地址,指定接口的 IPv4 地址。
NETMASK: 如果使用静态 IP 地址,指定接口的网络掩码。
GATEWAY: 如果使用静态 IP 地址,指定默认网关的 IP 地址。
DNS1、DNS2: 指定首选和备用 DNS 服务器的 IP 地址。
HWADDR: 指定接口的硬件地址(MAC 地址)。
TYPE: 指定接口的类型,例如
Ethernet
。UUID: 指定接口的唯一标识符。
DEFROUTE: 指定是否将该接口作为默认路由。
PEERDNS: 指定是否更新
/etc/resolv.conf
文件。
以下是一个示例配置文件的部分内容:
1 | DEVICE=eth0 |
配置主机名和名称解析
修改主机名
hostnamectl命令
1 | hostnamectl hostname abc |
编辑/etc/hostname文件
1 | vim /etc/hostname |
配置名称解析
根解析器用于将主机名称转换为 IP 地址
1 | vim /etc/hosts |
格式:
1 | 127.0.0.1 baidu.com |
测试1:
1 | ping baidu.com |
测试2:
1 | [root@niubilityhost ~]# getent hosts baidu.com |
/etc/resolv.conf
文件
/etc/resolv.conf
文件用于配置系统的 DNS 解析器设置。以下是该文件的常见配置项:
nameserver: 指定 DNS 服务器的 IP 地址。可以列出多个,按照优先级排序。
1
2nameserver 8.8.8.8
nameserver 8.8.4.4search: 指定 DNS 解析时的搜索域(search domain)。作用:如果配置了
search example.com
,并且用户在命令行中输入ping server
,系统会尝试解析server.example.com
。1
search a.example.com b.example.com
1 |
|
domain example.com
1 |
|
sortlist 130.155.160.0/255.255.240.0
1
2
5. **options:** 包含其他配置选项,如超时时间、最大尝试次数等。
options timeout:2 attempts:3
1
2
3
4
5
6
7
8
示例 `/etc/resolv.conf` 文件:
```plaintext
# This file is managed by NetworkManager.
nameserver 8.8.8.8
nameserver 8.8.4.4
search example.com
可以用nmcli修改dns:
1 | nmcli con mod <ID> ipv4.dns 223.5.5.5 |
测试dns服务器的连接:
1 | [root@VM-8-16-opencloudos ~]# host 223.5.5.5 |
归档文件并在系统间复制文件
管理压缩的 tar 存档
tar 命令概述
tar
是一个用于创建、操作以及解压存档文件的命令行工具。它的名字来源于 “tape archive”,最初设计用于处理磁带存储的文件。
基本操作:
c
:创建存档,将文件集合打包成一个存档文件。t
:列出存档的内容,显示存档中包含的文件列表。x
:提取存档,从存档中解压文件。
常用选项:
f
:指定存档文件的名称。v
:详细信息模式,显示操作过程中的详细信息。
示例用法:
创建存档:
1
tar cvf archive.tar file1.txt file2.txt directory/
c
表示创建存档。v
启用详细信息模式。f
指定存档文件名。
列出存档内容:
1
tar tvf archive.tar
t
表示列出存档内容。v
启用详细信息模式。
f
指定存档文件名。
提取存档:
1
tar xvf archive.tar
x
表示提取存档。v
启用详细信息模式。f
指定存档文件名。
其他压缩选项:
z
:使用 gzip 压缩。1
tar czvf archive.tar.gz file1.txt file2.txt directory/
j
:使用 bzip2 压缩。1
tar cjvf archive.tar.bz2 file1.txt file2.txt directory/
J
:使用 xz 压缩。1
tar cJvf archive.tar.xz file1.txt file2.txt directory/
tar
命令是 Linux 系统中一个强大而灵活的工具,用于对文件和目录进行打包、压缩和解压操作。
压缩和解压缩单个文件:
使用 gzip 压缩和解压缩:
- 压缩文件:
gzip filename
,将生成filename.gz
。
1 gzip etc.tar- 解压文件:
gunzip filename.gz
,将生成未压缩的文件。
1 gunzip /tmp/etc.tar.gz使用 bzip2 压缩和解压缩:
- 压缩文件:
bzip2 filename
,将生成filename.bz2
。
1 bzip2 abc.tar- 解压文件:
bunzip2 filename.bz2
,将生成未压缩的文件。
1 bunzip2 abc.tar.bz2使用 xz 压缩和解压缩:
- 压缩文件:
xz filename
,将生成filename.xz
。
1 xz myarchive.tar- 解压文件:
unxz filename.xz
,将生成未压缩的文件。
1 unxz myarchive.tar.xz这些命令用于对单个文件进行压缩和解压缩,提供了不同的压缩工具(gzip、bzip2、xz)来满足不同需求。
tar选项概述
tar 命令有许多选项可供使用。下表列出了一些常用选项,以及它们的含义。
选项 | 含义 |
---|---|
c | 创建一个新存档。 |
x | 从现有存档提取。 |
t | 列出存档的内容。 |
v | 详细信息;显示存档或提取的文件有哪些 |
f | 文件名;此选项需要后接要使用/创建的存档的文件名。 |
p | 在提取存档时保留文件和目录的权限,而不去除umask。 |
z | 使用gzip压缩(.tar.gz) |
j | 使用bzip2压缩(.tar.bz2)。bzip2的压缩率通常比gzip高。 |
J | 使用xz压缩(.tar.xz)。xz的压缩率通常比bzip2更高。 |
在系统间安全地复制文件
scp命令
SCP命令:
- 将本地文件复制到远程主机:
1
scp local_file user@remote_host:/path
- 从远程主机复制文件到本地:
1
scp user@remote_host:/path/remote_file local_destination
- 示例:
1
2
3
4
5# 本地到远程
scp local.txt user@remote_host:/home/user/
# 远程到本地
scp user@remote_host:/home/user/remote.txt local_destination/
sftp命令
使用SFTP远程传输文件
启动SFTP会话:
sftp serverX
: 启动SFTP与SSH服务器 serverX 的交互式会话。1
sftp serverX
SFTP会话命令:
ls
: 列出远程文件系统上的文件。cd
: 切换远程目录。mkdir
: 在远程主机上创建目录。rmdir
: 在远程主机上删除目录。pwd
: 显示当前远程工作目录。put
: 上传本地文件到远程主机。get
: 从远程主机下载文件到本地。exit
: 退出SFTP会话。
示例:
上传本地文件到远程主机:
1
2
3sftp> mkdir hostbackup
sftp> cd hostbackup
sftp> put /etc/hosts从远程主机下载文件到本地:
1
2sftp> get /etc/yum.conf
sftp> exit
使用 rsync 命令同步文件和文件夹
rsync简介:
rsync
: 用于在系统之间安全复制文件的工具。- 与
scp
的不同之处在于,rsync
仅复制系统间的差异部分,提高效率。
常用选项:
-n
: 空运行选项,模拟命令执行情况,显示将执行的更改。-a
: 存档模式,一次性启用多个选项,包括递归同步、同步符号链接、保留权限、时间戳、组所有权、文件所有者和同步设备文件。-v
: 向输出中添加详细信息。-r
: 以递归方式同步整个目录树。-l
: 同步符号链接。-p
: 保留权限。-t
: 保留时间戳。-g
: 保留组所有权。-o
: 保留文件所有者。-D
: 同步设备文件。
-H
: 启用硬链接处理,识别并同步硬链接。
- 示例:
执行空运行:
1
rsync -n source/ destination/
同步文件和文件夹:
1
rsync -av source/ destination/
同步文件夹并保留硬链接:
1
rsync -avH source/ destination/
注意: 硬链接处理需要使用
-H
选项,因为-a
已同步符号链接,但硬链接需要额外的处理。
注意:-a
选项不会同步高级文件权限,如 ACL
或 SELinux
文件上下文。要启用 ACL 同步,需要在使用-a
选项的同时使用-A
选项,而如果要将源文件的 SELinux
上下文同步到目标文件,则需要添加-X
选项。
rsync的一些注意事项:
基本同步:
- 同步
/var/log
到/tmp
,在/tmp
中创建副本。1
rsync -av /var/log /tmp
- 同步
仅同步内容而不新建文件夹:
- 添加末尾斜杠,仅同步内容,不在目标目录中新建文件夹。
1
rsync -av /var/log/ /tm
- 添加末尾斜杠,仅同步内容,不在目标目录中新建文件夹。
使用rsync同步远程文件系统
本地到远程:
- 同步本地文件夹
/var/log
到远程计算机serverX
的/tmp
目录中,保留所有权。1
rsync -av /var/log serverX:/tmp
- 同步本地文件夹
1 |
|
安装和更新软件包
RPM软件包和YUM
RPM(Red Hat Package Manager)是红帽公司的软件包管理器,用于简化软件的打包、安装和管理。关键信息包括:
- 命名规则: RPM 软件包按照
name-version-release.architecture
命名,如httpd-tools-2.4.6-7.e17.x86_64.rpm
。 - 安装方式: 通过指定软件包名称安装,系统选择安装版本较高的软件包。
- 软件包结构: 每个 RPM 包含安装文件、元数据和运行脚本。
- 数字签名: 软件包可由组织进行数字签名,确保完整性。
- 更新和补丁: 修补上游源代码生成完整软件包,系统通过升级安装新版本。
- 多版本安装: 通常只能安装一个版本,但某些软件包(如内核)支持多版本安装。
使用yum管理软件更新
安装系统后,通常从网络软件包存储库获取更多软件包和更新。红帽系统中,常用的软件包管理工具包括 rpm、PackageKit、yum 等。
yum命令
yum 在多个存储库中搜索软件包和依赖项,能够一并安装它们,从而缓解依赖性问题。主要配置文件为 /etc/yum.conf
,而其他存储库配置文件位于 /etc/yum.repos.d
目录中。存储库配置文件包含存储库 ID、名称以及软件包存储库的 URL 位置。
列出存储库:
yum repolist
搜索软件包:
yum search KEYWORD
列出软件包:
yum list yum*
列出软件包组:
yum grouplist
安装软件包组:
yum group install "Infiniband Support
查看信息:
yum info httpd
安装:
yum install httpd
卸载:
yum remove httpd
获取并安装更新版本的软件包:
yum update
更新内核:
yum update kernal
注意:所有安装和删除事务的日志记录在 /var/log/yum.log 中。
yum history:查看安装和删除事务摘要
yum history undo 6:撤销6号事务
启用yum软件存储库
yum repolist