26-1-13 (复习)

1.什么是内核、什么是shell、什么是Linux、什么是开源?

内核、shell、linux、开源的概念

内核:是操作系统的核心组件,是硬件与软件的“桥梁”,夜视整个操作系统的基石

Shell:是用户与内核之间的交互界面,也可以理解为 “命令解释器”,你之前提到的 Linux Shell 脚本,就是基于它来写的。

开源:是一种软件的授权模式,和 “闭源” 相对,核心是源代码公开

2.Linux中命令录入方式

2.1.命令行快捷键

2.1.1.光标移动快捷键

快捷键作用
Ctrl + A光标跳到命令行开头
Ctrl + E光标跳到命令行结尾
Alt + F光标向右跳一个单词(按空格分隔的单位)
Alt + B光标向左跳一个单词
Ctrl + ←等价于 Alt + B(部分终端支持)
Ctrl + →等价于 Alt + F(部分终端支持)

2.1.2.命令编辑快捷键

快捷键作用
Ctrl + U删除光标左侧的所有字符(清空到行首)
Ctrl + K删除光标右侧的所有字符(清空到行尾)
Ctrl + W删除光标左侧的一个单词
Alt + D删除光标右侧的一个单词
Ctrl + Y粘贴之前用 Ctrl+U/K/W 删除的内容(剪贴板复用)
Ctrl + H等同于退格键(删除光标前一个字符)
Ctrl + T交换光标前两个字符的位置(输错字符时超实用)

2.1.3.历史命令快捷键

