Shell编程详解
文章目录
- 一、Linux系统结构
- 二、Shell介绍
- 1、Shell简介
- 2、Shell种类
- 3、Shell查询和切换
- 三、Shell基础语法
- 1、注释
- 2、本地变量
- 3、环境变量
- 3.1、查看环境变量
- 3.2、临时设置环境变量
- 3.3、永久设置环境变量
- 4、特殊变量
- 5、控制语句
- 5.1、shell中的中括号
- 5.2、if语句
- 5.3、for循环
- 5.4、while循环
- 5.5、until循环
- 5.6、break和continue语句
- 6、函数
- 6.1、函数的定义和调用
- 6.2、带参数的函数
- 6.3、将函数定义在 Shell 配置文件中
- 7、重启springboot项目脚本
- 四、Shell的执行方式
- 1、使用指定Shell解释器
- 2、使用chmod赋执行权限后运行
- 3、使用当前Shell解释器
- 4、将脚本放入系统PATH
一、Linux系统结构
Linux操作系统是一种开放源代码的类UNIX操作系统,它的结构分为内核、Shell和应用程序三个层次。
- 内核层
- 内核是Linux系统的核心部分,它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务
- Linux内核设计了良好的模块化结构,可以动态地加载和卸载内核模块,这使得内核可以兼容各种不同的硬件设备和外围设备
- Shell层
- Shell是Linux系统的
命令行解释器,它负责将用户输入的命令解释并执行 - Linux系统上有多种Shell,其中最常用的是
Bash Shell - Bash Shell 提供了各种丰富的功能和处理能力,如通配符、重定向、管道、变量等等
- Shell是Linux系统的
- 应用层
- 应用层是Linux系统上的各种应用程序和服务,包括文本编辑器、图形界面、Web服务器、邮件服务器、数据库服务器等
- 在Linux系统中,应用程序通常以开放源代码方式呈现,用户可以自由学习和使用,也可以根据需求自己编写、修改或扩展

