文章目录
- 一、Linux基础入门
- 1.Linux基本架构
- 2.什么是shell
- 3.命令执行过程
- 4.Shell中的两类命令
- 5.常见命令
- 6.输出信息echo
- 7.tab键补全
- 8.获取帮助
- 二、文件管理和IO重定向
- 1.文件系统目录结构
- 2.文件系统目录功能
- 3.linux下的文件类型
- 4.文件操作命令
- 5.文件状态stat
- 6.确定文件内容
- 7.文件通配符模式
- 8.创建空文件和刷新时间
- 9.目录操作
- 10.文件元数据和节点表结构
- 11.硬链接和软链接
- 12. IO重定向和管道
- 三、用户和用户组以及权限管理
- 1.用户和组相关概念
- 2.用户和组的相关文件
- 3.用户和组相关命令
- 4.权限表示
- 5.文件特殊权限
- 6.访问控制列表ACL
- 7.默认权限umask
- 四、文本编辑工具vim和文本内容查看
- 1.vim的模式
- 2.插入模式
- 3.命令模式常用操作
- 4.底线命令模式
- 5.文件内容查看
- 五、正则表达式
- 1.基本符号和语法
- 2.常见的正则表达式示例
- 3.正则表达式的实际应用
- 4.基础正则和扩展正则的区别
- 六、文本处理三剑客和文件查找和压缩
- 1.grep
- 2.sed
- 3.awk
- 4.文件查找find/locate/which/whereis
- 5.文件压缩和打包
- 七、shell脚本编程
- 1.shell脚本用途
- 2.脚本基本结构
- 3.shell脚本调试
- 4.脚本变量
- 5.条件测试
- 6.脚本函数
- 7.信号捕捉trap
- 8.流程控制语句
- 八、磁盘和存储管理
- 1.磁盘分区
- 2.文件系统
- 3.挂载 (Mount)
- 4.逻辑卷管理 (LVM)
- 5.RAID--磁盘冗余阵列
- 九、软件管理
- 1.DEB和APT (Debian及其衍生版)
- 2.RPM 和 YUM/DNF (Red Hat及其衍生版)
- 3.编译和安装源代码
- 4.软件源(Repository)管理
- 5.软件包查询和信息
- 6.软件包清理
- 十、计算机网络
- 1.网络协议
- 2.OSI模型的七层结构
- 3.TCP/IP协议栈
- 4.TCP三次握手和四次挥手
- 5.网络配置命令
- 十一、进程性能管理和计划任务
- 1.进程概念和生命周期
- 2.进程查看和管理工具
- 3.CPU性能监控
- 4.内存性能管理
- 5.磁盘I/O性能管理
- 6.网络性能管理
- 7.系统负载管理
- 8.系统日志查看
- 9.任务计划
- 十二、systemd服务管理和启动流程
- 1.systemd的基本概念
- 2.systemctl命令
- 3.Unit类型及配置文件
- 4.Linux启动流程
- 十三、Linux安全技术
- 1.SSH服务
- 2.基于key验证
- 3.设置linux基于密钥的SSH登录验证
- 4.sudo机制
- 十四、DNS域名系统
- 1.DNS的基本功能
- 2.DNS解析的工作流程
- 3.DNS记录类型
- 4.DNS服务器的类型
- 5.DNS的缓存机制
- 6.DNS 安全问题
- 十五、Linux防火墙
- 1.防火墙的基本概念
- 2.iptables
- 3.nftables
- 4.防火墙的规则和表
- 5.防火墙的状态检测
- 6.防火墙的策略
- 7.防火墙的高级功能
- 十六、Linux日志服务管理
- 1.日志服务概述
- 2.常见日志服务工具syslog/rsyslog/journald
- 3.日志存储位置
- 4.日志级别
- 5.日志管理命令
- 6.日志轮替(Log Rotation)
今天是2024年9月13号,马上就要中秋节了。磕磕绊绊几个月,终于看完了马哥教育SRE课程的就业班和架构班的全部课程。距离2022年11月14日购买课程之日已经足足一年10个月了。之前没有学习计划,或有计划也落空了,东看一节西看一章,没有形成完整的知识体系。好在如今要完结了这套课程。不幸腾讯课堂也将2024年10月1日停止运营,届时会全面停止所有课程服务。然而终于赶在停服之前,我终结了。
这段时间,我力争做到理论与实践相结合,看完视频讲解后一定将其实现出来,通过博客记录学习心得和过程。有的实验甚至是跟着视频一个命令一个命令敲出来的,我深知这是一个不可取的方法,因为这样提不起来速度,也没能自己独立思考和排查问题,有时一个视频能敲一整天。但没有办法,这是我唯一不觉得虚度今日的慰藉。
就像王晓春老师说的那样:完成比完美更重要。Linux中的任何一个命令任何一项服务,不经过生产环境的检测和应用都不可能达到出神入化的精通地步。我需要去工作中实践了。
这段时间,也是自己生理、心理、心态的调整和恢复。偿还年少无知的债,时间不多了,好好经营自己。
这篇博客是按照马哥教育SRE就业课程的视频目录来总结内容。
一、Linux基础入门
1.Linux基本架构
Linux的基本架构
1.内核(Kernel):
Linux内核是操作系统的核心,负责管理系统硬件、处理器资源、内存、文件系统以及设备驱动程序。
它还提供系统调用接口,供应用程序与硬件交互。
2.Shell:
Shell是用户与内核交互的命令行接口,通过Shell,用户可以输入命令,控制操作系统的行为。
常见的Shell有Bash(Bourne Again Shell)、Zsh、Ksh 等。
3.文件系统:
Linux的一切都是文件,包括普通文件、目录、设备、管道等。文件系统是组织和管理这些文件的结构。
常见的Linux文件系统类型有 ext4、XFS、Btrfs 等。
4.用户空间与内核空间:
内核空间:用于操作系统内核运行的专用空间,普通程序不能直接访问内核空间。
用户空间:应用程序运行的空间,与内核交互时通过系统调用实现。
2.什么是shell
Shell是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
显示当前使用的shell
[root@rocky ~]# echo $SHELL
/bin/bash
[root@rocky ~]# echo ${SHELL}
/bin/bash
显示当前系统使用的所有shell
3.命令执行过程
Linux命令的执行过程大致可以分为以下几个步骤:
1.用户输入命令:
用户在命令行界面输入命令,并按下回车,Shell(如 Bash)接收该输入。
2.命令解析:
Shell解析命令,进行变量替换、别名处理、通配符展开等操作,将命令及其参数分开。
3.查找可执行文件:
Shell根据环境变量 PATH 中的路径,逐个目录查找与输入命令对应的可执行文件。
如果找到命令文件,则继续执行,否则返回 "command not found" 错误。
4.创建子进程:
Shell使用fork()系统调用创建一个新的子进程,子进程是Shell进程的副本。
5.执行命令:
子进程通过 exec() 系列系统调用,将自身替换为要执行的命令程序。
6.等待命令完成:
Shell进程等待子进程完成执行(如果命令没有放到后台)。
子进程执行完命令后,会返回一个退出状态码给父进程。
7.返回输出与退出状态:
Shell获取子进程的退出状态码,并将命令的输出显示在终端上。
通常:0表示命令成功执行,非0表示发生错误。 口诀:道路千万条,成功就一条。
4.Shell中的两类命令
在Linux Shell中,命令分为内部命令和外部命令,
1.内部命令 (Built-in Commands)
定义:内部命令是 Shell 自带的命令,由 Shell 程序本身直接实现。
执行:这些命令在 Shell 中执行时不需要创建新的子进程,执行速度更快,因为它们在当前的 Shell 进程中运行。
示例:
cd:切换目录
echo:输出文本
pwd:显示当前工作目录
exit:退出当前Shell会话
set:设置或显示Shell变量
2.外部命令 (External Commands)
定义:外部命令是系统中的独立可执行文件,它们通常位于系统的PATH路径中的某个目录下。
执行:当执行外部命令时,Shell通过fork()创建一个子进程,并使用exec()调用相应的程序。
示例:
/bin/ls:列出目录内容
/usr/bin/grep:搜索文本
/usr/bin/find:查找文件
/bin/cp:复制文件
总结:
"内部命令"是Shell内置的,不需要额外的程序文件。
"外部命令"是系统中的可执行文件,Shell需要调用外部程序来执行。
5.常见命令
#查看系统架构
[root@rocky ~]# arch
x86_64
#查看内核版本
[root@rocky ~]# uname -r
4.18.0-348.el8.0.2.x86_64
#查看操作系统发行版本
[root@rocky ~]# cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.5 (Green Obsidian)"
[root@rocky ~]# cat /etc/redhat-release
Rocky Linux release 8.5 (Green Obsidian)
6.输出信息echo
echo命令可以将后面跟的字符进行输出
功能:显示字符,echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。
语法:
echo [-neE][字符串]
选项:
-E(默认) 不支持\解释功能
-n 不自动换行
-e 启用\字符的解释功能
显示变量
echo "$VAR_NAME" #用变量值替换,弱引用
echo '$VAR_NAME' #变量不会替换,强引用
[root@rocky ~]# echo "$PATH"
/usr/local/mongodb/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@rocky ~]# echo '$PATH'
$PATH
[root@rocky ~]#
7.tab键补全
tab键可以实现命令及路径等补全,提高输入效率,避免出错。
命令补全
·内部命令:
·外部命令: bash根据PATH环境变量定义的路径。自左而右在每个路径搜寻以给定命令名命名的文件,第一次找到的命令即为要执行的命令
·命令的子命令补全,需要安装bash-completion
注意:用户给定的字符串只有一条惟一对应的命令,直接补全,否则,再次Tab会给出列表
[root@rocky ~]# nmcli connection 2下tab键
add delete edit help load monitor show
clone down export import modify reload up
[root@rocky ~]#
8.获取帮助
获取帮助的能力决定了技术的能力!
多层次的帮助
whatis 使用数据库来显示命令的简短描述
command --helpe 命令帮助
man man提供命令帮助的文件,手册页存放在/usr/share/man 几乎每个命令都有man的“页面”
/usr/share/doc/
Red Hat documentation、 Ubuntu documentation
软件项目网站
其它网站
搜索
二、文件管理和IO重定向
1.文件系统目录结构
文件系统目录结构
1.文件和目录被组织成一个单根倒置树结构文
2.件系统从根目录下开始,用"/"表示
3.根文件系统(rootfs): root filesystem
4.标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAlL, Mail, mail, mAiL
5.以 .开头的文件为隐藏文件
6.路径分隔的/
7.文件名最长255个字节
8.包括路径在内文件名称最长4095个字节
9.蓝色-->目录绿色-->可执行文件红色->压缩文件浅蓝色-->链接文件灰色-->其他文件
10.除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
11.每个文件都有两类相关数据:元数据: metadata,即属性,数据: data,即文件内容
2.文件系统目录功能
文件系统目录功能
/(根目录): 所有文件和目录的起点,系统中的所有文件都是以根目录为基础的。
/boot(启动文件): 引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放于此目录
/bin(基本命令文件): 所有用户使用的基本命令﹔不能关联至独立分区,OS启动即会用到的程序
/sbin(系统管理员命令): 管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib(库文件): 启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64: 专用于x86_64系统上的辅助共享库文件存放位置
/etc(配置文件): 存放系统的配置文件和启动脚本,如网络配置、用户信息、服务启动配置等。
/home(用户主目录): 普通用户家目录,每个用户都有自己的家目录,用户的个人数据和文件保存在/home/username中。
/root(根用户的主目录): 管理员的家目录
/media: 便携式移动设备挂载点
/mnt: 临时文件系统挂载点
/usr(用户应用程序和文件):包含大多数用户级别的应用程序和工具,如 /usr/bin、/usr/lib、/usr/share等。
/var(可变数据): 存放系统运行时产生的动态数据,如日志文件、缓存、锁文件等。
/opt(可选软件包): 安装第三方或附加软件的目录,通常用来存放手动安装的程序。
/proc(进程和系统信息): 一个虚拟文件系统,提供系统运行时信息,如内存、CPU、正在运行的进程等。
3.linux下的文件类型
- 普通文件
d 目录文件directory
l 符号链接文件linke
b 块设备block
c 字符设备character
p 管道文件pipe
s 套接宁文件socket
文件类型
1.普通文件 (Regular File)
符号:-
描述:最常见的文件类型,存储文本、二进制数据或程序代码。普通文件没有特殊的执行权限或链接行为。
示例:文本文件 (.txt)、可执行程序文件 (.sh)、图片文件 (.png)。
2.目录 (Directory)
符号:d
描述:目录是文件夹的概念,用来存储其他文件或目录,是文件系统的组织结构。
示例:/home/、/etc/。
3.符号链接文件 (Symbolic Link)
符号:l
描述:指向另一个文件或目录的指针,类似于Windows中的快捷方式。符号链接可以跨文件系统,但如果目标被删除,链接会失效。
示例:link_to_file -> /path/to/file。
4.字符设备文件 (Character Device):
符号:c
描述:表示可以逐字节读写的设备,如键盘、串口。
示例:字符设备:/dev/tty(终端设备)
5.块设备文件 (Block Device)
符号:b
描述:表示可以成块读写的设备,如硬盘、光驱。
示例:块设备:/dev/sda(硬盘设备)
6.管道文件 (FIFO)
符号:p
描述:FIFO(First In, First Out)是一种特殊文件类型,用于进程间通信。数据只能按顺序写入和读取。
示例:/tmp/fifo_pipe。
7.套接字文件 (Socket)
符号:s
描述:用于网络通信或本地进程间通信。
示例:/var/run/docker.sock。
4.文件操作命令
ls:列出目录内容 #示例:ls /home
cd:切换目录 #示例:cd /etc
pwd:显示当前工作目录 #示例:pwd
touch:创建空文件或更新文件的时间戳 #示例:touch file.txt
cp:复制文件或目录 #示例:cp file.txt /backup/
mv:移动或重命名文件或目录 #示例:mv oldname.txt newname.txt
rm:删除文件或目录 #示例:rm file.txt
mkdir:创建目录 #示例:mkdir new_folder
rmdir:删除空目录 #示例:rmdir old_folder
cat:查看文件内容 #示例:cat file.txt
more/less:分页查看文件内容 #示例:less file.txt
head:查看文件的前几行 #示例:head -n 10 file.txt
tail:查看文件的后几行 #示例:tail -n 10 file.txt
chmod:修改文件权限 #示例:chmod 755 script.sh
chown:更改文件所有者 #示例:chown user:group file.txt
ln:创建硬链接或符号链接 #示例:ln -s /path/to/file linkname
5.文件状态stat
文件相关信息:metadata, data
每个文件有三个时间戳:
access time访问时间,atime,读取文件内容
modify time修改时间,mtime,改变文件内容(数据)
change time改变时间,ctime,元数据发生改变
6.确定文件内容
文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用
file [options] <filename> . ..
可使用–help查看file的参数使用
7.文件通配符模式
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件通配符采有特定的符号,表示特定的含义,此特符号称为元 meta字符。
常见的通配符如下:
* 匹配零个或多个字符,但不匹配".”开头的文件,即隐藏文件
? 匹配任何单个字符,一个汉字也算一个字符
~ 当前用户家目录
~mage 用户mage家目录
[0-9] 匹配数字范围
[a-z] 一个小写字母
[A-Z] 一个大写字母
[wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
[^a-z] 匹配列表中的所有字符以外的字符
.和~+ 当前工作目录
~- 前一个工作目录
8.创建空文件和刷新时间
touch命令可以用来创建空文件或刷新文件的时间
touch [OPTION].. . FILE. . .
选项说明:
-a 仅改变atime和ctime。
-m 仅改变 mtime和ctime
-t [[CC]YY]MMDDhhmm[.ss]指定atime和mtime的时间戳.
-c 如果文件不存在,则不予创建
9.目录操作
显示目录树tree
常见选项:
-d: 只显示目录
-L level: 指定显示的层级数目
-P pattern: 只显示由指定wild-card pattern配到的路径
创建目录mkdir
常见选项:
-p: 存在于不报错,且可自动创建所需的各目录
-v: 显示详细信息
-m MODE: 创建目录时直接指定权限
删除空目录rmdir
常见选项:
-p 递归删除父空目录
-v 显示详细信息
注意: rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r命令,递归删除目录树
10.文件元数据和节点表结构
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这些元数据是存放在inode (index node)表中。inode表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。
inode 表结构
inode 是存储文件元数据的表,文件系统中每个文件都有一个对应的 inode 结构。
每一个inode表记录对应的保存了以下信息:
1.inode number节点号 #每个文件都有一个唯一的 inode 号,用于在 inode 表中标识该文件。
2.文件类型 #文件是普通文件、目录、符号链接、设备文件等。
3.文件权限 #文件的读、写、执行权限,如 rwxr-xr-x。
4.所有者信息UID/GID #UID(用户ID):文件所有者的ID。GID(组ID):文件所属用户组的ID。
5.链接数(指向这个文件名路径名称个数)
6.该文件的大小和不同的时间戳
7.指向磁盘上文件的数据块指针
8.有关文件的其他数据
文件名和 inode 是分开的。文件名保存在目录文件中,文件名与对应的 inode 号关联。目录实际是一个将文件名映射到 inode 号的表。
Linux 文件系统中的元数据存储在 inode 中,包含文件的类型、权限、大小、时间戳、所有者等信息。文件名则存储在目录文件中,并与 inode 号进行关联。这种结构提高了文件管理的灵活性和效率。
11.硬链接和软链接
总结:
硬链接是多个文件名指向同一文件(inode),删除原文件名不会影响其他硬链接。
软链接是指向文件路径的快捷方式,原文件删除后软链接将失效。
12. IO重定向和管道
在 Linux 中,I/O 重定向用于改变命令的输入和输出源,通常重定向到文件或其他命令。
1.标准输入、输出和错误
标准输入 (stdin):默认从键盘输入,文件描述符为 0。
标准输出 (stdout):默认输出到终端,文件描述符为 1。
标准错误 (stderr):默认输出错误信息到终端,文件描述符为 2。
2.重定向符号
输入重定向 (<):
从文件或其他源获取输入。
示例:command < input.txt(从 input.txt 文件获取输入)
输出重定向 (>):
将输出写入文件(覆盖模式)。
示例:command > output.txt(将输出写入 output.txt,覆盖文件内容)
追加重定向 (>>):
将输出追加到文件末尾。
示例:command >> output.txt(将输出追加到 output.txt)
错误重定向 (2>):
将错误输出重定向到文件。
示例:command 2> error.log(将错误信息写入 error.log)
同时重定向标准输出和错误 (>&):
将标准输出和错误同时重定向。
示例:command > output.txt 2>&1(将标准输出和错误都写入 output.txt)
管道 (|) 用于将一个命令的输出作为下一个命令的输入,实现命令间的数据传递。
1.管道符号 (|)
管道符号用于连接多个命令,将前一个命令的标准输出作为下一个命令的标准输入。
示例:command1 | command2
例子:ls -l | grep txt(将 ls -l 的输出通过管道传给 grep,筛选出包含 txt 的文件)
2.管道的作用
1.实现命令之间的通信,使得复杂操作可以通过组合简单命令来完成。
2.常用于将命令的输出进行过滤、排序或其他处理。
tee命令
利用tee命令可以重定向到多个目标,经常配合管道符一起使用
命令1 | tee [-a ] 文件名 | 命令2 #以上可以把命令1的STDOUT保存在文件中,做为命令2的输入 -a 追加
[root@centos8 ~]#cat <<EOF | tee /etc/motd
> we1come to magedu
> happy new year
> EOF
we1come to magedu
happy new year
三、用户和用户组以及权限管理
1.用户和组相关概念
用户和组相关概念
1.用户 (User)
Linux 系统是多用户系统,每个用户有自己的账户和权限。
用户ID (UID):每个用户都有一个唯一的数字 ID,系统通过 UID 来识别用户。
用户类型:
超级用户 (root):具有系统管理的最高权限,UID为 0。
普通用户:通常用于日常操作,权限受限,UID一般从1000开始。
系统用户:用于系统进程和服务,UID小于1000。
2.组 (Group)
组是用户的集合,用于简化权限管理。用户可以属于一个或多个组。
组ID (GID):每个组都有一个唯一的GID,用来标识组。
组类型:
主组:每个用户都有一个主组,创建文件时,该文件默认属于用户的主组。
附加组:用户可以属于多个附加组,用于给用户赋予额外的访问权限。
2.用户和组的相关文件
2.1/etc/passwd(用户信息文件)
存储所有用户的基本信息,每个用户占一行,包含以下字段:
用户名、密码占位符、UID、GID、全名、主目录、登录 shell。
root:x:0:0:root:/root:/bin/bash
user1:x:1001:1001:User One,,,:/home/user1:/bin/bash
# 每一列内容如下
root:用户名
x:密码占位符(密码实际保存在 /etc/shadow 中)
0:UID
0:GID
root:用户描述(全名等)
/root:用户主目录
/bin/bash:默认shell
2.2/etc/shadow(加密密码信息文件)
存储用户的加密密码和密码相关信息,只有 root 可以访问。
root:$6$randomhash:18055:0:99999:7:::
# 每一列内容如下
root:用户名
$6$randomhash:加密后的密码
其余字段表示密码过期时间等。
2.3/etc/group(组信息文件)
存储系统中的所有组,每行表示一个组,字段包括:组名、密码占位符、GID、组成员。
root:x:0:
sudo:x:27:user1,user2
# 每一列内容如下
root:组名
x:密码占位符
0:GID
sudo 组包含 user1 和 user2 成员。
3.用户和组相关命令
用户管理命令
用户管理命令
useradd:添加用户
示例:sudo useradd -m -s /bin/bash user1(创建用户 user1,指定 shell 为 /bin/bash)
usermod:修改用户信息
示例:sudo usermod -aG sudo user1(将 user1 添加到 sudo 组)
passwd:修改用户密码
示例:sudo passwd user1(为用户 user1 设置或修改密码)
userdel:删除用户
示例:sudo userdel user1(删除用户 user1)
id:显示当前用户的 UID 和 GID
示例:id user1(查看用户 user1 的 UID 和 GID)
组管理命令
组管理命令
groupadd:添加组
示例:sudo groupadd developers(创建 developers 组)
groupmod:修改组信息
示例:sudo groupmod -n newname developers(将 developers 组重命名为 newname)
groupdel:删除组
示例:sudo groupdel developers(删除 developers 组)
gpasswd:管理组成员
示例:sudo gpasswd -a user1 developers(将 user1 添加到 developers 组)
示例:sudo gpasswd -d user1 developers(将 user1 从 developers 组移除)
权限管理命令
权限管理命令
chown:更改文件的所有者和所属组
示例:sudo chown user1:developers file.txt(将 file.txt 的所有者改为 user1,组改为 developers)
chmod:更改文件权限
示例:chmod 755 script.sh(设置文件的读、写、执行权限)
chgrp:更改文件的所属组
示例:chgrp developers file.txt(将 file.txt 的组改为 developers)
4.权限表示
rwx权限:每个文件或目录的权限分为三组:用户 (u)、组 (g)、其他人 (o)。每组权限用三位字母表示:
r:读权限(read)
w:写权限(write)
x:执行权限(execute)
权限模式:通过八进制数表示权限,如755(用户有 rwx 权限,组和其他人有 rx 权限)。
总结
用户和组是 Linux 文件权限和访问控制的基础,通过相关命令和配置文件可以灵活管理用户和组的权限。
常用的文件如 /etc/passwd、/etc/shadow 和 /etc/group,存储了用户、密码和组的信息,命令如useradd、groupadd 等用于管理用户和组。
5.文件特殊权限
Linux 文件系统中的特殊权限包括SetUID (SUID)、SetGID (SGID) 和 粘滞位 (Sticky Bit)。这些特殊权限在某些场景下提升了文件和目录的安全性和管理的灵活性。
SUID
SetUID (SUID)
作用:
当可执行文件设置了 SUID 权限后,普通用户在执行该文件时,会临时拥有该文件所有者的权限,而不是执行者本身的权限。
符号表示:
在文件的执行权限位中,所有者的执行权限 (x) 位置会变为 s,如:rwsr-xr-x。
八进制表示:
4 表示 SUID 权限。
常见用途:
passwd 命令:更改密码时,普通用户执行 passwd 需要修改 /etc/shadow 文件,而该文件只有 root 有写权限。
因此,passwd 命令设置了 SUID 位,使得普通用户临时具有 root 权限。
示例:
-rwsr-xr-x 1 root root /usr/bin/passwd
SGID
SetGID (SGID)
作用:
对于可执行文件:用户执行该文件时,会临时具有文件所属组的权限,而不是执行者自己的组权限。
对于目录:目录设置了 SGID 位后,所有在该目录下创建的文件或子目录,其所属组将继承该目录的组,而不是创建者的主组。
符号表示:在组的执行权限位中,执行权限 (x) 位置会变为 s,如:rwxr-sr-x。
八进制表示:
2表示SGID 权限。
常见用途:
对于共享目录,SGID 可以确保所有用户在该目录下创建的文件,都会自动归属于同一个组,方便团队协作。
示例:
drwxrwsr-x 2 user1 developers /shared_folder
粘滞位 (Sticky Bit)
粘滞位 (Sticky Bit)
作用:
通常用于目录中。目录设置粘滞位后,只有目录的所有者和文件的所有者才能删除或修改该目录下的文件,即使其他用户对该目录有写权限。
符号表示:在其他用户的执行权限位中,执行权限 (x) 位置会变为 t,如:rwxrwxrwt。
八进制表示:1 表示粘滞位。
常见用途:
/tmp 目录:系统中常用的临时目录 /tmp 设置了粘滞位,防止用户删除其他用户在该目录下的文件。
示例
drwxrwxrwt 10 root root /tmp
特殊权限设置的命令
设置 SUID、SGID、粘滞位:
SUID:chmod u+s filename
SGID:chmod g+s filename
粘滞位:chmod o+t directory
移除特殊权限:
移除 SUID:chmod u-s filename
移除 SGID:chmod g-s filename
移除粘滞位:chmod o-t directory
八进制表示法总结
SUID、SGID 和粘滞位与普通文件权限结合使用时,可以通过四位八进制数表示。
4xxx:设置 SUID 位
2xxx:设置 SGID 位
1xxx:设置粘滞位
chmod 4755 filename # 设置文件权限为 rwsr-xr-x (SUID)
chmod 2755 directory # 设置目录权限为 rwxr-sr-x (SGID)
chmod 1777 directory # 设置目录权限为 rwxrwxrwt (粘滞位)
总结
SUID:使执行者临时获得文件所有者的权限,用于特定应用程序(如 passwd)。
SGID:使执行者临时获得文件所属组的权限,并且可以用于目录,确保新文件继承组。
粘滞位:保护共享目录中用户文件,防止其他用户删除非自己的文件。
这些特殊权限在文件和目录管理中,增强了系统的安全性和协作效率。
6.访问控制列表ACL
Linux 的 ACL (Access Control List) 是一种细粒度的权限控制机制,它允许为文件和目录指定更详细的权限设置,而不仅仅依赖于传统的所有者、所属组和其他人三种权限模式。
ACL 是对标准的文件权限模型(用户、组、其他人)的一种扩展,允许为单个用户或组设置不同的权限。
通过 ACL,你可以为文件或目录定义多个用户或组的权限,而不仅仅是默认的所有者、所属组和其他人权限。
ACL 的组成
用户ACL:对特定用户的权限控制。
组ACL:对特定组的权限控制。
掩码ACL:用来限制所有 ACL 条目中权限的最大值。
默认ACL(仅适用于目录):如果目录有默认 ACL,则新建文件或子目录会自动继承该默认 ACL。
可以使用 getfacl 和 setfacl 命令来查看和管理 ACL。
getfacl
getfacl filename
# file: filename
# owner: user1
# group: group1
user::rw-
user:user2:r-- # 为 user2 设置了只读权限
group::r-x
mask::r--
other::---
setfacl
使用 setfacl 命令为文件或目录设置 ACL:
为特定用户设置权限:
setfacl -m u:user2:rw filename # 为 user2 设置读写权限
为特定组设置权限:
setfacl -m g:group1:r filename # 为 group1 设置只读权限
设置默认 ACL(目录继承):
setfacl -m d:u:user2:rw directory # 为目录设置默认 ACL,所有新文件继承该 ACL
删除用户的 ACL:
setfacl -x u:user2 filename
7.默认权限umask
在 Linux 中,文件和目录的默认权限由文件创建掩码 (umask) 和文件系统的默认权限共同决定。
执行权限对于目录非常重要,因为它决定了用户是否可以进入该目录或查看目录中的内容。
默认权限总结
1.文件默认权限是 666,目录默认权限是 777。
2.umask 用来屏蔽部分权限,实际创建的文件或目录权限等于默认权限减去 umask 值。
3.通常,系统使用 umask 022,这使得文件的默认权限为 644,目录为 755。
umask 是一个用于修改文件或目录创建时默认权限的值,它会从默认权限中减去对应的权限,从而设置最终的权限。umask 的作用是屏蔽特定权限。
文件的默认权限
查看当前 umask:
umask
设置 umask:
umask 022
umask 值的作用
文件权限 = 666 - umask
目录权限 = 777 - umask
常见的umask值:
022:允许所有者有读写权限,组和其他人有读和执行权限:
文件最终权限:644 (rw-r--r--)
目录最终权限:755 (rwxr-xr-x)
027:允许所有者有读写权限,组有读和执行权限,其他人没有权限:
文件最终权限:640 (rw-r-----)
目录最终权限:750 (rwxr-x---)
077:只有所有者有完全权限,组和其他人没有权限:
文件最终权限:600 (rw-------)
目录最终权限:700 (rwx------)
四、文本编辑工具vim和文本内容查看
Vim 是 Linux 系统中非常强大的文本编辑器,也是 Vi 的增强版。它通过不同的模式来进行高效的文本编辑操作,适合代码编写、脚本编辑等多种场景。
1.vim的模式
Vim 是一个模式编辑器,主要有以下几种模式:
1.命令模式:Vim 默认进入的模式,可以执行删除、复制、粘贴等操作。
2.插入模式:在该模式下,可以像普通编辑器一样输入文本内容。
3.可视模式:用于选择文本。
4.底线命令模式:用于执行保存、退出、查找替换等命令。
在终端中输入以下命令启动 Vim:
vim filename
如果文件存在,Vim 会打开该文件进行编辑。
如果文件不存在,Vim 会创建一个新的文件。
2.插入模式
进入插入模式:
i:在光标前插入。
a:在光标后插入。
I:在当前行的行首插入。
A:在当前行的行尾插入。
在插入模式下可以自由输入文本,按 Esc 键返回命令模式。
3.命令模式常用操作
移动光标:
h:左移一格。
j:下移一行。
k:上移一行。
l:右移一格。
删除文本:
x:删除当前光标处的字符。
dd:删除当前行。
dw:删除从光标开始到单词末尾的内容。
复制和粘贴:
yy:复制当前行(称为“拷贝行到缓冲区”)。
p:在光标后粘贴复制或剪切的内容。
撤销/重做:
u:撤销上一步操作。
Ctrl + r:重做操作。
查找文本:
/text:查找 text,按 n 键查找下一个匹配项,按 N 查找上一个匹配项。
4.底线命令模式
在命令模式下,输入 : 进入底线命令模式,执行以下命令:
保存和退出:
:w:保存文件。
:q:退出 Vim。
:wq 或 ZZ:保存并退出。
:q!:不保存强制退出。
保存为另一个文件:
:w newfile.txt
5.文件内容查看
1. cat(concatenate)
作用:一次性显示整个文件的内容。
语法:cat filename
特点:
适用于小文件,可以将文件内容直接输出到终端。
可以将多个文件的内容合并并显示出来。
2. tac
作用:与 cat 相反,倒序显示文件内容。
语法:cat filename
3. nl(number lines)
作用:按行号显示文件内容。
语法:nl filename
分页查看文件内容
4. more
作用:可以实现分页查看文件,可以配合管道实现输出信息的分页,适用于查看较大文件。
特点:
一次显示一页内容,按空格键翻页,按 q 退出。
支持按 Enter 键逐行查看。
5. less
作用:与 more 类似,但功能更强大,可以向前和向后滚动查看文件内容。
特点:
与 more 相比,less 不会一次性加载整个文件,因此在处理大型文件时更加高效。
可以使用方向键进行上下滚动,按 q 退出。
五、正则表达式
Linux 正则表达式是一种用于模式匹配的强大工具,广泛应用于文本处理工具中,如 grep、sed、awk 等。正则表达式通过一组特定的符号和语法规则,用于在文本中查找符合特定规则的字符或字符串。正则表达式分为基础正则表达式(BRE, Basic Regular Expression)和扩展正则表达式(ERE, Extended Regular Expression)。
1.基本符号和语法
1.字符匹配
普通字符:匹配自身。如 abc 匹配字符串 "abc"。
.(点号):匹配任意单个字符,除换行符外。
例如,a.b 可以匹配 "aab"、"acb" 等。
2.字符类
方括号 []:匹配括号内任意一个字符。
例如,[abc] 匹配 "a"、"b"、"c" 中的任意一个字符。
字符范围:使用 - 表示范围。
例如,[a-z] 表示匹配小写字母,[0-9] 表示匹配数字。
排除字符类:使用 [^] 表示排除括号内的字符。
例如,[^0-9] 表示匹配非数字的任意字符。
3.重复匹配
*(星号):匹配前一个字符的零次或多次。
例如,ab* 匹配 "a"、"ab"、"abb" 等。
+(加号):匹配前一个字符的一次或多次。(扩展正则表达式)
例如,ab+ 匹配 "ab"、"abb" 等,但不匹配 "a"。
?(问号):匹配前一个字符的零次或一次。(扩展正则表达式)
例如,ab? 匹配 "a" 或 "ab"。
{n}:精确匹配前一个字符 n 次。
例如,a{3} 匹配 "aaa"。
{n,m}:匹配前一个字符至少 n 次,最多 m 次。
例如,a{2,4} 匹配 "aa"、"aaa" 或 "aaaa"。
4.位置锚定
^:匹配行的开头。
例如,^abc 只匹配以 "abc" 开头的行。
$:匹配行的结尾。
例如,abc$ 只匹配以 "abc" 结尾的行。
5.分组和引用
():用于分组,分组内容可以作为一个整体进行重复匹配或引用。
例如,(abc)+ 匹配 "abc"、"abcabc" 等。
\n:引用前面第 n 个括号中的内容。(适用于一些工具,如 sed)
例如,(abc)\1 匹配 "abcabc"。
2.常见的正则表达式示例
匹配数字:[0-9] 或 \d。
匹配字母:[a-zA-Z]。
匹配单词边界:\bword\b。
匹配空白字符:\s(包括空格、制表符等)。
匹配邮箱地址:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}。
3.正则表达式的实际应用
1.使用 grep 进行匹配
查找文件中包含 "error" 的行:
grep 'error' filename
查找文件中以 "abc" 开头的行:
grep '^abc' filename
2 使用 sed 进行替换
将文件中的 "foo" 替换为 "bar":
sed 's/foo/bar/g' filename
3 使用 awk 进行文本处理
打印包含数字的行:
awk '/[0-9]/' filename
4.基础正则和扩展正则的区别
基础正则(如 grep):需要转义一些符号,如 {}、+、?、() 等。
grep 'a\{2,3\}' filename # 匹配 "aa" 或 "aaa"
扩展正则(如 egrep 或 grep -E):直接使用扩展符号,无需转义。
egrep 'a{2,3}' filename # 匹配 "aa" 或 "aaa"
总结:
正则表达式是 Linux 系统中强大且灵活的文本匹配工具,通过组合不同的字符和符号,可以匹配复杂的文本模式。掌握正则表达式对于处理文件、日志分析、数据清洗等工作至关重要。
六、文本处理三剑客和文件查找和压缩
在 Linux 中,文本处理三剑客指的是三种强大的文本处理工具:grep、sed 和 awk。它们能够高效地搜索、编辑、提取和处理文本数据,广泛用于脚本编写、日志分析和数据处理等场景。
这些工具各具特色,经常在一起组合使用,例如可以使用 grep 过滤出匹配的行,再用 awk 提取特定字段,最后通过 sed 进行内容替换。掌握它们可以显著提高文本处理效率。
1.grep
grep(Global Regular Expression Print)
作用:grep 用于在文本文件中查找符合特定模式的行,并将匹配到的行输出到终端。它支持正则表达式的强大搜索功能。
基本用法
基本用法
grep 'pattern' filename
常用选项:
-i:忽略大小写匹配。 grep -i 'pattern' filename
-v:反向匹配,显示不包含 pattern 的行。 grep -v 'pattern' filename
-n:显示匹配行的行号。 grep -n 'pattern' filename
-r:递归搜索目录下的所有文件。 grep -r 'pattern' /path/to/directory
示例:
grep 'error' /var/log/syslog # 查找日志文件中包含 "error" 的行
2.sed
sed(Stream Editor)
作用:sed 是一个流编辑器,用于对文本进行自动化的编辑。它可以替换、删除、插入和修改文本内容,而无需打开文件进行手动编辑。
基本用法
sed 's/pattern/replacement/' filename s表示替换,将 pattern 替换为 replacement。
常用选项:
-i:直接修改文件内容,而不是仅输出到终端。 sed -i 's/oldtext/newtext/' filename
g:全局替换(默认情况下,sed 只替换每行中第一个匹配的文本)。 sed 's/pattern/replacement/g' filename
d:删除匹配的行。 sed '/pattern/d' filename
示例:
sed 's/foo/bar/g' file.txt # 将文件中所有的 "foo" 替换为 "bar"
sed '/^$/d' file.txt # 删除所有空行
3.awk
awk(Aho, Weinberger, and Kernighan)
作用:awk 是一个强大的文本处理工具,专门用于分析和处理按行组织的结构化文本数据。awk 可以根据字段(列)来处理和输出特定内容,还可以进行复杂的计算、条件判断和格式化输出。
基本用法
awk 'pattern { action }' filename pattern是可选的匹配条件,action 是匹配后要执行的操作。
常用功能:
按字段显示文件内容,字段之间通常由空格或制表符分隔。
awk '{ print $1 }' filename # 输出文件中的第一列
使用特定分隔符:
awk -F: '{ print $1, $3 }' /etc/passwd # 以冒号分隔,输出第一和第三列
示例
awk '{ print $1, $3 }' file.txt # 输出每行的第一列和第三列
awk '$3 > 1000 { print $1, $3 }' file.txt # 输出第三列大于 1000 的行
4.文件查找find/locate/which/whereis
在 Linux 中,查找文件是日常操作中非常重要的任务。系统提供了多种工具和命令,用于快速、高效地搜索文件。以下是一些常用的文件查找工具和命令的简述:
这些命令可以帮助用户快速查找到所需的文件和程序,大大提高了日常操作和系统维护的效率。
find
find 是最常用的文件查找工具,功能强大,能够递归搜索目录树中的文件或目录,并支持多种搜索条件。
基本语法
find [搜索路径] [搜索条件] [操作]
常用选项:
按文件名查找:
find /path/to/search -name "filename" -name 区分大小写,-iname 不区分大小写。
按文件类型查找:
find /path/to/search -type f # 查找普通文件
find /path/to/search -type d # 查找目录
按文件大小查找:
find /path/to/search -size +100M # 查找大于 100MB 的文件
find /path/to/search -size -10k # 查找小于 10KB 的文件
按修改时间查找:
find /path/to/search -mtime -1 # 查找一天内修改的文件
find /path/to/search -mtime +7 # 查找一周前修改的文件
按权限查找:
find /path/to/search -perm 644 # 查找权限为 644 的文件
执行操作:查找到的文件后,执行指定操作。
find /path/to/search -name "*.log" -exec rm {} \; # 查找并删除 .log 文件
示例
find /var/log -name "*.log" # 查找 /var/log 目录下所有以 .log 结尾的文件
locate
locate 是一种基于数据库的文件搜索工具,速度非常快。它通过预先构建的文件数据库来查找文件,通常比 find 更高效,但依赖数据库的更新。
基本语法
locate filename
使用方法:
更新数据库:使用 updatedb 命令更新 locate 的文件数据库。
sudo updatedb
模糊匹配:
locate part_of_filename # 查找包含部分文件名的文件
示例
locate bashrc # 快速查找系统中的所有 .bashrc 文件
which
which 命令用于查找可执行程序的路径,通常用于确认某个命令或程序的位置。
基本语法
which command_name
示例
which python # 查找 python 程序的路径
whereis
whereis 命令用于定位命令的二进制文件、源代码文件和手册页,适用于寻找安装在系统中的程序相关文件。
基本语法
whereis command_name
示例
whereis ls # 查找 ls 命令的二进制文件、源代码和手册
type
type 命令用于判断某个命令是内部命令、外部命令还是别名。
基本语法
type command_name
示例
type ls # 判断 ls 是否是外部命令
grep
虽然 grep 主要用于文本匹配,但可以与文件查找命令结合使用,查找特定内容的文件。
grep -r "pattern" /path/to/search # 在目录中递归搜索包含 "pattern" 的文件
5.文件压缩和打包
打包并使用 gzip 压缩:
tar -cvzf archive.tar.gz /path/to/files
解压缩并解包:
tar -xvzf archive.tar.gz
使用 bzip2 压缩文件:
bzip2 filename
使用 xz 压缩文件:
xz filename
总结
Linux 中的文件压缩和打包通过工具 tar、gzip、bzip2 和 xz 等来实现。
tar 主要用于打包多个文件,gzip 和 bzip2 则用于压缩单个文件。
它们结合使用,可以实现高效的文件压缩与打包操作,广泛应用于备份、传输和存储等场景。
七、shell脚本编程
Shell编程是指通过Shell(命令行解释器)编写脚本,自动化执行一系列命令的过程。它广泛用于Unix/Linux系统管理、自动化任务处理等场景。
Shell编程是一种强大且灵活的工具,适用于各种自动化任务。通过学习变量、条件判断、循环、函数和文件处理等核心概念,可以快速上手并编写高效的Shell脚本。
1.shell脚本用途
Shell脚本主要用于自动化日常任务、系统管理、服务部署、批量处理、日志分析、备份恢复等操作,可以有效减少人工操作,提高工作效率和精确性。
1.系统管理与自动化任务
自动化重复任务:执行常见的系统任务,如备份、日志清理、文件管理等。
系统监控:定期检查系统资源使用情况(CPU、内存、磁盘等),自动生成报告。
计划任务:结合cron,设置定时任务自动执行Shell脚本,无需人工干预。
2.批处理任务
批量文件处理:批量重命名文件、转换文件格式、整理文件夹等。
批量操作用户和权限:创建、删除用户,设置权限,批量处理文件的读写权限等。
3.服务部署与管理
自动化软件安装:一键部署环境,安装所需的软件包和依赖。
服务管理脚本:启动、停止、重启服务,查看服务状态的脚本。
服务器集群管理:在多个服务器上同步执行同样的操作。
4.开发和运维工具
自动构建与部署:自动化项目编译、打包、发布流程,结合CI/CD工具(如Jenkins、GitLab CI)简化流程。
环境配置:设置开发或生产环境的配置文件、环境变量等。
日志分析:分析应用程序或系统生成的日志文件,提取关键信息。
5.文本处理
文件内容筛选与修改:使用grep、sed、awk等工具查找、修改文本文件内容。
日志清理与格式化:清理旧日志,或者将日志格式化为特定格式供后续处理。
6.备份与恢复
文件和数据库备份:定期执行文件夹、数据库的备份任务,将备份文件上传到远程服务器。
恢复数据:结合脚本恢复备份的数据。
2.脚本基本结构
Shell脚本的结构包括解释器声明、注释、变量、输入输出、条件判断、循环、函数、命令组合、重定向和脚本退出。通过有序地安排这些结构,能够编写功能强大的脚本,实现自动化任务和系统管理。
1.Shebang(解释器指示)
Shell脚本的第一行通常是Shebang,用于指定脚本的解释器,这告诉系统使用哪个Shell来解释和执行脚本内容。
#!/bin/bash
常见的解释器:
/bin/bash:Bash Shell
/bin/sh:POSIX Shell
/usr/bin/env bash:在环境路径中寻找bash解释器
2. 注释
注释用于为脚本内容添加说明,不会被Shell执行。
单行注释使用#:
多行注释:
在Bash中,可以使用:和<<进行多行注释:
: <<'COMMENT'
这是多行注释
这一行也不会被执行
COMMENT
3.变量定义
变量用于存储数据,Shell中不需要声明变量类型,直接赋值即可。
VAR_NAME="value"
name="Alice"
age=30
3.shell脚本调试
调试Shell脚本是保证脚本正确运行的重要步骤。
1.使用-x选项进行逐行调试
在脚本执行时添加-x选项,Shell会逐行输出脚本执行的每个命令及其结果,帮助跟踪脚本执行过程。
方法1:在命令行中使用bash -x执行脚本:
bash -x script.sh
方法2:在脚本的第一行添加set -x:
#!/bin/bash
set -x
# 你的脚本内容
set +x # 关闭调试模式
效果:打印每个执行的命令及其结果,帮助查找执行过程中的问题。
2.使用set -e选项检测错误
set -e会使脚本在遇到第一个错误时立即退出,这对确保脚本的正确性非常有用。
#!/bin/bash
set -e
command1
command2 # 如果这里发生错误,脚本将立即退出
3.使用set -u检测未定义变量
set -u会使脚本在使用未定义的变量时报错并退出,避免变量未初始化带来的问题。
#!/bin/bash
set -u
echo $UNDEFINED_VAR # 这里会报错,因为未定义变量
4.使用trap捕获和调试信号
trap命令可以用来捕获和处理信号,帮助调试程序中的中断或错误情况。
示例:捕获ERR信号,打印错误信息和行号:
trap 'echo "Error occurred at line $LINENO"; exit 1' ERR
command1
command2 # 如果这里发生错误,会打印出错误行号
5.逐步打印变量值
在脚本中插入echo或printf语句,输出变量的值、状态或命令的执行结果,帮助确认程序逻辑是否正确。
#!/bin/bash
var="Hello"
echo "变量var的值是:$var"
6.检查退出状态码
每个命令执行后都会生成一个退出状态码,0表示成功,非0表示失败。可以使用$?来获取命令的退出状态。
command1
if [ $? -ne 0 ]; then
echo "command1执行失败"
fi
7.调试特定函数或命令块
可以在需要调试的函数或代码块前后使用set -x和set +x打开/关闭调试。
some_function() {
set -x # 打开调试
command1
command2
set +x # 关闭调试
}
**8.使用 L I N E N O 获取行号 ∗ ∗ 通过 LINENO获取行号** 通过 LINENO获取行号∗∗通过LINENO变量可以获取当前脚本执行的行号,有助于定位问题所在的行。
echo "当前行号是:$LINENO"
4.脚本变量
Shell脚本中的变量是用于存储和管理数据的实体,不需要显式声明类型,Shell会根据赋值自动处理变量的类型。
Shell脚本中的变量分为局部变量、环境变量和特殊变量,变量可以存储数据、接受用户输入或从命令行参数中获取值。
变量在脚本中扮演着重要的角色,常用于存储用户输入、计算结果或作为函数参数。
1. 定义变量
在Shell中,变量的定义非常简单,不需要指定数据类型,只需直接赋值即可。
变量名不能包含空格,通常建议使用大写字母来定义变量名。
VAR_NAME=value
2.引用变量
要使用变量的值时,变量名前需要加上$符号。
echo $VAR_NAME
echo "Name is $NAME"
3.变量赋值规则
变量名和等号之间不能有空格,否则会导致语法错误。
NAME="Alice" 正确
NAME = "Alice" 会报错
4.环境变量与局部变量
局部变量:在当前Shell进程中定义的变量,其他进程无法访问。
环境变量:使用export命令将局部变量提升为环境变量,环境变量可以被当前Shell及其子进程访问。
定义局部变量: MY_VAR="Hello"
定义环境变量: export MY_VAR="Hello"
5.读取用户输入的变量
使用read命令从用户输入中读取变量。
read VAR_NAME
示例:
echo "请输入你的名字:"
read USER_NAME
echo "你好, $USER_NAME"
6.位置参数变量
Shell脚本可以接收命令行参数,脚本中的变量$1、$2等表示传递给脚本的参数。
#!/bin/bash
echo "第一个参数是:$1"
echo "第二个参数是:$2"
如果运行:
./script.sh arg1 arg2
输出
第一个参数是:arg1
第二个参数是:arg2
7.特殊变量
$0:表示脚本本身的名称。
$#:表示传递给脚本的参数个数。
$@:表示所有参数,作为一个字符串处理,每个参数保持独立。
$*:表示所有参数,作为一个整体字符串处理。
$?:表示上一个命令的退出状态,0表示成功,非0表示失败。
$$:表示当前Shell脚本的进程ID。
8.字符串操作
Shell变量的值通常是字符串类型,支持多种字符串操作。
拼接字符串:
VAR1="Hello"
VAR2="World"
RESULT="$VAR1 $VAR2"
echo $RESULT # 输出:Hello World
获取字符串长度:
VAR="Hello"
echo ${#VAR} # 输出:5
9.变量的默认值
使用${VAR:-default}可以为未定义的变量提供默认值。
echo ${NAME:-"Anonymous"} # 如果NAME未定义,将输出Anonymous
10.只读变量
使用readonly命令将变量设置为只读,一旦设置,就无法修改。
readonly PI=3.14
PI=3.1415 # 会报错,无法修改
11. 删除变量
使用unset命令可以删除变量,使其失效。
VAR="test"
unset VAR
echo $VAR # 不会输出任何值,因为VAR已删除
12. 数组
Shell支持一维数组,数组元素用空格分隔,可以通过索引访问。
定义数组
MY_ARRAY=(apple orange banana)
访问数组元素:
echo ${MY_ARRAY[0]} # 输出:apple
获取数组的所有元素
echo ${MY_ARRAY[@]} # 输出:apple orange banana
5.条件测试
在Shell脚本中,条件测试变量用于执行逻辑判断,通常通过 [ ] 、[[ ]] 或 test 命令来进行。条件测试常用于检查变量的值、文件状态或执行比较操作。
Shell脚本中的条件测试可以用来比较字符串、数值、检查文件属性以及进行逻辑运算。掌握条件测试对于编写功能丰富且健壮的Shell脚本非常重要。
1.基本语法
条件测试基本语法
条件测试可以使用以下三种形式:
1.test命令:test 条件
2.方括号[ ]:[ 条件 ]
3.双方括号[[ ]]:[[ 条件 ]](Bash扩展,支持更多高级功能)
if [ "$VAR" == "value" ]; then
echo "变量等于value"
fi
2.字符串比较
相等:判断两个字符串是否相等
[ "$VAR1" == "$VAR2" ]
不相等:判断两个字符串是否不相等。
[ "$VAR1" != "$VAR2" ]
判断字符串是否为空:
[ -z "$VAR" ] 如果字符串为空,返回真。
判断字符串是否不为空:
[ -n "$VAR" ] 如果字符串不为空,返回真。
示例:
VAR="Hello"
if [ "$VAR" == "Hello" ]; then
echo "变量是Hello"
fi
3.数值比较
数值比较与字符串比较不同,数值比较使用-eq、-ne等操作符。
等于: [ "$NUM1" -eq "$NUM2" ]
不等于: [ "$NUM1" -ne "$NUM2" ]
大于: [ "$NUM1" -gt "$NUM2" ]
小于: [ "$NUM1" -lt "$NUM2" ]
大于或等于: [ "$NUM1" -ge "$NUM2" ]
小于或等于: [ "$NUM1" -le "$NUM2" ]
示例:
NUM1=10
NUM2=20
if [ "$NUM1" -lt "$NUM2" ]; then
echo "$NUM1 小于 $NUM2"
fi
4.文件条件测试
用于检查文件是否存在、是否可读、可写等。
文件存在: [ -e "file.txt" ]
文件是普通文件: [ -f "file.txt" ]
文件是目录: [ -d "directory" ]
文件可读: [ -r "file.txt" ]
文件可写: [ -w "file.txt" ]
文件可执行: [ -x "file.sh" ]
5.逻辑运算符
可以使用逻辑运算符结合多个条件:
与逻辑(AND):-a或&&
[ "$VAR1" == "value1" -a "$VAR2" == "value2" ]
[[ "$VAR1" == "value1" && "$VAR2" == "value2" ]]
或逻辑(OR):-o或||
[ "$VAR1" == "value1" -o "$VAR2" == "value2" ]
[[ "$VAR1" == "value1" || "$VAR2" == "value2" ]]
非逻辑(NOT):!
[ ! -e "file.txt" ] # 如果文件不存在,返回真
6.使用test命令
test命令与[ ]的作用相同,但语法上不使用方括号。
test "$VAR1" == "value"
if test "$VAR1" == "value"; then
echo "变量等于value"
fi
7.使用[[ ]]进行高级测试
Bash中的[[ ]]支持正则表达式、模式匹配等高级功能,适合进行复杂条件判断。
字符串匹配(模式匹配):
[[ "$VAR" == abc* ]] # 匹配以abc开头的字符串
正则表达式匹配:
[[ "$VAR" =~ ^[0-9]+$ ]] # 匹配纯数字
6.脚本函数
Shell脚本中的函数是用于封装和复用一段代码的结构,允许你在脚本中重复使用特定的逻辑。函数使脚本更易于维护、调试和扩展,是组织代码的重要工具。
1.函数定义
function_name() {
# 函数体,包含执行的命令
}
也可以省略function关键字(适用于bash等常见的Shell):
function_name {
# 函数体
}
示例
greet() {
echo "Hello, $1"
}
2.函数调用
定义完函数后,可以直接通过函数名进行调用。函数可以在脚本的任何位置调用,但通常会在定义函数之后调用。
greet "Alice"
#输出
Hello, Alice
3.函数参数
函数可以接收参数,参数通过$1、$2、$3等特殊变量传递。
$1表示第一个参数,$2表示第二个参数,依次类推。
$0始终表示脚本本身的名称,而$@和$*分别表示所有传递给函数的参数。
示例
sum() {
echo "总和是:$(( $1 + $2 ))"
}
sum 5 10 # 传递两个参数
输出
总和是:15
4.函数返回值
函数返回值
1.函数可以通过return命令返回一个退出状态码,但只能返回整数(范围是0-255),不能返回字符串。
2.return命令返回的值可以在函数调用后通过$?获取。
示例
check_even() {
if (( $1 % 2 == 0 )); then
return 0 # 偶数返回0
else
return 1 # 奇数返回1
fi
}
check_even 4
if [ $? -eq 0 ]; then
echo "数字是偶数"
else
echo "数字是奇数"
fi
输出
数字是偶数
5.局部变量
局部变量
1.Shell函数默认使用全局变量,这意味着函数内定义的变量在整个脚本中都是可见的。
2.使用local关键字可以将变量的作用域限制在函数内部,防止变量与脚本其他部分冲突。
示例
my_function() {
local VAR="Local Value" # 局部变量
echo "在函数内部:$VAR"
}
VAR="Global Value"
my_function
echo "在函数外部:$VAR"
输出
在函数内部:Local Value
在函数外部:Global Value
7.信号捕捉trap
Shell脚本中的信号捕捉是一种处理系统信号(如中断、终止等)的机制。当系统发出信号时,Shell脚本可以捕获这些信号并执行自定义的处理逻辑。信号捕捉可以用来处理用户中断、清理资源、停止某些进程等。
Shell脚本中的信号捕捉通过trap命令实现,可以对系统发送的信号进行处理、忽略或恢复默认行为。信号捕捉常用于确保脚本被中断或终止时能够正确地清理资源、保存数据或执行其他必要的操作。这在编写健壮的Shell脚本时非常有用。
1.什么是信号
信号是操作系统用来通知进程某些事件的机制。常见的信号包括:
SIGINT (2):用户通过键盘发送中断信号(通常是Ctrl + C)。
SIGTERM (15):请求终止进程(默认的终止信号)。
SIGKILL (9):强制杀死进程(不能被捕捉)。
SIGHUP (1):挂起信号,当终端关闭时发出。
SIGQUIT (3):用户通过键盘请求退出(通常是Ctrl + \)。
SIGSTOP 和 SIGCONT:停止或继续进程。
2.捕捉信号的命令:trap
Shell使用trap命令来捕捉信号并指定当信号到来时要执行的操作。
基本语法
trap 'commands' signal(s)
commands:收到信号时要执行的命令或函数。
signal(s):要捕获的信号列表。
示例
trap 'echo "捕捉到SIGINT信号"; exit' SIGINT
3.捕捉多个信号
可以同时捕捉多个信号,用空格分隔信号列表。
trap 'echo "捕捉到SIGINT或SIGTERM信号"; exit' SIGINT SIGTERM
4.恢复默认行为
使用trap时,也可以将信号的处理恢复为默认行为。默认行为是终止进程。
trap - SIGINT # 恢复SIGINT信号的默认行为
5.忽略信号
可以通过trap ‘’ SIGNAL来忽略特定信号,使脚本在收到该信号时不做任何处理。
trap '' SIGINT # 忽略SIGINT信号,按Ctrl + C不会中断脚本
6.清理工作
信号捕捉常用于清理脚本执行过程中创建的临时文件、释放资源等。当脚本被中断或终止时,使用信号捕捉可以确保系统资源被正确释放。
示例
cleanup() {
echo "正在清理临时文件..."
rm -f /tmp/my_temp_file
exit
}
trap cleanup SIGINT SIGTERM
# 主脚本部分
echo "创建临时文件"
touch /tmp/my_temp_file
while true; do
echo "脚本正在运行..."
sleep 5
done
运行时,如果用户按Ctrl + C,脚本将调用cleanup函数,删除临时文件并退出。
7. 捕捉退出信号
EXIT信号是一种特殊信号,它在脚本退出时自动触发(无论是正常退出还是通过信号终止)。可以用来做最终的清理工作。
trap 'echo "脚本即将退出"; cleanup' EXIT
8. 常用信号及其编号
9.例子:捕捉和处理信号
示例:在Ctrl + C中断时保存数据并退出
save_data() {
echo "保存数据中..."
# 模拟保存数据操作
sleep 1
echo "数据已保存"
}
trap 'save_data; exit' SIGINT
# 主循环
while true; do
echo "运行中,按Ctrl+C保存数据并退出"
sleep 3
done
8.流程控制语句
Shell脚本中的流程控制语句允许脚本根据条件执行不同的命令或重复执行命令。常见的流程控制语句包括条件判断、循环和分支。
Shell脚本中的流程控制语句包括条件判断(如if、case)、循环(如for、while、until)以及跳转控制(如break、continue)。这些语句可以让脚本根据不同的条件和数据进行灵活的控制和执行,是编写复杂脚本的基础。
1. 条件判断语句
if-else用于根据条件执行不同的命令。
if [ condition ]; then
# 当条件为真时执行的命令
elif [ another_condition ]; then
# 另一个条件为真时执行的命令
else
# 当条件为假时执行的命令
fi
示例
number=10
if [ $number -lt 20 ]; then
echo "Number is less than 20"
else
echo "Number is 20 or greater"
fi
case 语句
case语句用于多重分支选择,类似于其他编程语言中的switch语句。
case expression in
pattern1)
# 当表达式匹配pattern1时执行
;;
pattern2)
# 当表达式匹配pattern2时执行
;;
*)
# 默认匹配
;;
esac
示例
read -p "请输入一个字符: " char
case $char in
[a-z])
echo "输入的是小写字母"
;;
[A-Z])
echo "输入的是大写字母"
;;
[0-9])
echo "输入的是数字"
;;
*)
echo "输入的是其他字符"
;;
esac
2. 循环语句
for循环用于遍历一系列值。
语法
for var in list; do
# 循环体
done
示例
for i in 1 2 3 4 5; do
echo "Number: $i"
done
使用C风格的for循环:
for ((i=1; i<=5; i++)); do
echo "Number: $i"
done
while 循环
while循环在条件为真时反复执行一段代码。
语法
while [ condition ]; do
# 循环体
done
示例
count=1
while [ $count -le 5 ]; do
echo "Count: $count"
((count++))
done
until 循环
until循环在条件为假时反复执行一段代码,与while相反。
语法
until [ condition ]; do
# 循环体
done
示例
count=1
until [ $count -gt 5 ]; do
echo "Count: $count"
((count++))
done
3. 跳转控制
break 语句
break用于提前终止循环。
示例
for i in 1 2 3 4 5; do
if [ $i -eq 3 ]; then
break # 当i等于3时终止循环
fi
echo "Number: $i"
done
continue 语句
continue用于跳过本次循环的剩余部分,继续下一次循环。
for i in 1 2 3 4 5; do
if [ $i -eq 3 ]; then
continue # 当i等于3时跳过剩余部分
fi
echo "Number: $i"
done
八、磁盘和存储管理
Linux磁盘和存储管理涵盖了磁盘分区、文件系统管理、逻辑卷管理、RAID配置、磁盘配额等多个方面。通过这些工具和技术,管理员可以有效地管理系统存储资源、确保数据安全、并根据需求调整存储结构。
1.磁盘分区
磁盘分区是将物理存储设备划分为多个逻辑区域的过程,每个区域可以独立管理和使用。
分区表:存储分区信息的表,常见的有两种类型:
MBR (Master Boot Record):经典的分区表格式,最多支持4个主分区,每个分区最大支持2TB。
GPT (GUID Partition Table):现代的分区表格式,支持更多分区和更大的磁盘容量(最大支持18EB)。
常见的分区类型:
主分区 (Primary Partition):系统引导和操作系统通常放在主分区。
扩展分区 (Extended Partition):用于包含逻辑分区。
逻辑分区 (Logical Partition):扩展分区内部的子分区。
分区工具:
fdisk:用于MBR分区表管理的工具,常用于较旧的系统。
gdisk:用于GPT分区表管理的工具。
parted:高级分区管理工具,支持MBR和GPT分区表。
示例:使用fdisk列出分区
sudo fdisk -l
2.文件系统
文件系统是组织和存储文件的方式,它决定了文件如何在磁盘上存储和检索。
常见文件系统类型:
ext4:常用的Linux本地文件系统,支持大文件、日志和高性能。
XFS:高性能的文件系统,适合大文件和并行访问。
Btrfs:高级文件系统,支持快照、子卷等现代特性。
VFAT:与Windows兼容的文件系统,常用于可移动存储设备。
NTFS:Windows默认文件系统,Linux可以通过ntfs-3g驱动程序访问。
文件系统管理工具:
mkfs:用于创建文件系统。例如,mkfs.ext4创建ext4文件系统。
fsck:文件系统检查和修复工具。
tune2fs:调整ext文件系统参数的工具。
示例:创建ext4文件系统
sudo mkfs.ext4 /dev/sdb1
3.挂载 (Mount)
在Linux中,挂载将一个存储设备或分区关联到文件系统的某个目录,从而可以访问该设备的文件。
挂载命令:mount
使用mount命令将设备挂载到某个目录。
挂载点通常在/mnt或/media目录下。
挂载的配置文件:/etc/fstab
fstab文件定义了系统启动时自动挂载的文件系统。每行包含设备、挂载点、文件系统类型、挂载选项等信息。
示例:手动挂载设备
sudo mount /dev/sdb1 /mnt
示例:在/etc/fstab中添加自动挂载项
/dev/sdb1 /mnt ext4 defaults 0 2
4.逻辑卷管理 (LVM)
逻辑卷管理(LVM)是Linux系统中对磁盘进行灵活管理的技术。它允许管理员动态调整磁盘空间,创建快照,并在多个物理存储设备之间分布数据。
LVM 组件:
物理卷 (Physical Volume, PV):物理存储设备,如硬盘分区或整个磁盘。
卷组 (Volume Group, VG):由一个或多个物理卷组成的存储池。
逻辑卷 (Logical Volume, LV):在卷组中划分的逻辑存储区域,可以动态调整大小。
LVM 管理工具:
pvcreate:创建物理卷。
vgcreate:创建卷组。
lvcreate:创建逻辑卷。
lvextend:扩展逻辑卷。
示例:创建LVM逻辑卷
sudo pvcreate /dev/sdb1
sudo vgcreate my_vg /dev/sdb1
sudo lvcreate -L 10G -n my_lv my_vg
5.RAID–磁盘冗余阵列
RAID (Redundant Array of Independent Disks)
RAID是一种通过组合多个磁盘来提高存储可靠性和性能的技术。
RAID类型:
RAID 0:条带化存储,提高读写性能,但没有冗余。
RAID 1:镜像存储,提供冗余备份。
RAID 5:条带化存储并带有分布式奇偶校验,提供冗余和性能平衡。
RAID 6:类似RAID 5,但带有双重奇偶校验,增加容错能力。
RAID 10:条带化和镜像的组合,提供高性能和冗余。
管理工具:
mdadm:管理软件RAID的工具。
示例:创建RAID 1阵列
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
九、软件管理
Linux软件管理是指在Linux系统中安装、更新、删除和管理软件包的过程。不同的Linux发行版使用不同的软件包管理系统。
1.DEB和APT (Debian及其衍生版)
DEB和APT (Debian及其衍生版)
DEB:Debian及其衍生版(如Ubuntu)使用的基本软件包格式。
APT(Advanced Package Tool):用于处理DEB包的高级包管理工具。
常用命令:
安装软件: sudo apt-get install package_name
更新软件包列表: sudo apt-get update
升级系统: sudo apt-get upgrade
卸载软件: sudo apt-get remove package_name
搜索软件: apt-cache search package_name
2.RPM 和 YUM/DNF (Red Hat及其衍生版)
RPM和 YUM/DNF (Red Hat及其衍生版)
RPM (Red Hat Package Manager):用于Red Hat及其衍生版(如CentOS、Fedora)的基本软件包格式。
YUM (Yellowdog Updater Modified):早期的包管理工具,适用于RPM包。
DNF (Dandified YUM):现代的包管理工具,取代了YUM,提供更好的性能和功能。
常用命令:
安装软件:
sudo dnf install package_name
#或者
sudo yum install package_name
更新软件包列表和系统:
sudo dnf update
#或者
sudo yum update
卸载软件:
sudo dnf remove package_name
#或者
sudo yum remove package_name
搜索软件:
dnf search package_name
#或者
yum search package_name
3.编译和安装源代码
有时,软件包管理系统可能无法提供最新版本的软件,或者用户需要自定义配置。这时可以通过源代码编译和安装软件:
编译和安装源代码
1.下载源代码:从官方网站或版本控制系统获取源代码。
2.解压源代码:tar -xzf software.tar.gz
3.编译和安装:
cd software_directory
./configure
make
sudo make install
注意事项:
确保系统中安装了编译工具(如gcc)和依赖库。
有时需要安装开发包(例如libfoo-dev)。
4.软件源(Repository)管理
软件源是包含软件包及其元数据的存储位置。Linux系统通过配置软件源来获取和更新软件包。
Linux软件管理包括使用不同的包管理系统(如APT、YUM/DNF、Zypper)来安装、更新和删除软件包,编译源代码,管理软件源,查询软件包信息,并清理不再需要的软件包。掌握这些技能有助于有效维护和优化Linux系统。
APT(Debian及其衍生版):
配置文件:/etc/apt/sources.list 和 /etc/apt/sources.list.d/ 目录中的文件。
添加源: sudo add-apt-repository ppa:repository_name
YUM/DNF(Red Hat及其衍生版):
配置文件:/etc/yum.repos.d/ 目录中的 .repo 文件。
添加源:
通过下载 .repo 文件并放置到 /etc/yum.repos.d/。
5.软件包查询和信息
获取软件包的信息有助于了解其版本、依赖关系等。
软件包查询和信息
APT:
apt-cache show package_name
YUM/DNF:
yum info package_name
# 或者
dnf info package_name
6.软件包清理
管理系统中的软件包可以包括清理无用的缓存和不再需要的软件包。
软件包清理
APT:
sudo apt-get autoremove
sudo apt-get clean
YUM/DNF:
sudo dnf autoremove
sudo dnf clean all
#或者
sudo yum autoremove
sudo yum clean all
十、计算机网络
1.网络协议
网络协议与OSI模型是理解计算机网络通信的重要基础。网络协议是设备之间通信的规则和约定,而OSI模型则是一个理论框架,用于标准化网络通信,分层处理数据传输中的各项任务。
网络协议是指计算机或网络设备在通信时需要遵守的一系列规则和标准,确保数据能够准确、可靠地在网络中传输。常见的网络协议包括:
常见的网络协议
1.TCP/IP:互联网协议套件,TCP(传输控制协议)确保数据的可靠传输,IP(互联网协议)用于定位设备和路由数据。
2.HTTP/HTTPS:超文本传输协议,用于网页浏览,HTTPS是其加密版本,提供安全通信。
3.FTP:文件传输协议,用于文件在网络中的上传和下载。
4.SMTP/IMAP/POP3:邮件协议,SMTP用于发送邮件,IMAP和POP3用于接收邮件。
5.DNS:域名系统,将域名转换为IP地址。
2.OSI模型的七层结构
OSI模型的七层结构:
1.物理层:
功能:处理物理介质上的数据传输。定义了如何通过电缆、光纤、无线等传输比特流。
设备:网卡、集线器、网线、无线发射器等。
协议:Ethernet、Wi-Fi、Bluetooth等。
2.数据链路层:
功能:负责点对点之间的可靠传输,进行错误检测与纠正。它将数据分为帧进行传输,包含源和目标的MAC地址。
设备:交换机、桥接器。
协议:Ethernet、PPP(点对点协议)、HDLC等。
3.网络层:
功能:负责选择路径和路由数据包到目标网络。使用IP地址进行标识和寻址。
设备:路由器。
协议:IP(IPv4/IPv6)、ICMP(互联网控制消息协议)、ARP(地址解析协议)等。
4.传输层:
功能:提供端到端的通信服务,确保数据的可靠传输(如TCP),或者快速的、无连接的数据传输(如UDP)。
协议:TCP(传输控制协议)、UDP(用户数据报协议)。
5.会话层:
功能:负责建立、管理和终止会话,允许设备之间创建连接和保持通信。
协议:NetBIOS、RPC等。
6.表示层:
功能:处理数据的格式转换、加密和解密,确保应用层能够理解传输的数据。它负责不同主机之间的语法和语义的转换。
协议:SSL/TLS(用于加密和安全传输)、JPEG、GIF(用于图像格式)。
7.应用层:
功能:面向用户,提供直接的网络服务,如文件传输、电子邮件、远程登录等。
协议:HTTP、FTP、SMTP、DNS等。
OSI模型的作用
1.标准化通信:OSI模型为不同厂商提供了统一的标准,确保不同设备和系统能够相互通信。
2.模块化设计:分层设计使每一层独立工作,便于开发、测试和维护。
3.问题定位:帮助网络工程师在不同层次上诊断和解决网络问题。
3.TCP/IP协议栈
TCP/IP模型:实际网络中广泛使用的模型,它简化了OSI模型的七层结构,将其合并为四层:
网络接口层:对应OSI的物理层和数据链路层。
网络层:对应OSI的网络层,处理IP协议。
传输层:对应OSI的传输层,处理TCP、UDP协议。
应用层:对应OSI的会话层、表示层和应用层,处理HTTP、FTP等协议。
4.TCP三次握手和四次挥手
三次握手用于建立连接,通过SYN和ACK包,确保双方可以发送和接收数据。
四次挥手用于关闭连接,通过FIN和ACK包,确保双方已经完成数据传输并可以安全地断开连接。
这种机制确保了TCP连接的可靠性,即连接的建立和关闭都是经过确认的。
1.TCP三次握手
TCP的三次握手(Three-way Handshake)是客户端和服务器在建立TCP连接时进行的三步确认过程,用于确保双方能够进行可靠的通信。其目的是建立一个可靠的全双工连接,保证双方的接收与发送能力正常。
三次握手的详细过程:
1.第一次握手:客户端发送SYN
客户端:向服务器发送一个SYN(Synchronize)标志的数据包,请求建立连接。
此时,客户端进入SYN_SENT状态。
数据包:包含一个初始序列号(Initial Sequence Number, ISN),
即SYN = 1, seq = x,表示客户端希望与服务器建立连接。
2.第二次握手:服务器发送SYN-ACK
服务器:收到客户端的SYN请求后,确认已收到,并回复一个SYN-ACK(Synchronize-Acknowledgement)标志的数据包,表示同意建立连接。
此时,服务器进入SYN_RCVD状态。
数据包:包含服务器的初始序列号,并对客户端的SYN进行确认,
即SYN = 1, ACK = 1, seq = y, ack = x + 1,其中ack表示确认接收客户端的序列号x。
3.第三次握手:客户端发送ACK
客户端:收到服务器的SYN-ACK后,向服务器发送ACK(Acknowledgement)标志的数据包,确认连接已经建立。
此时,客户端进入ESTABLISHED状态。
数据包:ACK = 1, seq = x + 1, ack = y + 1,表示客户端确认接收了服务器的序列号y。
结果:三次握手完成后,客户端和服务器都进入ESTABLISHED状态,TCP连接成功建立,可以开始数据传输。
2.TCP四次挥手
TCP的四次挥手(Four-way Handshake)用于关闭TCP连接。由于TCP是全双工通信,双方必须分别关闭各自的发送和接收通道,因此需要四步来完成连接的关闭。其目的是确保双方都能完全关闭连接,并且不再发送数据。
四次挥手的详细过程:
1.第一次挥手:客户端发送FIN
客户端:当客户端确定不再发送数据时,向服务器发送一个FIN(Finish)标志的数据包,表示请求关闭连接。
此时,客户端进入FIN_WAIT_1状态。
数据包:FIN = 1, seq = u,其中u是客户端的当前序列号。
2.第二次挥手:服务器发送ACK
服务器:收到客户端的FIN后,确认已收到,并回复一个ACK标志的数据包。
此时,服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。
数据包:ACK = 1, seq = v, ack = u + 1,确认客户端的FIN包。
3.第三次挥手:服务器发送FIN
服务器:当服务器也准备好关闭连接时,向客户端发送FIN标志的数据包,表示请求关闭连接。
此时,服务器进入LAST_ACK状态。
数据包:FIN = 1, seq = v。
4.第四次挥手:客户端发送ACK
客户端:收到服务器的FIN后,向服务器发送ACK标志的数据包,确认连接关闭。
此时,客户端进入TIME_WAIT状态,等待一段时间(通常为2倍的报文最大生存时间(MSL))以确保服务器收到ACK后不再重传FIN。
数据包:ACK = 1, seq = u + 1, ack = v + 1,确认服务器的FIN包。
结果:服务器收到客户端的ACK后,进入CLOSED状态,连接关闭;客户端在TIME_WAIT状态超时后,也进入CLOSED状态,完全断开连接。
5.网络配置命令
Linux系统提供了多种命令用于配置和管理网络设置,常见的包括IP地址分配、网络接口管理、路由配置等。
1. ifconfig(interface configuration)
ifconfig(interface configuration)
功能:用于显示和配置网络接口(仅适用于较老的系统,较新的系统建议使用ip命令)。
常用选项:
ifconfig:查看网络接口的状态(IP地址、子网掩码、广播地址等)。
ifconfig eth0 up:启用网络接口。
ifconfig eth0 down:禁用网络接口。
ifconfig eth0 192.168.1.100 netmask 255.255.255.0:手动配置IP地址和子网掩码。
2.ip
ip
功能:替代ifconfig,提供更强大的网络配置和管理功能。
常用选项:
ip addr show:显示所有网络接口的详细信息。
ip link set eth0 up:启用网络接口。
ip link set eth0 down:禁用网络接口。
ip addr add 192.168.1.100/24 dev eth0:为接口eth0添加IP地址。
ip route show:显示路由表。
ip route add default via 192.168.1.1:添加默认路由。
3.nmcli
nmcli
功能:用于控制NetworkManager服务,适合桌面环境和服务器的网络配置。
常用选项:
nmcli device status:查看网络设备的状态。
nmcli connection show:显示所有网络连接。
nmcli connection add con-name "eth0-connection" ifname eth0 type ethernet ip4 192.168.1.100/24 gw4 192.168.1.1:配置新的静态IP网络连接。
nmcli connection up "eth0-connection":启用网络连接。
nmcli connection down "eth0-connection":禁用网络连接。
4.route
route
功能:用于显示和修改IP路由表(ip route命令可以代替它)。
常用选项:
route -n:查看路由表。
route add default gw 192.168.1.1:添加默认网关。
route del default gw 192.168.1.1:删除默认网关。
5.ping
ping
功能:用于测试网络连通性,发送ICMP包来检测目标主机是否可达。
常用选项:
ping www.example.com:检测与远程服务器的连通性。
ping -c 4 192.168.1.1:向指定IP发送4个ICMP请求包。
6.netstat
netstat
功能:显示网络连接、路由表、接口状态等信息(ss命令已替代netstat)。
常用选项:
netstat -r:显示路由表。
netstat -i:显示网络接口状态。
netstat -tuln:显示正在监听的端口。
7.ss
ss
功能:用于显示网络连接的统计信息,功能类似于netstat,但性能更高。
常用选项:
ss -tuln:显示监听的TCP和UDP端口。
ss -s:显示网络连接的简要统计。
8.traceroute
traceroute
功能:用于跟踪数据包在网络中的传输路径,帮助诊断网络问题。
常用选项:
traceroute www.example.com:显示数据包从本地主机到目标服务器的路径。
traceroute -I www.example.com:使用ICMP协议进行路径跟踪。
9.dig
dig
功能:用于查询DNS信息,检查域名解析是否正常。
常用选项:
dig example.com:查询域名example.com的A记录。
dig -x 192.168.1.100:反向查询IP地址对应的域名。
10.nslookup
nslookup
功能:用于查询DNS服务器,类似于dig命令。
常用选项:
nslookup example.com:查询域名的IP地址。
nslookup 192.168.1.100:反向查询IP地址对应的域名。
11.ethtool
ethtool
功能:用于查看和修改网络接口的硬件属性。
常用选项:
ethtool eth0:查看网络接口的详细信息(如网卡速度、双工模式等)。
ethtool -s eth0 speed 100 duplex full:手动设置网卡速度和双工模式。
12.ifup/ifdown
ifup/ifdown
功能:用于启动和关闭网络接口(适用于Debian系系统)。
常用选项:
ifup eth0:启动网络接口eth0。
ifdown eth0:关闭网络接口eth0。
13. iptables/nftables
iptables/nftables
功能:用于配置Linux的防火墙规则,管理网络流量。
常用选项:
iptables -L:列出当前的防火墙规则。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT:允许22端口的TCP流量进入。
nft list ruleset:列出所有nftables规则
14.systemctl/networkctl
systemctl/networkctl
功能:用于控制网络服务,查看网络状态。
常用选项:
systemctl restart networking:重启网络服务。
networkctl status:查看网络设备的状态。
十一、进程性能管理和计划任务
Linux进程性能管理涉及监控、分析和优化系统的进程及资源使用情况,以确保系统高效运行。这包括CPU、内存、磁盘、网络等资源的使用监控,及时发现性能瓶颈并采取优化措施。
1.进程概念和生命周期
进程(Process)是操作系统中运行中的程序的实例。它是系统进行资源分配和任务调度的基本单位。每个进程都是一个独立的实体,包含程序的执行代码、数据、程序计数器、寄存器状态、堆栈以及与其运行相关的所有其他信息。
Process:运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位
·进程ID (Process ID,PID)号码被用来标记各个进程
·UID、GID、和SELinux语境决定对文件系统的存取和访问权限
·通常从执行进程的用户来继承
·存在生命周期
进程创建:
init:第一个进程,从CentOS7以后为systemd
进程:都由其父进程创建,fork(),父子关系,Cow: Copy On Write
进程的特点:
1.独立性:
进程是独立的,拥有自己独立的内存空间、数据、资源等,不与其他进程共享数据(除非通过特定的通信机制)。
2.动态性:
进程是动态执行的实体,会随着时间而变化,其生命周期包括创建、执行、等待、终止等状态。
3.资源拥有者:
每个进程都拥有自己使用的系统资源(如CPU时间、内存、文件描述符等)。进程的资源由操作系统分配和管理。
4.并发性:
操作系统允许多个进程同时运行,即使在单核处理器上,也可以通过时间片轮转来模拟并发执行。
进程的生命周期:
1.创建(Creation):
一个新进程通过系统调用(如fork())创建。此时,操作系统为进程分配必要的资源。
2.运行(Running):
进程获取CPU时间片后执行指令。一个时间点上,只有一个进程处于运行状态(在多核系统中可以多个进程同时运行在不同的CPU核上)。
3.阻塞(Blocked/Waiting):
当进程需要等待某些事件(如I/O操作完成、获取某个锁等)时,进程进入等待状态,直到事件完成后才会恢复执行。
4.就绪(Ready):
进程处于就绪状态,表示它已经准备好执行,但暂时没有获取CPU。
5.终止(Termination):
进程执行完毕或发生致命错误时会终止,操作系统会释放其占用的资源。
进程与线程的区别:
进程:进程是独立的执行单元,有自己的内存空间,进程之间不会直接共享内存。
线程:线程是进程的子任务,一个进程可以包含多个线程,线程之间共享进程的内存和资源,调度和切换的开销较低。
2.进程查看和管理工具
1.ps
功能:ps命令用于显示当前系统中的进程信息,类似于Windows的任务管理器。
常用选项:
ps aux:列出所有进程的详细信息,包括用户、进程ID、CPU/内存使用率、状态等。
ps -ef:以更详细的格式显示进程信息。
2.top
功能:top命令是一个实时的系统监控工具,可以查看进程的动态性能信息。
显示内容:
CPU使用率、内存使用情况、每个进程的资源消耗。
常用操作:
P:按CPU使用率排序。
M:按内存使用率排序。
k:通过进程ID杀死进程。
q:退出top。
3.htop
功能:htop是top命令的增强版,具有更友好的图形化界面,支持鼠标操作。
特点:颜色标注CPU、内存、交换空间的使用情况,操作更加直观。
4.pidstat
功能:pidstat命令用于显示各个进程的资源使用情况,尤其是CPU、内存、磁盘I/O等。
常用选项:
pidstat -u:显示各个进程的CPU使用情况。
pidstat -r:显示内存使用情况。
pidstat -d:显示磁盘I/O情况。
5.nice/renice
功能:用于调整进程的优先级,控制进程对CPU资源的争用。
常用选项:
nice -n 10 command:以较低优先级(10)运行某个命令。
renice -n 5 -p 1234:将进程ID为1234的进程优先级修改为5。
3.CPU性能监控
1.mpstat
功能:mpstat命令用于显示各个CPU的使用情况,包括用户态、系统态、空闲时间等。
常用选项:
mpstat -P ALL 1:每秒显示一次每个CPU的使用情况。
2.sar
功能:sar命令是一个综合性系统性能监控工具,可以收集CPU、内存、I/O、网络等多种资源的使用情况。
常用选项:
sar -u 1 3:每秒输出一次CPU使用情况,共输出3次。
sar -r:查看内存使用情况。
3.iostat
功能:iostat命令用于监控CPU和磁盘I/O的使用情况。
常用选项:
iostat -c:查看CPU的利用率。
iostat -d:查看磁盘的I/O情况。
4.内存性能管理
1.free
功能:free命令用于显示系统内存和交换分区的使用情况。
常用选项:
free -h:以人类可读格式显示内存使用情况。
2.vmstat
功能:vmstat命令用于监控系统的虚拟内存使用情况,以及I/O、CPU等资源的利用率。
常用选项:
vmstat 1:每秒显示一次系统的整体性能情况,包括内存使用、CPU负载、I/O情况。
5.磁盘I/O性能管理
1.iotop
功能:iotop命令实时监控进程的磁盘I/O活动,类似于top。
常用操作:
iotop -o:只显示有I/O操作的进程。
2.dstat
功能:dstat命令可以综合显示系统的CPU、内存、磁盘、网络等多个性能指标。
常用选项:
dstat:默认显示CPU、磁盘I/O、网络I/O的性能数据。
6.网络性能管理
1.netstat
功能:netstat用于查看网络连接、路由表、接口统计等。
常用选项:
netstat -tuln:显示当前系统正在监听的端口。
netstat -i:显示网络接口的统计信息。
2.ss
功能:ss命令用于查看网络连接和套接字状态,功能类似于netstat,但效率更高。
常用选项:
ss -tuln:列出所有监听的TCP和UDP连接。
ss -s:显示网络连接的简要统计信息。
3.iftop
功能:iftop用于实时监控网络带宽的使用情况。
特点:显示每个网络连接的实时数据流量。
4.nload
功能:nload提供带有图形化界面的实时网络流量监控工具,显示上传和下载的带宽使用情况。
7.系统负载管理
1.uptime
功能:uptime命令显示系统的运行时间、当前登录用户数和系统负载情况。
输出内容:
系统负载分为1分钟、5分钟、15分钟的平均值。系统负载值越低,表示系统运行越轻松。
2.load average
解释:load average是指特定时间内正在执行和等待执行的任务的平均数量。
通常有三个数值,分别代表1分钟、5分钟、15分钟的平均负载。如果负载接近CPU核心数,则说明系统负载较高。
8.系统日志查看
1.dmesg
功能:dmesg命令显示系统启动后的内核日志信息,尤其在硬件或驱动问题排查中非常有用。
2.journalctl
功能:journalctl用于查看和管理systemd日志。
常用选项:
journalctl -xe:显示系统中最新的错误日志,帮助排查问题。
9.任务计划
Linux任务计划是指通过系统的工具和服务自动定时执行任务,常用于执行备份、系统维护、脚本运行等任务。在Linux中,常见的任务调度工具包括cron和at。
Linux任务计划通过工具如cron、at等实现任务的自动调度。cron适合重复性任务,而at用于一次性任务。anacron则适用于无法保证系统持续运行的场景,确保任务在系统恢复时执行。
1.cron任务调度
cron是Linux系统中最常用的任务调度工具,用于在指定的时间周期内重复执行任务。
语法格式:
* * * * * command
分 时 日 月 周 命令
各字段含义:
第一列:分钟(0-59)
第二列:小时(0-23)
第三列:日期(1-31)
第四列:月份(1-12)
第五列:星期(0-7,0和7表示星期日)
command:要执行的命令或脚本
2.crontab命令
crontab -e:编辑当前用户的任务计划
crontab -l:查看当前用户的任务计划
crontab -r:删除当前用户的任务计划
示例
每天凌晨2:30运行备份脚本:
30 2 * * * /path/to/backup.sh
每周一早上8:00发送日志:
0 8 * * 1 /path/to/log_script.sh
3.at命令
at用于执行一次性任务,即在指定的时间执行任务,而不是周期性执行。
使用方法
语法:at [时间]
执行at命令后进入交互界面,可以输入要在指定时间执行的命令。完成后按Ctrl+D提交。
示例
在下午5:30执行备份脚本:
at 5:30 PM
at> /path/to/backup.sh
明天上午10点执行日志清理:
at 10:00 AM tomorrow
at> /path/to/cleanup.sh
十二、systemd服务管理和启动流程
systemd 是 Linux 系统中用于启动和管理系统服务的现代初始化系统(init system)。与传统的 SysVinit 相比,systemd 提供了更快的启动时间和更强大的服务管理功能,已成为大多数主流 Linux 发行版的默认服务管理器。
1.systemd的基本概念
systemd的基本概念
1.服务(Service):指可以在后台运行的程序,如sshd、nginx等。
2.单元(Unit):systemd 管理的对象统称为单元。常见单元类型有:
Service:服务单元,表示后台运行的服务程序(如httpd.service)。
Target:目标单元,类似运行级别,用于组织一组相关的服务(如multi-user.target)。
Socket:套接字单元,管理网络或IPC的套接字(如ssh.socket)。
Mount:挂载点单元,表示文件系统的挂载(如home.mount)。
单元的配置文件通常位于/etc/systemd/system 或/lib/systemd/system 目录下,后缀名通常是 .service、.target 等。
2.systemctl命令
systemctl 是管理 systemd 单元的主要工具。可以用它来启动、停止、重启服务,查看服务状态,设置开机启动等。
服务管理
systemctl start [service] 启动服务
systemctl stop [service] 停止服务
systemctl restart [service] 重启服务
systemctl reload [service] 重新加载服务配置(不重启服务)
systemctl status [service] 查看服务状态
systemctl enable [service] 设置服务开机自动启动
systemctl disable [service] 取消服务开机自动启动
systemctl is-enabled [service] 查看服务是否已启用开机启动
systemctl list-units --type=service 查看所有服务的状态
journalctl -u [service] 查看某个服务的日志
journalctl -u sshd 例如查看 sshd 的日志:
3.Unit类型及配置文件
服务单元(Service)
服务单元是最常见的单元类型,用于定义后台运行的服务。服务单元的配置文件位于 /etc/systemd/system 或 /lib/systemd/system,以 .service 结尾。
每个服务单元文件都包含以下主要部分:
[Unit]:定义服务的描述、依赖关系等信息。
[Service]:定义服务启动、停止等行为。
[Install]:定义服务如何被安装及开机启动。
示例 nginx.service
[Unit]
Description=A high performance web server
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s stop
PIDFile=/run/nginx.pid
[Install]
WantedBy=multi-user.target
4.Linux启动流程
Linux启动流程是指从按下电源按钮到操作系统完全加载并进入可操作状态的过程。这个过程分为多个阶段,每个阶段都执行特定的任务以确保系统正确启动。
Linux启动流程总结:
1.BIOS/UEFI:硬件初始化,寻找引导设备。
2.引导加载器(GRUB):加载并选择Linux内核。
3.内核加载:内核检测硬件并挂载根文件系统。
4.init/systemd:启动init进程或systemd,加载用户空间的服务。
5.系统初始化:启动各类服务、守护进程,并进入指定的运行级别。
6.用户登录:显示登录界面,用户登录后进入系统。
十三、Linux安全技术
1.SSH服务
SSH(Secure Shell)服务是一种加密的网络协议,用于在不安全的网络中安全地访问和管理远程服务器。SSH 服务广泛应用于 Linux 和其他类 Unix 操作系统中,以安全的方式进行远程登录、命令执行和文件传输。
SSH 服务的主要功能
1.远程登录:通过加密连接,用户可以在远程机器上执行命令,类似于在本地计算机上操作。
2.安全文件传输:使用 SCP(Secure Copy Protocol)或 SFTP(SSH File Transfer Protocol)传输文件,确保文件 在传输过程中通过加密保护,防止数据泄露或篡改。
3.端口转发:通过 SSH 隧道可以安全地访问远程网络服务(如数据库、Web 服务),这被称为“端口转发”或“SSH 隧道”。
4.命令执行:可以通过 SSH 在远程服务器上执行单个命令而无需完全登录,例如:ssh user@server "ls -al"。
SSH 使用客户端-服务器模型工作,客户端向运行 SSH 守护进程(sshd)的服务器发起连接。双方通过加密密钥交换、身份验证机制以及数据加密来保证通信的安全性。
SSH 服务的工作原理
1.加密:SSH 使用对称加密、非对称加密和哈希函数相结合的方式,确保数据在传输过程中的保密性和完整性。
2.身份验证:支持基于密码、基于密钥、基于证书等多种身份验证方式。最常见的是基于密钥的验证方式,通过公钥和私钥来进行用户身份认证。
3.数据完整性:通过加密和校验码(MAC)来确保数据在传输过程中不会被篡改。
SSH 服务的组件
SSH 服务的组件
sshd(SSH Daemon):服务器端守护进程,负责监听客户端连接,执行身份验证,并与客户端建立加密会话。
ssh:客户端工具,用于连接远程服务器,执行命令或传输文件。
scp:基于SSH 的安全文件拷贝工具,用于在客户端和服务器之间传输文件。
sftp:基于SSH 的文件传输协议,类似 FTP,但通过 SSH 加密。
ssh-keygen:用于生成SSH 密钥对(公钥和私钥)的工具。
SSH 服务为 Linux 和其他类 Unix 系统提供了一种安全的远程管理方式,结合加密、身份验证和数据完整性保护。通过 SSH,管理员可以安全地远程登录、执行命令和传输文件,并通过合理配置和加强安全措施,确保系统的安全性。
2.基于key验证
Linux 基于密钥的验证是一种安全的身份验证方式,通常用于远程登录(例如通过 SSH),不需要输入密码,而是通过一对密钥来认证用户身份。它比传统的基于密码的身份验证更安全,因为密钥验证不仅避免了密码被暴力破解的风险,还支持更强的加密。
密钥对的组成
公钥(Public Key):放置在远程服务器上,允许持有相应私钥的用户登录。
私钥(Private Key):保存在用户的本地计算机上,应该严格保密。
密钥认证的工作原理
当用户尝试通过 SSH 连接到服务器时,客户端会使用本地的私钥签名一次性随机生成的挑战信息,服务器则使用存储在服务器上的公钥来验证签名的正确性。
如果签名验证通过,则认证成功,用户可以登录到服务器,而无需输入密码。
3.设置linux基于密钥的SSH登录验证
以下步骤展示了如何在 Linux 系统中启用基于 SSH 密钥的验证。
步骤1:生成 SSH 密钥对
在本地主机上生成一对 SSH 密钥(公钥和私钥)。这个过程使用 ssh-keygen 工具完成。
ssh-keygen -t rsa -b 4096
解释:
-t rsa:指定生成 RSA 密钥。
-b 4096:指定密钥的长度为 4096 位(更高的位数意味着更强的加密)。
在提示下,选择是否为密钥设置密码短语(可选,但建议设置以增强安全性)。
生成密钥后,通常会生成两个文件:
~/.ssh/id_rsa:私钥文件,需妥善保管。
~/.ssh/id_rsa.pub:公钥文件,可以安全地共享给服务器。
步骤2:将公钥上传到服务器
使用 ssh-copy-id 命令将公钥上传到远程服务器的 ~/.ssh/authorized_keys 文件中。
ssh-copy-id username@remote_host
解释:
username 是远程服务器的用户名。
remote_host 是远程服务器的 IP 地址或主机名。
注意:ssh-copy-id 命令会自动将本地的公钥 (~/.ssh/id_rsa.pub) 追加到远程服务器的 ~/.ssh/authorized_keys 文件中。
如果 ssh-copy-id 命令不可用,可以手动将公钥上传到服务器:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
步骤3:设置权限
为了保证 SSH 密钥验证的正常工作,远程服务器上相关文件和目录的权限需要正确设置。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
~/.ssh 目录权限应该是 700(只有用户自己可以访问)。
~/.ssh/authorized_keys 文件权限应该是 600(只有用户自己可以读写)。
步骤4:配置 SSH 服务器(可选)
确保服务器的 SSH 配置文件 /etc/ssh/sshd_config 中启用了基于密钥的验证。
sudo nano /etc/ssh/sshd_config
查找以下配置项,并确保它们未被注释(去掉 #)且已正确设置:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
为了禁用基于密码的登录(进一步提高安全性),可以禁用 PasswordAuthentication:
PasswordAuthentication no
保存并退出后,重启 SSH 服务以应用更改:
sudo systemctl restart sshd
步骤5:使用密钥登录
现在,用户可以通过 SSH 登录到服务器,而无需输入密码:
ssh username@remote_host
如果为私钥设置了密码短语,则会在登录时提示输入短语。否则,用户将直接登录。
密钥验证的优势
更高的安全性:密钥验证比传统的密码验证更加安全。由于私钥从不离开用户本地系统,攻击者无法通过网络嗅探截取密码。
方便性:不需要输入密码,每次登录更加快速。
灵活性:可以为不同的服务器配置不同的密钥,也可以将同一个公钥分发到多个服务器。
Linux 基于密钥的验证方式为系统管理员提供了一种更安全的远程登录方法。通过使用密钥对,用户可以避免使用容易暴露的密码,同时提高系统的安全性。结合其他安全措施(如禁用密码登录、设置 passphrase 和使用 ssh-agent),可以构建一个更强大的安全防护体系。
4.sudo机制
sudo(Superuser Do)机制是 Linux 和 Unix 系统中的一种权限管理工具,允许普通用户临时获得超级用户(root)权限来执行系统管理命令。它通过控制和限制权限的使用,提高了系统安全性,同时避免了直接使用 root 账户进行操作。
sudo 的基本功能
1.执行特权命令:普通用户可以使用 sudo 运行需要 root 权限的命令,而无需登录为 root。
2.权限控制:sudo 可以通过配置文件来精确控制哪些用户能够运行哪些命令,细化权限管理。
3.提高安全性:与直接使用 root 登录相比,sudo 限制了 root 权限的滥用。它还提供了操作日志功能,记录了哪些用户执行了哪些命令,方便审计。
sudo使用
典型的 sudo 命令格式如下:
sudo <command>
sudo 的使用
1.密码验证:第一次使用 sudo 时,系统会提示输入用户的密码,而不是 root 密码。验证通过后的一段时间内(默认 15 分钟),用户无需再次输入密码。
2.执行单个命令:sudo 只赋予执行该命令的临时 root 权限,而不会像 su 一样完全切换到 root 环境。
sudoers 配置文件
sudo 的行为由 /etc/sudoers 文件控制,该文件定义了哪些用户或用户组能够运行哪些命令,以及在执行这些命令时是否需要密码。
编辑 sudoers 文件:为了安全起见,不能直接使用文本编辑器编辑 /etc/sudoers 文件,应该使用 visudo 工具来编辑,防止文件损坏。
sudo visudo
sudoers 文件语法:
用户权限条目格式:
user ALL=(ALL:ALL) ALL
解释:
第一个ALL:表示允许从任意主机上运行。
第二个ALL:表示可以以任何用户身份运行命令。
第三个ALL:表示可以以任何组的权限运行。
最后一个ALL:表示允许执行任何命令。
示例配置:
允许用户 john 运行所有命令:
john ALL=(ALL:ALL) ALL
允许用户 alice 运行特定命令,不需输入密码:
alice ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade
sudo 与 su 的区别
sudo与su的区别
sudo:让普通用户在需要时临时获得root权限,用户只需输入自己的密码。
sudo只授予执行特定命令的权限,不切换用户环境。
su:要求输入root密码,并将当前会话完全切换为root环境。
su 赋予的权限更广泛,但风险也更高,因为用户可以执行任意 root 命令。
十四、DNS域名系统
DNS(Domain Name System,域名系统)是互联网的基础服务之一,用于将人类可读的域名(如 www.example.com)转换为计算机可识别的 IP 地址(如 192.0.2.1)。DNS 系统通过分布式数据库的方式将域名映射到相应的 IP 地址,使用户可以通过域名访问网站或其他网络服务,而不需要记住复杂的 IP 地址。
1.DNS的基本功能
DNS的基本功能
1.域名到 IP 地址的解析:将用户输入的域名转换为对应的 IP 地址,以便用户通过域名访问网站或服务器。
2.反向解析:将 IP 地址转换为域名,有助于检查域名的合法性或追踪网络请求的来源。
3.分布式管理:DNS 由多个服务器组成,不依赖于单一的中央服务器,确保了系统的稳定性和可扩展性。
2.DNS解析的工作流程
DNS解析的过程可以分为以下几步:
1.用户查询:
用户在浏览器中输入一个 URL,比如 www.example.com,然后发起 DNS 请求以获取其 IP 地址。
2.本地缓存查询:
首先,操作系统或浏览器会检查本地是否缓存了这个域名对应的 IP 地址。如果缓存存在且未过期,则直接返回结果。
3.递归查询:
如果本地缓存中没有该记录,DNS 客户端(通常是操作系统中的 DNS 解析器)会向配置的递归 DNS 服务器发起查询。
递归 DNS 服务器:递归服务器会递归地查询其他 DNS 服务器,直到找到最终的 IP 地址。它首先会检查自身缓存,如果没有,则会继续向上层 DNS 服务器请求。
4.根域名服务器查询:
递归服务器首先向 根域名服务器 查询,根服务器返回对应的 顶级域名服务器(TLD Server) 的地址,例如 .com 的服务器。
5.TLD 服务器查询:
递归服务器接着向 .com 服务器查询,TLD 服务器返回负责管理 example.com 的 权威 DNS 服务器 的地址。
6.权威 DNS 服务器查询:
最后,递归服务器向 example.com 的权威 DNS 服务器发送查询请求,权威服务器会返回 www.example.com 的 IP 地址。
7.结果返回:
递归服务器将 IP 地址返回给客户端,客户端缓存此结果,并将 IP 地址传给浏览器,浏览器使用此 IP 地址连接到对应的服务器。
3.DNS记录类型
DNS 系统支持多种类型的记录,不同类型的记录负责不同的功能:
A 记录(Address Record):将域名映射到 IPv4 地址。
AAAA 记录:将域名映射到 IPv6 地址。
CNAME 记录(Canonical Name):将一个域名别名映射到另一个域名。
MX 记录(Mail Exchange):指定接收电子邮件的邮件服务器。
NS 记录(Name Server):指定域名的权威 DNS 服务器。
PTR 记录(Pointer):用于反向 DNS 查找,将 IP 地址映射到域名。
TXT 记录:存储文本数据,通常用于域名所有权验证和安全策略(如 SPF、DKIM)。
4.DNS服务器的类型
DNS 服务器的类型
1.根DNS服务器(Root DNS Servers):
位于 DNS 层级结构的最顶端,负责为全世界的域名解析提供顶级域的查询服务,如 .com、.org。
2.顶级域名服务器(TLD Servers):
负责管理特定的顶级域(如 .com、.net、.org),并指向对应域名的权威 DNS 服务器。
3.权威DNS服务器(Authoritative DNS Servers):
存储某一特定域名的最终 DNS 记录,负责为该域提供 IP 地址等详细信息。
4.递归DNS服务器(Recursive DNS Servers):
接受用户的DNS查询,依次向其他 DNS 服务器查询,最终找到答案并返回给客户端。
5.DNS的缓存机制
为了减少 DNS 查询的频率,提高性能,DNS 实现了缓存机制:
1.浏览器缓存:浏览器会缓存 DNS 解析的结果,避免重复查询相同域名。
2.操作系统缓存:操作系统也会缓存 DNS 解析的结果。
3.递归服务器缓存:递归 DNS 服务器会缓存最近的查询结果,从而为后续的查询提供更快的响应。
每条DNS记录都有一个 TTL(Time To Live),表示缓存数据的有效时长。TTL 过期后,缓存将被清除,必须重新进行 DNS 查询。
6.DNS 安全问题
虽然 DNS 是互联网的重要组成部分,但它也面临一些安全问题:
1.DNS 劫持:攻击者通过篡改 DNS 查询的响应,将用户引导到恶意网站。
2.DNS 缓存污染:攻击者向递归 DNS 服务器注入伪造的 DNS 记录,使后续的用户被错误地引导。
3.DNSSEC(DNS Security Extensions):为了增强 DNS 的安全性,DNSSEC 提供了基于数字签名的验证机制,确保 DNS 记录的真实性和完整性。
十五、Linux防火墙
Linux 防火墙是指用于控制和管理网络流量的安全机制,主要通过允许或阻止数据包在系统网络接口之间传输来保护系统的安全。Linux 系统中的防火墙通常基于 Netfilter 框架,最常使用的工具包括 iptables 和 nftables,它们可以根据定义的规则集来过滤网络流量。
Linux 提供了多种防火墙工具,最常见的是 iptables 和 nftables。
1.防火墙的基本概念
防火墙通过以下方式管理网络流量:
1.包过滤:检查网络数据包的源地址、目的地址、端口号和协议,决定是否允许数据包通过。
2.状态跟踪:现代防火墙具有状态跟踪能力,可以根据数据包的连接状态(如新连接、已建立连接、相关连接等)决定是否允许流量通过。
3.NAT(网络地址转换):将私有 IP 地址映射到公共 IP 地址,隐藏内部网络结构并增强安全性。
2.iptables
iptables 是 Linux 中的传统防火墙工具,用于设置、修改和查看 Netfilter 防火墙规则。它可以通过定义输入(INPUT)、输出(OUTPUT)和转发(FORWARD)链的规则来管理流量。
iptables 基本链:
INPUT:控制进入本地系统的数据包。
OUTPUT:控制从本地系统发送的数据包。
FORWARD:控制流经本地系统但不属于本地系统的数据包(用于路由情况)。
iptables 规则示例:
允许 SSH 访问(端口 22):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
拒绝所有其他入站流量:
sudo iptables -P INPUT DROP
3.nftables
nftables 是 iptables 的替代品,设计更加简洁和高效,统一了多种协议的规则管理。它使用 nft 命令来配置规则集,并支持复杂的规则编写。
nftables 规则示例:
创建一个简单的防火墙规则,允许 HTTP 和 SSH 流量:
sudo nft add rule ip filter input tcp dport { 22, 80 } accept
4.防火墙的规则和表
防火墙的规则按优先级顺序执行,规则会匹配进入、通过或离开网络的数据包。
iptables 和 nftables 中的规则通常划分在不同的表中,
每个表都有其特定的用途:
filter 表:默认表,主要用于允许或拒绝数据包。
nat 表:用于修改数据包的源或目的地址,通常用于网络地址转换(NAT)。
mangle 表:用于修改数据包的其他字段,如 TTL(生存时间)。
raw 表:用于配置数据包的处理方式,常用于状态跟踪之外的处理。
5.防火墙的状态检测
Linux 防火墙支持状态检测,可以跟踪连接的状态并对数据包进行智能处理:
NEW:新连接的数据包。
ESTABLISHED:已经建立连接的数据包。
RELATED:与已建立连接相关的数据包(例如,FTP 数据流)。
INVALID:不符合任何连接状态的数据包,通常应被丢弃。
示例:允许所有已建立连接的数据包通过:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
6.防火墙的策略
防火墙的默认策略可以设为:
DROP:丢弃所有不符合规则的数据包。
ACCEPT:允许所有不符合规则的数据包。
示例:设置默认策略为拒绝所有流量:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
7.防火墙的高级功能
防火墙的高级功能
端口转发:通过 nat 表,可以实现端口转发,将外部网络流量转发到内网服务器。
拒绝和丢弃:防火墙可以明确拒绝某些类型的流量,返回拒绝响应,或者静默丢弃,提升网络安全。
日志记录:防火墙可以记录匹配规则的流量,方便管理员进行审计和分析。
示例:记录所有丢弃的数据包:
sudo iptables -A INPUT -j LOG --log-prefix "Dropped packet: "
Linux 防火墙是基于 Netfilter 框架的网络安全机制,iptables 和 nftables 是其主要工具,用于定义规则来过滤、转发和修改数据包。它通过细粒度的规则控制系统的网络流量,保护系统免受外部威胁,同时支持 NAT、状态跟踪和日志记录等高级功能。
十六、Linux日志服务管理
Linux 日志服务管理是指在 Linux 系统中收集、存储、管理和分析系统及应用程序的日志信息。日志服务对于排查故障、监控系统状态和安全审计至关重要。Linux 系统中的日志管理工具包括 syslog、rsyslog、journald 等。
1.日志服务概述
日志服务主要负责:
1.记录事件:捕获系统内核、服务和应用程序产生的事件,并将它们存储在日志文件中。
2.分类存储:将不同类型的日志信息分类存储在不同的日志文件中,如系统日志、内核日志、安全日志等。
3.日志轮替:定期管理日志文件,防止日志文件过大影响系统性能。
4.日志分析:为管理员提供日志的集中管理和分析工具,便于故障排查和系统监控。
2.常见日志服务工具syslog/rsyslog/journald
syslog
syslog 是最早的日志系统,提供了一种标准化的方式将系统产生的日志信息传输到集中式日志服务器。它根据 设施(facility) 和 优先级(priority) 将日志分类。
rsyslog
rsyslog 是 syslog 的增强版,提供了更强大的功能:
1.支持 TCP 和加密传输:使日志可以安全地通过网络传输。
2.灵活的日志过滤和路由:支持复杂的日志路由和过滤规则。
3.日志格式化和数据库支持:可将日志写入文件、数据库或远程服务器。
rsyslog 是现代 Linux 发行版中最常见的日志服务管理工具。
journald
journald 是 systemd 系统的一部分,提供了二进制格式的日志系统。与 rsyslog 不同,它直接与 systemd 服务管理集成,具有以下特点:
1.二进制格式存储:通过更高效的二进制格式存储日志。
2.统一管理:将所有日志,包括内核、应用程序和系统服务日志集中到一个地方。
3.持久化和过滤:支持日志持久化到磁盘,以及使用 journalctl 进行日志查询和过滤。
3.日志存储位置
Linux 系统中的日志文件通常存储在 /var/log 目录下,不同服务和应用的日志存储在各自的文件中,常见的日志文件包括:
/var/log/syslog 或 /var/log/messages:系统日志文件,记录通用系统信息。
/var/log/auth.log:认证日志,记录用户登录、sudo 命令等信息。
/var/log/kern.log:内核日志,记录内核级别的事件。
/var/log/boot.log:系统启动日志,记录系统启动过程中发生的事件。
/var/log/cron.log:任务计划日志,记录 cron 任务执行情况。
4.日志级别
Linux 日志通常有不同的优先级级别,用于标识事件的严重性,典型日志级别如下(从高到低):
emerg:系统不可用,紧急事件。
alert:必须立即采取行动的事件。
crit:严重的条件错误。
err:错误事件。
warning:警告信息。
notice:正常但重要的事件。
info:普通的消息,表示系统正常运行。
debug:调试信息。
5.日志管理命令
rsyslog 配置
rsyslog 的配置文件通常位于 /etc/rsyslog.conf,通过规则可以指定不同服务或优先级的日志输出到特定文件中。
示例:将所有的错误日志保存到 /var/log/error.log:
*.err /var/log/error.log
journalctl
journalctl 是 systemd 提供的工具,用于管理和查询 journald 产生的日志。常用的 journalctl 命令:
查看所有日志:
journalctl
查看某个服务的日志:
journalctl -u nginx
查看系统启动日志:
journalctl -b
6.日志轮替(Log Rotation)
日志文件会随着时间增长,使用 logrotate 工具可以定期轮换、压缩和删除旧日志文件,以防日志占用过多磁盘空间。
logrotate 的配置文件通常位于 /etc/logrotate.conf 或 /etc/logrotate.d/,它通过设置规则来管理日志文件的轮替频率和方式。
示例:每周轮换 /var/log/syslog 文件,并保留 4 周的历史记录:
/var/log/syslog {
weekly
rotate 4
compress
missingok
notifempty
}
Linux 日志服务管理通过 syslog、rsyslog 和 journald 等工具来实现对系统和应用日志的收集、存储和分析。管理员可以通过日志文件排查系统问题、监控服务运行状态,并通过 logrotate 实现日志轮替管理,防止日志文件占用过多存储。日志管理对于系统故障排查和安全审计至关重要。