快捷键作用
/ 向上 / 向下翻找历史命令(按输入顺序)
Ctrl + R搜索历史命令(输入关键词,会自动匹配最近的命令,按 Ctrl+R 继续找更早的)
Ctrl + G退出 Ctrl+R 的搜索模式,回到当前命令行
!!快速执行上一条命令(比翻箭头更快)
!n执行历史命令中第 n 条(history 命令可查看历史列表及序号)
!字符执行最近一次以该字符开头的命令(例:!ls 执行最近的 ls 命令)
Alt + .粘贴上一条命令的最后一个参数(例:上一条是 cp a.txt /home,按后直接出现 /home

2.1.4.进程控制快捷键

快捷键作用
Ctrl + C强制终止当前正在运行的命令(最常用,比如命令卡死时)
Ctrl + Z把当前命令挂起(放到后台暂停),用 fg 命令可恢复到前台
Ctrl + D退出当前 Shell 会话(等价于输入 exit 命令)

2.1.5.终端操作快捷键

快捷键作用
Ctrl + L清空终端屏幕(等价于输入 clear 命令,不会删除历史命令)
Ctrl + Shift + C复制终端中选中的内容(图形化终端模拟器适用)
Ctrl + Shift + V粘贴复制的内容到终端(图形化终端模拟器适用)

2.1.6.Linux Bash 命令行快捷键速查表

分类快捷键作用
光标移动Ctrl + A跳到命令行开头
Ctrl + E跳到命令行结尾
Alt + F向右跳一个单词
Alt + B向左跳一个单词
Ctrl + ←向左跳一个单词(部分终端支持)
Ctrl + →向右跳一个单词(部分终端支持)
命令编辑Ctrl + U删除光标左侧所有字符
Ctrl + K删除光标右侧所有字符
Ctrl + W删除光标左侧一个单词
Alt + D删除光标右侧一个单词
Ctrl + Y粘贴之前删除的内容
Ctrl + H等同于退格键
Ctrl + T交换光标前两个字符
历史命令 / 向上 / 向下翻历史命令
Ctrl + R搜索历史命令(按 Ctrl+R 继续找更早的)
Ctrl + G退出历史命令搜索模式
!!执行上一条命令
!n执行历史命令列表中第 n
!字符执行最近一次以该字符开头的命令
Alt + .粘贴上一条命令的最后一个参数
进程控制Ctrl + C强制终止当前运行的命令
Ctrl + Z挂起当前命令(后台暂停,fg 可恢复)
Ctrl + D退出当前 Shell 会话
终端操作Ctrl + L清空终端屏幕
Ctrl + Shift + C复制选中内容(图形化终端适用)
Ctrl + Shift + V粘贴内容到终端(图形化终端适用)

3.命令行中如何获得帮助

命令 –help

man 命令

1
2
# 开启监控
watch -n 1 ls -Rl

4.linux上下文管理

4.1.常见命令表

Linux 下文件管理是系统操作的核心内容,常用命令覆盖文件 / 目录的创建、查看、复制、移动、删除、权限修改等场景。以下是整理的常用命令表,按功能分类并附关键参数说明:

命令分类命令功能说明常用参数 & 示例
目录操作pwd显示当前工作目录的绝对路径无参数示例:pwd/home/user
cd切换工作目录- cd ~:切换到当前用户家目录- cd ..:切换到上级目录- cd /usr/local:切换到指定绝对路径
ls列出目录下的文件和子目录- -l:以长格式显示(权限、大小、时间等)- -a:显示隐藏文件(以 . 开头的文件)- -h:人性化显示文件大小(KB/MB/GB)示例:ls -lah
mkdir创建新目录- -p:递归创建多级目录示例:mkdir -p /tmp/test/abc
rmdir删除空目录仅能删除空目录示例:rmdir /tmp/test/abc
文件操作touch创建空文件或修改文件时间戳示例:touch newfile.txt → 创建空文件
cp复制文件或目录- -r:递归复制目录(必选参数)- -f:强制覆盖目标文件示例 1:cp file.txt /tmp/ → 复制文件示例 2:cp -r dir1 /tmp/ → 复制目录
mv移动 / 重命名文件或目录同一目录下执行是重命名,跨目录是移动示例 1:mv oldname.txt newname.txt → 重命名示例 2:mv file.txt /tmp/ → 移动文件
rm删除文件或目录- -r:递归删除目录- -f:强制删除,不提示确认危险命令rm -rf /(切勿执行!会删除系统所有文件)示例:rm -rf dir1 → 删除目录及所有内容
文件查看cat查看文件全部内容(适合小文件)- -n:显示行号示例:cat -n /etc/hosts
more分页查看大文件(只能向下翻页)示例:more /var/log/messages → 按空格翻页,q 退出
less分页查看大文件(可上下翻页)示例:less /var/log/syslog → 按 ↑/↓ 滚动,q 退出
head查看文件前 N 行(默认前 10 行)-n:指定行数示例:head -n 5 file.txt → 查看前 5 行
tail查看文件后 N 行(默认后 10 行)- -n:指定行数- -f:实时跟踪文件新增内容(日志监控常用)示例 1:tail -n 20 log.txt → 查看后 20 行示例 2:tail -f /var/log/nginx/access.log → 实时监控日志
权限管理chmod修改文件 / 目录的权限两种方式:1. 符号法:chmod u+x file.sh(给所有者加执行权限)2. 数字法:chmod 755 file.sh(r=4,w=2,x=1,7=4+2+1)常用权限:755(用户可读可写可执行,其他只读可执行)、644(用户可读可写,其他只读)
chown修改文件 / 目录的所有者和所属组- -R:递归修改目录权限示例:chown -R user:group /home/user/data
文件查找find按路径、名称、大小等条件查找文件- 按名称:find /tmp -name "*.txt" → 查找 tmp 下所有 txt 文件- 按大小:find / -size +100M → 查找系统中大于 100M 的文件- 按类型:find /home -type d → 查找 home 下所有目录
which查找命令的可执行文件路径示例:which ls/usr/bin/ls
locate快速查找文件(基于数据库索引)需先更新数据库:updatedb示例:locate passwd → 查找所有含 passwd 的文件
文件链接ln创建硬链接或软链接- 软链接(常用):ln -s /path/source /path/link → 类似快捷方式- 硬链接:ln /path/source /path/link → 与源文件共享 inode

4.2.补充说明

  1. 隐藏文件:Linux 中以 . 开头的文件为隐藏文件,需用 ls -a 查看。
  2. 绝对路径 vs 相对路径
    • 绝对路径:从根目录 / 开始,如 /home/user/file.txt
    • 相对路径:相对于当前目录,如 ../file.txt(上级目录的文件)
  3. 权限符号含义r(读,4)、w(写,2)、x(执行,1),权限分三类:u(所有者)、g(所属组)、o(其他用户)。

5.文件批处理

5.1.Linux 文件批处理命令表

批处理命令 / 核心语法核心用途批处理示例(场景 + 执行命令)
for 循环遍历指定文件 / 目录,执行自定义批处理操作(新手易理解)场景:批量将当前目录下所有 .txt 文件重命名为 .bak``bash<br>for f in *.txt; do mv "$f" "${f%.txt}.bak"; done<br>${f%.txt} 表示去掉文件名后缀 .txt
find + xargs高效查找文件并批量执行命令(适合大量文件)场景:批量删除当前目录及子目录下所有 .log 文件```bashfind . -type f -name “*.log”xargs rm -f```(-type f 限定文件,-f 强制删除,避免确认)
mv(批量重命名)基础批量重命名 / 移动文件场景:批量将 file1.txtfile2.txt 移动到 backup 目录bash<br>mv file*.txt backup/<br>
cp(批量复制)批量复制文件到指定目录 / 批量备份文件场景:批量复制当前目录下所有 .sh 脚本到 /usr/local/bin``bash<br>cp *.sh /usr/local/bin/<br>
rm(批量删除)批量删除指定类型 / 条件的文件(谨慎使用)场景:批量删除当前目录下所有空文件(大小为 0)bash<br>rm -f $(find . -type f -size 0)<br>
sed(批量替换内容)批量修改多个文件内的文本内容场景:批量将所有 .conf 文件中的 old_ip 替换为 192.168.1.1``bash<br>sed -i 's/old_ip/192.168.1.1/g' *.conf<br>-i 直接修改文件,g 全局替换)
rename(专用重命名)更简洁的批量重命名(支持正则)场景:批量将所有文件名中的 test 替换为 prod(如 test1.txt → prod1.txt)bash<br>rename 's/test/prod/' *.txt<br>(需先安装:apt install rename/yum install rename
awk(批量处理内容)批量提取 / 筛选文件中的指定数据场景:批量提取所有 .csv 文件中第 2 列的内容并保存到 result.txt``bash<br>awk -F ',' '{print $2}' *.csv > result.txt<br>-F ',' 指定分隔符为逗号)