二、Shell介绍
1、Shell简介
- Shell被翻译为“壳”。在Linux内核外面包了一个壳
- Shell是一种用于与操作系统进行交互的
命令行解释器 - 它是一种
脚本语言,可以通过编写一系列的命令和脚本来执行操作系统的功能和任务 - 我们在终端中编写的命令都是Shell命令。例如:ls、grep…等
2、Shell种类
Bourne Shell(/bin/sh):是Unix系统最早的shell程序,由史蒂夫·伯恩斯(Steve Bourne)编写。该shell程序是许多Linux发行版中默认使用的程序Bourne-Again SHell(/bin/bash):是GNU项目的一部分,是Bourne Shell的增强版,目前在大部分Linux发行版中是默认的shell程序C Shell (/bin/csh):是Bill Joy编写的一个具有面向对象设计理念的shell程序,它采用与C语言相似的语法和控制结构。C Shell中的命令提示符为%号TENEX C Shell(/bin/tcsh):是C Shell的增强版,它对历史命令和别名等方面进行了改进,同时也支持C Shell中的所有特性。TENEX C Shell中的命令提示符也为%号Korn Shell(/bin/ksh):是由David Korn编写的shell程序,它是Bourne Shell和C Shell的结合,拥有两种不同的工作模式:交互模式和批处理模式Z Shell(/bin/zsh):是一个功能强大的shell程序,它是Bourne Shell的增强版,具有缩写、自动完成、句法高亮等功能,同时也支持Korn Shell、C Shell以及Bourne Shell的语法和命令
每种Shell都有其特定的语法和功能,但它们通常都具有共同的基本功能,如变量操作、条件语句、循环语句和命令执行等。
3、Shell查询和切换
-
查看已安装的Shell
cat /etc/shells
-
查看当前Shell(查看
$SHELL环境变量)echo $SHELL
-
更改Shell(需要
重启服务)chsh -s /bin/sh
三、Shell基础语法
- shell脚本可以编写在一个
xxx.sh结尾的文件中,xxx.sh文件我们称为shell脚本文件 - shell脚本文件是一个
可执行文件,类似于windows环境中的xxx.exe或xxx.bat等文件
1、注释
在Shell脚本中,注释是用来解释代码的内容,Shell脚本中的注释使用#符号表示,任何在#后面的内容都会被Shell解释器忽略。
-
单行注释(用
#开头的内容作为注释)# 这是一个单行注释 echo "Hello, World!" # 这也是一个注释echo命令用于在终端上输出文本或变量的值,主要用于显示信息或调试脚本
-
多行注释(可以通过连续的
#来实现多行注释)# 这是一个多行注释 # 它可以扩展到 # 多行也可以用以下形式:
: ' 这是一个多行注释 它使用 : 和单引号来包裹 解释器会忽略这些内容 '
示例
- 一个简单的脚本文件
#!/bin/bash在 Shell 脚本的第一行,表示该脚本应该用哪个解释器运行可以省略,如果省略会使用当前会话的默认shell解释器#!/bin/bash # 打印 "Hello, World!" echo "Hello, World!"- 查看文件权限(默认没有执行权限)

- 修文件权限(添加执行权限)
chmod +x script.sh # 或者 chmod 744 script.sh - 执行文件
./script.sh
2、本地变量
本地变量是指在某个脚本或函数的作用范围内定义的变量,只能在该作用范围内访问。本地变量的生命周期仅限于创建它的脚本或函数,执行完毕后,变量会自动销毁
本地变量命名规则
- 变量名由
字母、数字和下划线组成(字母一般是小写,环境变量用大写) - 不能以数字开头
- 区分大小写
- 等号两侧不能有空格
- 不能使用特殊字符作为变量名,如$、&、!、*等
示例
双引号允许引用变量,变量会被解析单引号不会解析变量,原样输出
#!/bin/bash
name="Alice"echo "Hello, $name" # 输出:Hello, Alice
echo 'Hello, $name' # 输出:Hello, $name
3、环境变量
- 环境变量是一个包含键值对的变量,键(变量名)和值共同保存
系统配置信息或用户定义的信息 - 环境变量一般是
全部大写,单词和单词之间采用下划线分割。如:0JAVA_HOME, CATALINA_HOME - 环境变量是在
Shell会话外设置的,可以由多个脚本和进程共享
常见的环境变量
| 变量名 | 说明 |
|---|---|
PATH | 指定系统查找可执行文件的路径(如/usr/bin:/bin:/usr/local/bin) |
HOME | 当前用户的主目录路径(如/root) |
USER | 当前用户名(如root) |
PWD | 当前工作目录路径(如/root/test) |
SHELL | 当前用户使用的默认 Shell(如/bin/bash) |
LANG | 系统语言和字符编码信息(如 en_US.UTF-8) |
TERM | 当前终端的类型(如xterm-256color) |
LOGNAME | 当前登录的用户名(如root) |
3.1、查看环境变量
-
查看当前所有环境变量
printenv # 或者 env
-
查看或使用某个环境变量(使用环境变量,在变量名称前必须加上
$符号)echo $PATH
-
在脚本中直接访问环境变量
#!/bin/bash echo "当前用户是:$USER" echo "主目录是:$HOME"
3.2、临时设置环境变量
- 临时设置的环境变量只在
当前会话中有效,会话结束后失效 - 使用
export设置环境变量
基本语法
export 变量名=值
示例:
export MY_VAR="Hello World"
echo $MY_VAR
环境变量中多个值使用:分隔符
export CLASSPATH=/lib:/usr/lib:/home/user/myapp/lib# 通过 PATH 的已有值加上新路径
export PATH=$PATH:/new/path
3.3、永久设置环境变量
- 要使环境变量在每次系统启动后都生效,需要将其添加到
配置文件中
添加到
用户配置文件
- 将环境变量添加到
~/.bashrc或~/.bash_profile中(针对 Bash Shell)export JAVA_HOME=/usr/local/java/jdk1.8.0_371 export PATH=$JAVA_HOME/bin:$PATH - 重新加载配置文件
source ~/.bashrc
添加到系统
全局配置文件
- 将环境变量添加到
/etc/profile中(对所有用户生效)export JAVA_HOME=/usr/local/java/jdk1.8.0_371 export PATH=$JAVA_HOME/bin:$PATH - 重新加载配置文件
source /etc/profile
4、特殊变量
- 特殊变量是在Shell中
预定义的变量名称,具有特殊的含义
常见特殊变量
$0: 当前脚本的文件名$1, $2...: 脚本参数列表中的第1个、第2个参数等等- 如:./first.sh abc def,在执行这个脚本时,第一个参数abc,第二个参数def
$#: 脚本参数的数量$*: 所有脚本参数的列表- 将所有的参数作为一个字符串:“a b c”
$@: 所有脚本参数的列表- 将每一个参数作为一个独立的字符串:“a” “b” “c”
$$: 当前脚本的进程ID号$?: 上一个命令的退出状态,一个数值- 0表示成功,其他值表示失败
$!:后台运行的最后一个进程的进程ID
本地变量命名规则
- 创建脚本
script.sh
#!/bin/bash# 脚本名
echo "脚本名称: $0"# 参数个数
echo "参数总数: $#"# 打印所有参数
echo "所有参数 (\$@): $@"
echo "所有参数 (\$*): $*"# 第一个和第二个参数
echo "第一个参数: $1"
echo "第二个参数: $2"# 当前脚本的 PID
echo "当前脚本的 PID: $$"# 执行一个后台命令
sleep 5 &
echo "最后一个后台进程的 PID: $!"# 判断上一个命令是否执行成功
echo "上一个命令执行成功 (返回值: $?)"# 执行一个错误命令测试返回值
ls /nonexistent/path &>/dev/null
echo "错误命令返回非零值 (返回值: $?)"
- 以
./script.sh arg1 arg2 arg3运行脚本,输出如下:

5、控制语句
5.1、shell中的中括号
- 用于比较操作符:用于比较两个值的大小或者判断两个值是否相等
-eq: 等于,例如[ $a -eq $b ]-ne: 不等于,例如[ $a -ne $b ]-lt: 小于,例如[ $a -lt $b ]-gt: 大于,例如[ $a -gt $b ]-le: 小于等于,例如[ $a -le $b ]-ge: 大于等于,例如[ $a -ge $b ]
- 用于测试表达式:用于测试某个表达式是否成立
-f: 判断某个文件是否存在且是一个文件,例如[ -f file.txt ]-d: 判断某个文件是否存在且是一个目录,例如[ -d dir ]-z: 判断某个字符串是否为空,例如[ -z “$str” ]-n: 判断某个字符串是否非空,例如[ -n “$str” ]-e: 判断某个文件或目录是否存在,例如[ -e file.txt ]- 测试表达式可以用中括号[]或者
test命令实现,例如:test -f file.txt等价于[ -f file.txt ]
- 要注意两个值之间必须有空格分隔,否则会出现语法错误
5.2、if语句
基本语法
if condition
thencommand1command2...
elif condition2
thencommand3command4...
elsecommand5command6...
fi
示例:
#!/bin/bashif [ -f file.txt ]
thenecho "file.txt文件存在"
elif [ -d dir ]
thenecho "dir目录存在"
elseecho "file.txt and dir都没找到"
fi
5.3、for循环
基本语法
for var in list
docommand1command2...
done
其中,var是一个临时的变量名,用于存储当前循环的值,list是一个值或者多个带有空格或换行符分隔的值组成的列表。
示例:
#!/bin/bashfor i in 1 2 3 4 5
doecho "The value of i is: $i"
done
5.4、while循环
基本语法
while condition
docommand1command2...
done
在shell编程中$((...))被称为算术扩展运算符,做数学运算的,并且将运算结果返回。$(...)运算符会将结果直接返回
示例:
#!/bin/bashj=0
while [ $j -lt 5 ]
doecho "The value of j is: $j"j=$((j+1))
done
5.5、until循环
until循环用于不断执行语句块,直到满足指定条件为止。和while循环相反,while是直到指定条件为假时才会停止循环。
基本语法
until condition
docommand1command2...
done
示例:
#!/bin/bashk=0
until [ $k -ge 5 ]
doecho "The value of k is: $k"k=$((k+1))
done
5.6、break和continue语句
break语句用于跳出当前循环块,例如在for循环和while循环中使用该语句时,可以跳出当前循环并停止迭代。
continue语句用于跳过本次循环迭代,直接进入下一次的迭代。
示例:
#!/bin/bashfor l in 1 2 3 4 5
doif [ $l -eq 3 ] thencontinuefiecho "The value of l is: $l"if [ $l -eq 4 ] thenbreakfi
done
输出结果(等于3跳过,等于4跳出循环结束)
1
2
6、函数
在Shell脚本中,函数是一种封装代码的方式,可以提高代码的重用性和可读性。
6.1、函数的定义和调用
基本语法
function_name() {# 函数体:执行的命令或脚本
}
或者:
function function_name() {# 函数体:执行的命令或脚本
}
示例
say_hello() {echo "Hello, World!"
}# 调用函数
say_hello
6.2、带参数的函数
函数可以通过位置参数($1, $2, …)接收输入参数,类似于脚本中的参数。
示例
greet() {echo "Hello, $1! Welcome to $2."
}# 调用函数并传递参数
greet "Alice" "Linux"
说明:
$1表示第一个参数,$2表示第二个参数,以此类推- 参数之间用
空格分隔
6.3、将函数定义在 Shell 配置文件中
如果希望在 任何地方都可以调用函数,可以将函数定义放入Shell的配置文件中,例如~/.bashrc或~/.zshrc。
方法
- 编辑 ~/.bashrc(或 ~/.zshrc),添加函数定义
greet() {echo "Hello, $1!" } - 保存文件后,运行以下命令重新加载配置
source ~/.bashrc - 现在,你可以在任何命令行终端调用该函数
greet "Alice"
7、重启springboot项目脚本
# 1. 定义服务端口
port=1514# 2. 查找并杀掉正在运行的进程
pid=$(lsof -t -i:$port)
if [ -n "$pid" ]; thenecho "杀掉$port端口进程"kill -9 $pid
elseecho "没有端口为$port的进程"
fi# 3. 启动新进程
cd /data/java
nohup java -jar my-springboot.jar > /data/log/boot.log 2>&1 &echo "$port端口的服务已重启"
四、Shell的执行方式
在Linux系统中,运行Shell脚本(如 .sh 文件)有多种方式。以下是常见的几种执行方式及它们的区别。
1、使用指定Shell解释器
基本语法
sh script.sh
或者
bash script.sh
特点
- 使用指定的Shell解释器运行脚本(如
sh或bash) - 无需给脚本赋
执行权限,只要有读权限即可
2、使用chmod赋执行权限后运行
步骤
- 给脚本赋执行权限
chmod +x script.sh - 直接运行脚本
或者./script.sh完整路径/path/to/script.sh
特点
- 根据脚本开头
#!/bin/bash解释器运行,如果没有使用当前Shell默认解释器 - 必须给脚本文件赋予
执行权限
3、使用当前Shell解释器
语法
. script.sh
或者
source script.sh
特点
- 使用当前Shell默认的解释器
- 脚本在当前Shell环境中运行,不会启动新的子Shell
- 脚本中的变量和修改会直接影响当前Shell环境
- 无需给脚本赋
执行权限,只要有读权限即可
4、将脚本放入系统PATH
如果希望脚本在任何地方都可以运行,可以将脚本文件放入$PATH中的目录(如/usr/local/bin或~/bin)
示例
- 将脚本移动到系统目录
mv script.sh /usr/local/bin - 确保脚本可执行
chmod +x /usr/local/bin/script.sh - 直接调用脚本
script.sh
相关文章:
Shell编程详解
文章目录 一、Linux系统结构二、Shell介绍1、Shell简介2、Shell种类3、Shell查询和切换 三、Shell基础语法1、注释2、本地变量3、环境变量3.1、查看环境变量3.2、临时设置环境变量3.3、永久设置环境变量 4、特殊变量5、控制语句5.1、shell中的中括号5.2、if语句5.3、for循环5.4…...
跨站脚本攻击(XSS)详解
跨站脚本攻击(XSS)详解 跨站脚本攻击(XSS,Cross-Site Scripting)是一种通过在网页中注入恶意脚本,攻击用户浏览器的漏洞。攻击者可以利用XSS窃取用户敏感信息、劫持会话、或在受害者浏览器中执行恶意操作。…...
03-QT中的QMainWindow+对话框QDialog
文章目录 1.QMainWindow1.1菜单栏1.2 工具栏1.3 状态栏1.4 铆接部件1.5 核心部件(中心部件)1.6 资源文件 2.对话框2.1 基本概念2.2 标准对话框2.3 自定义消息框2.4 消息对话框2.5 标准文件对话框 1.QMainWindow QMainWindow是一个为用户提供主窗口程序的…...
c# 中Parallel.ForEach 对其中一个变量进行赋值 引发报错
在 C# 中使用 Parallel.ForEach 方法时,如果你尝试在并行循环中对共享变量进行赋值,很可能会遇到线程安全问题或竞争条件(race conditions),这可能导致数据不一致、程序崩溃或其他不可预测的行为。 问题描述 假设你有…...
ElasticSearch备考 -- 整体脉络梳理
1、 search 、Update、reindex ElasticSearch 备考 -- 查询&高亮&排序 ElasticSearch 备考 -- 聚合查询 ElasticSearch 备考 -- 异步检索 2、search temple ElasticSearch备考 -- Search template 3、custom analyzer ElasticSearch 备考 -- 自定义分词 2、…...
vue Element Ui Upload 上传 点击一个按钮,选择多个文件后直接上传,使用防抖解决多次上传的问题。
问题: 在使用Element Ui Upload 上传文件时,选择多个文件上传时,on-change事件会一个一个返回上传的文件,导致前端不知道什么时候可以拿到全部上传的文件,再一起调后台接口。 解决方法: 上传文件后&…...
【HF设计模式】05-单例模式
声明:仅为个人学习总结,还请批判性查看,如有不同观点,欢迎交流。 摘要 《Head First设计模式》第5章笔记:结合示例应用和代码,介绍单例模式,包括遇到的问题、采用的解决方案、以及达到的效果。…...
运维人员的Python详细学习路线
以下是一条适合运维人员的Python详细学习路线: 一、基础入门阶段(第1 - 2个月) 环境搭建与基础语法(第1个月) 安装与配置 在运维常用的操作系统(如Linux或Windows)上安装Python。对于Linux系统…...
软件体系结构与设计模式
在软件开发中,软件体系结构和设计模式是两个至关重要的概念。它们帮助开发者设计出易于理解、可扩展、可维护的系统。尽管这两个概念密切相关,但它们分别关注系统的不同方面:软件体系结构关注的是系统整体结构的设计,而设计模式则…...
安徽省地图arcgis数据美化后mxd文件shp格式下载后内容测评
标题中的“安徽省地图arcgis数据美化后mxd文件shp格式”揭示了这个压缩包的内容是经过GIS处理的、针对安徽省地图数据。ArcGIS是一款由Esri公司开发的专业地理信息系统软件,用于处理、分析和展示地理空间数据。MXD文件是ArcGIS的项目文件,包含了地图布局…...
MySQL数据库备份与恢复策略
数据是企业和应用的核心资产,可靠的备份和恢复策略是确保数据安全性和业务连续性的关键。在本篇文章中,我们将详细介绍 MySQL 数据库的备份和恢复方法,包括逻辑备份、物理备份、自动化备份,以及常见问题的处理方法。 一、逻辑备份 逻辑备份是通过导出数据库的结构和数据生…...
go语言zero框架中教务crm系统的在职继承和离职交接的设计与实践
在GoZero中实现一个在职继承和离职交接的通用模块,涉及到顾问离职交接客户、领导离职交接审批单据等功能。为了使这个模块通用且易于扩展,我们可以分成几个部分: 1. **数据模型设计**:我们首先需要设计离职交接相关的数据模型。 …...
C# 设计模式(结构型模式):桥接模式
C# 设计模式(结构型模式):桥接模式 在软件设计中,我们经常会遇到系统的变化频繁,或者需要灵活扩展功能的场景。这时,桥接模式(Bridge Pattern)便显得尤为重要。桥接模式是一个结构型…...
C# 设计模式(行为型模式):解释器模式
C# 设计模式(行为型模式):解释器模式 (Interpreter Pattern) 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义一种语言的语法表示,并提供一个解释…...
如何 cURL Elasticsearch:进入 Shell
作者:来自 Elastic Philipp Krenn Kibana 的控制台是开始使用 Elasticsearch 的 REST API 的最简单方法 - 语法突出显示、自动完成、格式化、导出 cURL、JavaScript 或 Python。而且你不必担心正确的端点、身份验证等。但是有时,如果 Kibana 不可用、你…...
深信服云桌面系统的终端安全准入设置
深信服的云桌面系统在默认状态下没有终端的安全准入设置,这也意味着同样的虚拟机,使用云桌面终端或者桌面套件都可以登录,但这也给系统带来了一些安全隐患,所以,一般情况下需要设置终端的安全准入策略,防止…...
Node.js 模块系统
Node.js 模块系统 1. 引言 Node.js,作为一个轻量级、高效的服务器端 JavaScript 运行环境,其模块系统是其最核心的特性之一。Node.js 的模块系统允许开发者将代码组织成多个文件,每个文件都是一个模块,这样可以提高代码的可维护性和可重用性。本文将详细介绍 Node.js 的模…...
数据结构知识收集尊享版(迅速了解回顾相关知识)
1、单链表、循环链表、双向链表,存储、逻辑结构 单链表、循环链表和双向链表都是线性表的链式存储结构,它们在存储和逻辑结构上有一些共同点和不同点。 存储结构 单链表:每个节点包含一个数据域和一个指针域,指针域指向下一个节…...
SpringMVC启动与请求处理流程解析
目录 SpringMVC的基本结构 1.MVC简介 2.基本结构 什么是Handler? 什么是HandlerMapping? 什么是HandlerAdapter? RequestMapping方法参数解析 DispatcherServlet的init()方法 DispatcherServlet的doService()方法 SpringBoot整合SpringMVC …...
C++ 日志库 spdlog 使用教程
Spdlog是一个快速、异步、线程安全的C日志库,他可以方便地记录应用程序的运行状态,并提供多种输出格式。官网:https://github.com/gabime/spdlog 安装教程可以参考:https://blog.csdn.net/Harrytsz/article/details/144887297 S…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