5.2.正则表达式符号 / 字符类 命令表

正则符号(命令)用途说明示例(匹配 / 不匹配)
*量词,匹配前面的字符 / 表达式 0 次或多次(贪婪匹配)a*:匹配空字符、aaaaaa;不匹配 b1(仅针对前导字符a)例:`echo”aaa b”grep -o ‘a*’输出aaa、空、b` 旁的空
?量词,匹配前面的字符 / 表达式 0 次或 1 次(非贪婪匹配)a?:匹配空字符、a;不匹配 aaaaa例:`echo”a aa aaa”grep -o ‘a?’输出a、空、aa、空、aaa、空
[[:alpha:]]匹配任意字母字符(包含大小写,多语言环境适配)匹配:aB(中文环境);不匹配:1!、(空格)例:`echo”Ab123 中!”grep -o ‘[[:alpha:]]’输出Ab中 `
[[:digit:]]匹配任意数字字符,等价于 [0-9]匹配:059;不匹配:a$、(空格)例:`echo”abc123def”grep -o ‘[[:digit:]]’输出123`
[[:lower:]]匹配任意小写字母,等价于 [a-z]匹配:azm;不匹配:A1!例:`echo”AbCdEf123”grep -o ‘[[:lower:]]’输出bdf`
[[:upper:]]匹配任意大写字母,等价于 [A-Z]匹配:AZM;不匹配:a9@例:`echo”AbCdEf123”grep -o ‘[[:upper:]]’输出ACE`
[[:alnum:]]匹配任意字母或数字字符,等价于 [a-zA-Z0-9]匹配:aB8;不匹配:!、(空格)、@例:`echo”abc123!@#”grep -o ‘[[:alnum:]]’输出abc123`
[[:punct:]]匹配任意标点符号(非字母、数字、空白的可打印字符)匹配:!@#,.:;不匹配:a5、(空格)例:`echo”abc!123@def”grep -o ‘[[:punct:]]’输出!@`
[[:space:]]匹配任意空白字符(空格、制表符 \t、换行符 \n 等)匹配:(空格)、\t(制表符)、\n(换行);不匹配:a9!例:`echo”a b\tc\nd”grep -o ‘[[:space:]]’输出 空格、\t\n`

5.3.补充说明

  1. 示例中的 grep -o 是终端常用命令,-o 参数表示 “只输出匹配到的部分”,新手可直接复制命令到终端执行,直观看到效果;
  2. 部分字符类(如 [[:alpha:]])在中文 / 多语言系统中可匹配非英文字母(如中文、日文),而 [a-zA-Z] 仅匹配英文字母,这是 POSIX 字符类的优势。

5.4.总结

  1. */?量词,示例核心看 “前导字符的匹配次数”,而非匹配特定字符;
  2. [[:xxx:]] 字符类的示例需区分 “匹配 / 不匹配”,快速掌握字符范围;
  3. 结合 grep -o 命令可直接验证示例效果,是新手学习正则的高效方式。

6.Linux中的输入和输出

6.1.字符设备是啥?

在 Linux 系统中,字符设备(Character Device) 是一类以字符流(字节流) 为单位进行数据传输的硬件设备,也是 Linux 设备文件的两大核心分类之一(另一类是块设备)。

与块设备的核心区别

特性字符设备块设备
访问单位字节(字符流)固定大小的块(通常 512B/4KB)
访问方式串行、顺序访问,不支持随机访问支持随机访问(可跳转到任意块)
缓冲区无缓冲或小缓冲有较大的内存缓冲区(提升读写效率)
文件类型标识cb
典型设备键盘、鼠标、串口硬盘、U 盘、SD 卡

6.2.输入与输出

在 Linux 系统中,输入(Input)和输出(Output)的核心原理围绕 “一切皆文件” 思想展开,本质是用户程序通过内核提供的接口,对文件描述符进行读写操作,内核再作为中介完成用户程序与硬件设备的交互。

Linux 把所有输入输出设备都抽象成文件,用户程序无需关心硬件细节,只需通过文件描述符(File Descriptor,FD) 来标识和操作这些 “文件”。

  1. 文件描述符

    是一个非负整数,内核用它来索引和管理打开的文件(包括硬件设备、普通文件、管道等)。

    系统默认分配 3 个标准文件描述符,供所有进程使用:

文件描述符名称对应设备 / 用途缩写
0标准输入键盘、管道输入等stdin
1标准输出终端、管道输出等stdout
2标准错误终端(专门输出错误信息)stderr
  1. 核心原则

    输入 = 从文件描述符 读取数据(如从 stdin 读键盘输入)

    输出 = 向文件描述符 写入数据(如向 stdout 写终端输出)

  2. 本质

    Linux 输入输出的本质是 “用户程序 ↔ 内核 ↔ 硬件” 的三层交互模型

    • 用户程序:通过 read/write 系统调用发起 IO 请求,只操作文件描述符,不碰硬件。
    • 内核:负责管理文件描述符、缓冲区,以及设备驱动,是 IO 交互的核心中介。
    • 硬件:由驱动程序控制,完成数据的物理输入输出(如键盘接收按键、屏幕显示字符)。

26-1-14 (复习)

1.Rhel9.6安装

PixPin_2026-01-17_11-20-55

选项–>高级–>固件类型 改为BIOS

安装源选择 服务器

虚拟网络配置

PixPin_2026-01-17_11-26-38

PixPin_2026-01-17_11-26-45

2.Rhel9.6配置

2.1.关闭安全配置

1
2
3
4
5
6
7
8
9
10
#关闭防火墙
[root@base ~]# systemctl disable --now firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@base ~]# systemctl mask firewalld
Created symlink /etc/systemd/system/firewalld.service → /dev/null.

#关闭SELiunx
[root@base ~]# vim /etc/sysconfig/selinux
SELINUX=disabled

2.2.更改网络配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@base ~]# vim /boot/loader/entries/1199b04b0d974659ad491305f98dcfe0-5.14.0-570.12.1.el9_6.x86_64.conf
在quiet 添加 net.ifnames=0
[root@base ~]# cd /etc/NetworkManager/system-connections/
[root@base system-connections]# mv ens160.nmconnection eth0.nmconnection
[root@base system-connections]# vim eth0.nmconnection
修改id与interface-name为 eth0
删除uuid
#如果网卡出问题
nmcli connection reload
nmcli connection up eth0
nmcli networking
nmcli networking on
nmcli networking show
ifconfig

2.3.永久挂载

1
2
3
4
5
6
7
[root@base ~]# mkdir /rhel9
[root@base ~]# mount /dev/cdrom /rhel9/
mount: /rhel9: WARNING: source write-protected, mounted read-only.
[root@base ~]# vim /etc/rc.d/rc.local
最后一行添加mount /dev/cdrom /rhel9
[root@base ~]# vim /etc/rc.d/rc.local
[root@base ~]# chmod +x /etc/rc.d/rc.local

2.4.源仓库配置

2.4.1.本地仓库源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@base ~]# cd /etc/yum.repos.d/
[root@base yum.repos.d]# vim rhel.repo
[AppStarem]
name = AppStream
baseurl = file:///rhel9/AppStream
gpgcheck = 0
[BaseOS]
name = BaseOS
baseurl = file:///rhel9/BaseOS
gpgcheck = 0

#检测
[root@base yum.repos.d]# dnf list httpd

2.4.2.网络源

1
2
3
4
5
6
7
8
#docker容器的网络源
https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
#epel源
https://mirrors.aliyun.com/epel-archive/9.6-2025-11-11/Everything/x86_64/

#检测
[root@base ~]# dnf search docker
[root@base ~]# dnf search ansible

2.4.3.自建仓库源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@base ~]# dnf install httpd -y
[root@base ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@base ~]# mkdir /var/www/html/software
[root@base ~]# dnf install docker-ce --downloadonly --destdir /mnt -y
[root@base ~]# mv /mnt/* /var/www/html/software/
[root@base ~]# dnf install createrepo -y
[root@base ~]# createrepo -v /var/www/html/software/
[root@base yum.repos.d]# vim software.repo
[software]
name = software
baseurl = http://172.25.254.128/software/
gpgcheck = 0

#检测
[root@base ~]# dnf info docker-ce.x86_64

26-1-16 (复习)

1.网络管理

1.1.网络ip配置

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
32
33
34
# 判断网卡是否存在
[root@node1 system-connections]# ls /sys/class/net/ | grep eth1
eth1

# 判断网卡是否被使用
[root@node1 system-connections]# nmcli connection show
NAME UUID TYPE DEVICE
eth0 7ba00b1d-8cdd-30da-91ad-bb83ed4f7474 ethernet eth0
lo d97aa458-8557-4dd1-a224-0167b68b3f84 loopback lo

# 修改网卡ip
[root@node1 ~]# nmcli connection modify eth0 ipv4.addresses 172.25.254.130/24
# 重新连接网卡
[root@node1 system-connections]# nmcli connection reload
[root@node1 system-connections]# nmcli connection up eth0

[root@node1 ~]# cd /etc/NetworkManager/system-connections/
[root@node1 system-connections]# vim eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
method=manual
address1=172.25.254.100/24
gateway=172.25.254.2
dns=114.114.114.114;

[root@node1 system-connections]# chmod 600 eth1.nmconnection

ip a s eth1 #查看ip
route -n #网关
cat /etc/resolv.conf #查看dns

1.2.网络脚本

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/bin/bash
# ===================== 参数说明(统一顺序,避免混淆)=====================
#
# 用法: vmset.sh <主机名> <网卡名> <IP地址> [可选参数:nogateway/网关]
# 示例1:带网关(默认172.25.254.2)→ 主网卡用
# vmset.sh base eth0 172.25.254.100
# 示例2:无网关(避免重复路由)→ 从网卡用
# vmset.sh base et0 172.25.254.101 nogateway
# 示例3:自定义网关
# vmset.sh eth0 base 192.168.1.100 192.168.1.1
#
# =========================================================================

# 1.参数效验(至少3个参数:主机名、网卡名、IP地址)
[ $# -lt 3 ] && {
echo "错误:请传入至少3个参数!"
echo "用法:vmset.sh <主机名> <网卡名> <IP地址> [nogateway/网关]"
echo "用法:vmset.sh haha eth1 172.25.254.100 nogateway"
exit 1
}

# 2.变量定义
HOSTNAME=$1 # 主机名(必填,如base)
IFACE=$2 # 网卡名(必填,如eth1)
IP=$3 # IP地址(必填,如172.25.254.100)
DEFAULT_GW="172.25.254.2" # nogateway
OPTION=${4:-$DEFAULT_GW} # 可选参数:nogateway (无网关)或 自定义网关(如172.25.254.2)

CONNECTION=$(nmcli connection show | awk "/$IFACE/ {print \$1}" | grep $IFACE)

# 3.判断网卡是否使用
[ -n "$CONNECTION" ] && {
echo "$IFACE 正在使用!!!"
nmcli connection delete $CONNECTION
} || {
echo "$IFACE 未在使用"
}

# 4.选择网关
[ "$OPTION" = "nogateway" ] && {
cat > /etc/NetworkManager/system-connections/$IFACE.nmconnection <<EOF
[connection]
id=$IFACE
type=ethernet
interface-name=$IFACE


[ipv4]
method=manual
address1=$IP/24
dns=8.8.8.8
EOF
} || {
cat > /etc/NetworkManager/system-connections/$IFACE.nmconnection <<EOF
[connection]
id=$IFACE
type=ethernet
interface-name=$IFACE


[ipv4]
method=manual
address1=$IP/24,$OPTION
dns=8.8.8.8;
EOF
}

# 4.网卡重新加载
chmod 600 /etc/NetworkManager/system-connections/$IFACE.nmconnection
nmcli connection reload
nmcli connection up $IFACE
hostnamectl hostname $HOSTNAME

# 5.域名映射
cat > /etc/hosts<< EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$IP $HOSTNAME
EOF

echo ""
echo "=====网卡详细信息===="
ip a s $IFACE
echo "====路由表===="
route -n
echo "====主机名===="
hostname
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/bin/bash
set -euo pipefail # 严格模式,命令失败直接退出,避免无效配置

# ===================== 参数说明(统一顺序,避免混淆)=====================
# 用法:bash vmset.sh <网卡名> <主机名> <IP地址> [可选参数:noroute/网关]
# 示例1:带网关(默认172.25.254.2)→ 主网卡用
# vmset.sh eth0 base 172.25.254.100
# 示例2:无网关(避免重复路由)→ 从网卡用
# vmset.sh eth1 base 172.25.254.101 noroute
# 示例3:自定义网关
# vmset.sh eth0 base 192.168.1.100 192.168.1.1
# =======================================================================

# 1. 参数校验(至少3个必填参数:网卡名、主机名、IP地址)
if [ $# -lt 3 ]; then
echo "错误:请传入至少3个参数!"
echo "用法:vmset.sh <网卡名> <主机名> <IP地址> [noroute/网关]"
echo "示例:vmset.sh eth1 base 172.25.254.101 noroute(从网卡,无网关)"
exit 1
fi

# 2. 变量定义(清晰命名,避免混淆)
IFACE=$1 # 网卡名(必填,如eth1)
HOSTNAME=$2 # 主机名(必填,如base)
IP=$3 # IP地址(必填,如172.25.254.100)
OPTION=${4:-} # 可选参数:noroute(无网关)或 自定义网关(如172.25.254.2)
DEFAULT_GW="172.25.2`:w;54.2" # 默认网关(可选参数为空时使用)
CONN_FILE="/etc/NetworkManager/system-connections/${IFACE}.nmconnection" # 配置文件路径

# 3. 基础校验(避免低级错误)
# 3.1 检查网卡是否真实存在
if ! ip link show "$IFACE" &>/dev/null; then
echo "错误:网卡 $IFACE 不存在!请检查网卡名是否正确"
exit 1
fi

# 3.2 检查IP格式是否合法(避免输错IP)
if ! echo "$IP" | grep -E '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' &>/dev/null; then
echo "错误:IP地址 $IP 格式非法!请输入正确的IPv4地址"
exit 1
fi

# 4. 处理可选参数(确定网关是否启用)
if [ "$OPTION" = "noroute" ]; then
GW="" # 无网关(从网卡用,避免重复路由)
DNS="" # 无网关时不配置DNS
else
# 可选参数为自定义网关,或使用默认网关
GW=${OPTION:-$DEFAULT_GW}
DNS="8.8.8.8;" # 有网关时配置DNS
fi

# 5. 删除网卡已有连接(避免配置冲突,精确匹配连接名)
CONNECTION=$(nmcli connection show | awk -v iface="$IFACE" '$1 == iface {print $1}')
if [ -n "$CONNECTION" ]; then
echo "→ 正在删除网卡 $IFACE 的已有连接:$CONNECTION"
nmcli connection delete "$CONNECTION" || {
echo "错误:删除连接 $CONNECTION 失败!"
exit 1
}
fi

# 6. 生成NetworkManager配置文件(覆盖写入,避免重复配置段)
echo "→ 生成网卡 $IFACE 的配置文件:$CONN_FILE"
cat > "$CONN_FILE" <<EOF
[connection]
id=$IFACE
type=ethernet
interface-name=$IFACE
autoconnect=true # 开机自动激活网卡

[ipv4]
method=manual
# 配置IP和网关(无网关时仅写IP)
address1=$IP/24$( [ -n "$GW" ] && echo ",$GW" || "" )
dns=$DNS
ignore-auto-dns=true # 忽略自动分配的DNS
EOF

# 7. 配置文件权限(NetworkManager要求必须是600,否则报错)
chmod 600 "$CONN_FILE"

# 8. 重载并激活网卡连接
echo "→ 重载NetworkManager配置..."
nmcli connection reload
echo "→ 激活网卡 $IFACE..."
nmcli connection up "$IFACE" || {
echo "错误:激活网卡 $IFACE 失败!请检查配置"
exit 1
}

# 9. 设置主机名
echo "→ 设置主机名为:$HOSTNAME"
hostnamectl hostname "$HOSTNAME"

# 10. 修改/etc/hosts(追加IP-主机名映射,不覆盖原有配置!)
if ! grep -q "$IP $HOSTNAME" /etc/hosts; then
echo "→ 向/etc/hosts添加映射:$IP $HOSTNAME"
echo "$IP $HOSTNAME" >> /etc/hosts
else
echo "→ /etc/hosts已存在映射:$IP $HOSTNAME(无需重复添加)"
fi

# 11. 配置结果验证(让你直观看到是否生效)
echo -e "\n======= 配置结果验证 ======="
echo "网卡 $IFACE 地址:"
ip a show "$IFACE" | grep -A2 "inet "
echo "当前主机名:$(hostname)"
echo "路由表(默认路由,仅主网卡显示):"
ip route show default 2>/dev/null || echo "无默认路由(符合noroute配置)"
echo "============================="
echo "✅ 配置完成!"

26-1-17 (复习)

1.系统引导过程修复

引导过程

页-1

1.1.磁盘损坏修复

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
[root@base ~]# fdisk -l
Disk /dev/nvme0n1:100 GiB,107374182400 字节,209715200 个扇区
磁盘型号:VMware Virtual NVMe Disk
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xb7f6e5e4

设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/nvme0n1p1 * 2048 2099199 2097152 1G 83 Linux
/dev/nvme0n1p2 2099200 209715199 207616000 99G 8e Linux LVM


Disk /dev/mapper/rhel_172-root:95.08 GiB,102093553664 字节,199401472 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


Disk /dev/mapper/rhel_172-swap:3.91 GiB,4202692608 字节,8208384 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

# 清空磁盘/dev/nvme0n1的MBR引导扇区(前446字节),但保留分区表(后66字节)
[root@base ~]# dd if=/dev/zero of=/dev/nvme0n1 bs=446 count=1
记录了1+0 的读入
记录了1+0 的写出
446字节已复制,0.000239378 s,1.9 MB/s

1.1.1.磁盘引导问题表现

PixPin_2026-01-17_10-59-28

解决方法

1.关机

2.插入可安装系统的设备

3.从此设备启动

1.1.2.磁盘引导修复过程

PixPin_2026-01-17_10-59-28 PixPin_2026-01-17_11-01-22 PixPin_2026-01-17_11-01-48 PixPin_2026-01-17_11-01-22
1
2
3
#输入1并且0回车后输入
bash-5.1# chroot /mnt/sysroot
bash-5.1# grub2-install /dev/nvme0n1
PixPin_2026-01-17_11-08-08

1.2.引导文件缺失修复

1.2.1.查询引导文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@node2 ~]# ll /boot/grub2/grub.cfg
-rw-------. 1 root root 6955 1月 15 21:11 /boot/grub2/grub.cfg
[root@node2 ~]# ll /boot/loader/entries/
总用量 8
-rw-r--r--. 1 root root 500 1月 15 21:11 1199b04b0d974659ad491305f98dcfe0-0-rescue.conf
-rw-r--r--. 1 root root 475 1月 15 21:23 1199b04b0d974659ad491305f98dcfe0-5.14.0-570.12.1.el9_6.x86_64.conf

#磁盘
[root@node2 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 4096 0 4096 0% /dev
tmpfs 1855068 0 1855068 0% /dev/shm
tmpfs 742028 9220 732808 2% /run
/dev/mapper/rhel_172-root 99635200 3278240 96356960 4% /
/dev/nvme0n1p1 983040 315524 667516 33% /boot
/dev/sr0 12462174 12462174 0 100% /rhel9
tmpfs 371012 0 371012 0% /run/user/0

1.2.2.主引导文件缺失修复

1.2.2.1.删除主引导文件
1
[root@node2 ~]# rm -rf /boot/grub2/grub.cfg
1.2.2.2.问题表现

PixPin_2026-01-17_23-22-57

1.2.2.3.修复过程
1
2
3
4
5
6
7
8
#
grub> set root=(hd0,msdos1)
#
grub> linux16 /vmlinuz-5.14.0-570.12.1.e19_6.x86_64 ro root=/dev/mapper/rhel_172-root net.ifnames=0
#
grub>initrd16 /initramfs-5.14.0-570.12.1.e19_6.x86_64.img
# 启动系统
grub> boot

当手动引导启动系统后,需要修复自动引导文件,否则系统重启后仍然要手动引导

1
2
#修复自动引导文件
[root@base ~]# grub2-mkconfig > /boot/grub2/grub.cfg #修复完成

PixPin_2026-01-17_23-39-31

1.2.3.子引导文件缺失修复

1.2.3.1.删除子引导文件
1
[root@base ~]# rm -fr /boot/loader/entries/*
1.2.3.2.问题表现

PixPin_2026-01-17_23-22-57

1.2.3.3.修复过程

与上面的主引导文件修复过程一致

进入系统后

1
2
[root@base ~]# kernel-install add $(uname -r) /boot/vmlinuz-5.14.0-570.12.1.el9_6.x86_64
[root@base ~]# ls /boot/loader/entries/

PixPin_2026-01-18_00-06-54

当修复子启动文件后网卡的名称设定参数就丢失了需要重新设定,此参数和系统修复本身无关

PixPin_2026-01-18_00-15-39

1
2
[root@base ~]#  grubby --update-kernel ALL --args net.ifnames=0
# 重启后网络恢复

1.3.内核文件修复

1.3.1.删除内核文件

PixPin_2026-01-17_15-42-46

1.3.2.问题表现

PixPin_2026-01-17_15-44-30

1.3.3.解决方法

(1)打开电源时进入固件

PixPin_2026-01-17_15-45-45

(2)进入BOOT页面,将光驱启动调到最前面

PixPin_2026-01-17_15-47-07

(3)保存后,过程同磁盘修复一致

PixPin_2026-01-17_15-47-31

(4)进入下方页面

1
2
3
4
bash-5.1# df
bash-5.1# mount --bind /run/install/repo/ /mnt/sys/
bash-5.1# chroot /mnt/sysroot/
bash-5.1# rpm -ivh /media/BaseOS/Packages/kernel-core-5.14.0-570.12.1.el9_6.x86_64.rpm --force

PixPin_2026-01-17_15-57-32

2026-1-19 (复习)

1.apache构建web服务器

1
2
3
4
5
6
7
8
9
10
11
12
# 安装服务并启动服务
[root@base ~]# dnf install httpd -y
[root@base ~]# systemctl enable --now httpd
[root@base ~]# dnf install httpd-manual -y # httpd服务手册

# 基本配置信息
端口: 80
默认发布目录: /var/www/html
默认发布文件: index.html
主配置文件: /etc/httpd/conf/httpd.conf
子配置文件: /etc/httpd/conf.d/*.conf
管理命令: systemctl enable --now httpd

1.1.主配置文件

1.1.1.更改默认发布文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node4 ~]#  echo "index.html ---> /var/www/html" > /var/www/html/index.html
[root@node4 ~]# echo "test.html ---> /var/www/html " > /var/www/html/test.html

[root@node4 ~]# curl 172.25.254.130
index.html ---> /var/www/html
## 修改Apache配置
[root@node4 ~]# vim /etc/httpd/conf/httpd.conf
168 <IfModule dir_module>
169 DirectoryIndex index.html
170 </IfModule>
## 重启服务
[root@base ~]# systemctl restart httpd
## 再次测试
[root@node4 ~]# curl 172.25.254.130
test.html ---> /var/www/html

1.1.2.修改默认发布目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@node4 ~]# mkdir /web/html -p
[root@node4 ~]# echo "index.html ---> /web/html" > /web/html/index.html

[root@node4 ~]# vim /etc/httpd/conf/httpd.conf
124 # DocumentRoot "/var/www/html"
125 DocumentRoot "/web/html"
126
127 #
128 # Relax access to content within /var/www.
129 #
130 <Directory "/web">
131 AllowOverride None
132 # Allow open access:
133 Require all granted
134 </Directory>

[root@node4 ~]# systemctl restart httpd
[root@node4 ~]# curl 172.25.254.130
index.html ---> /web/html

1.1.3.端口修改

1
2
3
4
5
6
7
8
9
10
[root@node4 ~]# vim /etc/httpd/conf/httpd.conf
47 Listen 80
48 Listen 8000
[root@node4 ~]# systemctl restart httpd
[root@node4 ~]# netstat -antlupe | grep httpd
tcp6 0 0 :::8000 :::* LISTEN 0 32220 2538/httpd
2538/httpd
[root@node4 ~]# curl 172.25.254.130:8000
index.html ---> /var/www/html

1.2.子配置文件

1.2.1.虚拟主机

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
32
33
34
35
36
37
38
39
40
41
42
43
# 创建基础目录
[root@node4 ~]# mkdir /etc/httpd/logs/node4_log # 日志目录
[root@node4 ~]# mkdir mkdir -p /web/node4/{news,bbs}/html # 发布目录
# 创建发布文件
[root@node4 ~]# echo news.node4.com > /web/node4/news/html/index.html
[root@node4 ~]# echo bbs.node4.com > /web/node4/bbs/html/index.html
# 修改配置文件
[root@node4 ~]# vim /etc/httpd/conf.d/vhosts.conf
<Directory "/web">
AllowOverride None
Require all granted
</Directory>

<VirtualHost _default_:80>
DocumentRoot "/web/html"
CustomLog logs/default.log combined
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/web/node4/news/html"
ServerName news.node4.com
CustomLog logs/node4_log/news.log combined
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/web/node4/bbs/html"
ServerName bbs.node4.com
CustomLog logs/node4_log/bbs.log combined
</VirtualHost>


[root@node4 ~]# systemctl restart httpd
[root@node4 ~]# vim /etc/hosts
172.25.254.130 node4 www.node4.com bbs.node4.com news.node4.com
# 测试www.node4.com
[root@node4 ~]# curl www.node4.com
index.html ---> /web/html
# 测试news.node4.com
[root@node4 ~]# curl news.node4.com
news.node4.com
# 测试bbs.node4.com
[root@node4 ~]# curl bbs.node4.com
bbs.node4.com

1.2.2.访问控制

1.2.2.1.基于IP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@node4 ~]# mkdir /web/html/admin
[root@node4 ~]# echo admin > /web/html/admin/index.html
[root@node4 ~]# curl 172.25.254.130/admin/
admin
# 拒绝其他IP,仅通过.1的流量
[root@node4 ~]# vim /etc/httpd/conf.d/vhosts.conf
<Directory "/web/html/admin/">
Order Deny,Allow
Deny from all
Allow from 172.25.254.1
</Directory>
# 重启服务
[root@node4 ~]# systemctl restart httpd
# 测试,本机测试
[root@node4 ~]# curl 172.25.254.130/admin/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>

172.25.254.1进行测试

1.2.2.2.基于用户认证
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
32
33
34
35
36
37
38
39
40
41
42
[root@node4 ~]# mkdir -p /web/html/auth/
[root@node4 ~]# echo auth > /web/html/auth/index.html
[root@node4 ~]# curl 172.25.254.130/auth/
auth

## 生成认证文件
[root@node4 ~]# htpasswd -cm /etc/httpd/.htpasswd haha
New password:
Re-type new password:
Adding password for user haha
[root@node4 ~]# cat /etc/httpd/.htpasswd
haha:$apr1$MKFuKZB6$eTeFSJ4Mhn8TMnueDnARX0

[root@node4 ~]# vim /etc/httpd/conf.d/vhosts.conf
<Directory "/web/html/auth/">
AuthUserFile /etc/httpd/.htpasswd
AuthType basic
AuthName "Please input your username and password"
Require valid-user
</Directory>
# 重启
[root@node4 ~]# systemctl restart httpd

# 测试
## root用户
[root@node4 ~]# curl 172.25.254.130/auth/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested. Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>
## haha用户
[root@node4 ~]# curl 172.25.254.130/auth/ -u haha:haha
auth

1.2.3.https

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
32
33
34
35
36
37
38
39
[root@node4 ~]# dnf install mod_ssl.x86_64 -y
[root@node4 ~]# mkdir -p /etc/httpd/certs
[root@node4 ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/httpd/certs/node4.key -x509 -days 365 -out /etc/httpd/certs/node4.crt
[root@node4 ~]# ll /etc/httpd/certs/
总用量 8
-rw-r--r-- 1 root root 1237 1月 19 20:22 node4.crt
-rw------- 1 root root 1704 1月 19 20:22 node4.key

[root@node4 ~]# mkdir -p /web/node4/login/html
[root@node4 ~]# echo login.node4.com > /web/node4/login/html/index.html

[root@node4 ~]# vim /etc/httpd/conf.d/vhosts.conf
<VirtualHost *:443>
DocumentRoot "/web/node4/login/html"
ServerName login.node4.com
CustomLog logs/node4_log/login.log combined
SSLEngine on
SSLCertificateFile /etc/httpd/certs/node4.crt
SSLCertificateKeyFile /etc/httpd/certs/node4.key
</VirtualHost>

[root@node4 ~]# systemctl restart httpd
[root@node4 ~]# curl -k https://login.node4.com
login.node4.com

# http重定向
<VirtualHost *:80>
ServerName login.node4.com
RewriteEngine On
RewriteRule ^/(.*)$ https://login.node4.com/$1
</VirtualHost>
[root@node4 ~]# systemctl restart httpd

[root@node4 ~]# curl -I login.node4.com
HTTP/1.1 302 Found
Date: Mon, 19 Jan 2026 12:30:48 GMT
Server: Apache/2.4.62 (Red Hat Enterprise Linux) OpenSSL/3.2.2
Location: https://login.node4.com/
Content-Type: text/html; charset=iso-8859-1