while read line
使用while read line和/etc/passwd,计算用户id总和。
[root@centos8 data]#vim uidsum.sh
#!/bin/bash
#********************************************************************
#FileName: uidsum.sh
#Version: 1.0
#Date: 2023-12-26
#Author: wenzi
#Description: This is description
#********************************************************************
while read line;do
uid=`echo $line | awk -F ':' '{print $3}'`
sum=$[$sum+$uid]
done < /etc/passwd
echo $sum
[root@centos8 data]#./uidsum.sh
86662
数组
介绍
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量集合
数组名和索引
- 索引的编号从0开始,属于数值索引
- 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本后支持
- bash的数组支持索引不连续
声明数组
- 普通数组可不事先声明,直接使用
declare -a array_name
- 关联数组必须事先声明,再使用
declare -A array_name
两者不可相互转换
赋值
- 一次只赋值一个元素
array_name[index]=value
week[1]="one"
week[2]="two"
- 一次赋值全部元素
array_name=("var1" "var2" ...)
name=("zhangsan" "lisi" "wangwu")
serial=({1..10})
alpha=({a..z})
file=(*.sh)
- 只赋值特定元素
array_name=([0]="var1" [3]="var2" ...)
[root@centos8 data]#num=({1..10})
[root@centos8 data]#num[${#num[@]}]=11
[root@centos8 data]#echo ${num[*]}
1 2 3 4 5 6 7 8 9 10 11
引用
- 显示所有数组
delcare -a
- 引用特定数组元素
${array_name[index]} 如果省略[index]下标将引用下标为0的元素
[root@centos8 data]#declare -a title=([0]="a" [3]="b" [4]="c")
[root@centos8 data]#echo ${title[3]}
b
[root@centos8 data]#echo ${title}
a
- 引用数组所有元素
${array_name[*]}
${array_name[@]}
查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之,懒惰模式
${var/pattern/substr}
查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之,贪婪模式
${var//pattern/substr}
查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
${var/#pattern/substr}
查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
${var/%pattern/substr}
- 数组长度或数组中元素个数
${#array_name[*]}
${#array_name[@]}
把var中的所有小写字母转换为大写
${var^^}
把var中的所有大写字母转换为小写
${var,,}
- 数组的所有下标
${!array_name[*]}
${!array_name[@]}
[root@centos8 data]#declare -a title=([0]="a" [3]="b" [4]="c")
[root@centos8 data]#echo ${!title[@]}
0 3 4
[root@centos8 data]#echo ${!title[*]}
0 3 4
删除
- 删除数组中某个元素会使索引不连续
unset array_name[index]
[root@centos8 data]#declare -a title=([0]="a" [3]="b" [4]="c")
[root@centos8 data]#unset title[3]
[root@centos8 data]#echo ${title[@]}
a c
- 删除整个数组
unset array_name
[root@centos8 data]#vim fact.sh
#!/bin/bash
#********************************************************************
#FileName: fact.sh
#Version: 1.0
#Date: 2023-12-27
#Author: wenzi
#Description: This is description
#********************************************************************
factorial() {
local number=$1
local result=1
for ((i = 1; i <= number; i++)); do
result=$((result * i))
done
echo $result
}
echo "5的阶乘是: $(factorial 5)"
数组数据处理
${array_name[@]:offset:number}
${array_name[*]:offset:number}
- offset指要跳过的元素个数
- number指取出的元素个数
取出指定偏移量后(跳过几个)的所有元素
${array_name[@]:offset}
${array_name[*]:offset}
[root@centos8 data]#num=({1..10})
[root@centos8 data]#echo ${num[*]}
1 2 3 4 5 6 7 8 9 10
[root@centos8 data]#echo ${num[*]:2:4}
3 4 5 6
[root@centos8 data]#echo ${num[*]:3}
4 5 6 7 8 9 10
向数组中追加元素
array[${array[*]}]=value
array[${array[@]}]=value
#!/bin/bash
# chkconfig: - 96 3
# description: This is test service script
. /etc/init.d/functions
start(){
[ -e /var/lock/subsys/testsrv ] && exit || touch /var/lock/subsys/testsrv
echo $PATH
action "Starting testsrv"
sleep 3
}
stop(){
[ -e /var/lock/subsys/testsrv ] && rm /var/lock/subsys/testsrv || exit
action "Stopping testsrv"
}
status(){
[ -e /var/lock/subsys/testsrv ] && echo "testsrv is running..." || echo "testsrv is stopped"
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 2
esac
变量中字符串的处理
基于偏移量取字符串
返回字符串变量var的字符的长度,一个汉字算一个字符
${#var}
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset}
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var:offset:number}
取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var: -length}
从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var:offset:-length}
先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length前空格,并且length必须大于offset
${var: -length:-offset}
[root@centos8 data]#name="abcdefghijklmn"
[root@centos8 data]#echo ${#name}
14
[root@centos8 data]#echo ${name:3}
defghijklmn
[root@centos8 data]#echo ${name:3:2}
de
[root@centos8 data]#echo ${name: -4}
klmn
[root@centos8 data]#echo ${name:4:-5}
efghi
[root@centos8 data]#echo ${name: -5:-3}
jk
基于模式取子串
[root@wenzi ~]# echo '{print $2}' > cs.awk
[root@wenzi ~]# tail -n 3 /etc/services | awk -f cs.awk
48619/tcp
48619/udp
49000/tcp
[root@centos8 data]#file="var/log/message"
[root@centos8 data]#echo ${file#*/}
log/message
[root@centos8 data]#echo ${file##*/}
message
[root@centos8 ~]#tail -n 3 /etc/services
cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998/tcp # Capture handwritten signatures
[root@centos8 ~]#tail -n 3 /etc/services | awk '{print $2}'
45514/udp
45514/tcp
46998/tcp
[root@centos8 ~]#tail -n 3 /etc/services | awk -F '/' '{print $1}'
cloudcheck-ping 45514
cloudcheck 45514
spremotetablet 46998
[root@centos8 ~]#tail -n 3 /etc/services | awk -F '[/#]' '{print $3}'
ASSIA CloudCheck WiFi Management keepalive
ASSIA CloudCheck WiFi Management System
Capture handwritten signatures
[root@centos8 data]#url="http://wenzi.com:8080"
[root@centos8 data]#echo ${url%:*}
http://wenzi.com
[root@centos8 data]#echo ${url%%:*}
http
查找并替换
查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之,懒惰模式
${var/pattern/substr}
查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之,贪婪模式
${var//pattern/substr}
查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
${var/#pattern/substr}
查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
${var/%pattern/substr}
查找并删除
[root@centos8 ~]#tail -n 3 /etc/services | awk 'BEGIN{print "Service\t\tPort\t\tDes\n"} {print $0}'
Service Port Des
cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998/tcp # Capture handwritten signatures
[root@centos8 ~]#tail -n 3 /etc/services | awk '{print $0} END{print "-----END-----"}'
cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998/tcp # Capture handwritten signatures
-----END-----
字符大小写转换
[root@wenzi ~]# tail -n 3 /etc/services | awk '/^mata/{print $0}'
matahari 49000/tcp # Matahari Broker
变量拓展
[root@wenzi ~]# tail -n 10 /etc/services | awk '/blp5/ && /tcp/ {print $0}'
blp5 48129/tcp # Bloomberg locator
[root@centos8 data]#wz1=1;wz2=2;wz3=3
[root@centos8 data]#echo ${!wz*}
wz1 wz2 wz3
高级变量赋值
如下:var 和 str 为变量,针对 str 是否有设定来决定 var 的值。
- [str:]代表 str 没有设定或为空的字符串
- [str]代表没有该变量
变量设定方式 | str没有设定 | str为空字符串 | str已设定为非空字符串 |
var=${str-expr} | var=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} | str=expr var=expr | str不变 var= | str不变 var=$str |
var=${str:=expr} | str=expr var=expr | str=expr var=expr | str不变 var=$str |
var=${str?expr} | expr输出至stderr | var= | var=$str |
var=${str:?expr} | expr输出至stderr | expr输出至stderr | var=$str |
求10个随机数的最大值与最小值
[root@centos8 ~]#tail -n 5 /etc/services | awk -v FS="/" -v OFS="---" '{print $1OFS$2}'
axio-disc 35100---udp # Axiomatic discovery protocol
pmwebapi 44323---tcp # Performance Co-Pilot client HTTP API
cloudcheck-ping 45514---udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514---tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998---tcp # Capture handwritten signatures
实现阶乘算法
n!=1x2x3x...xn
递归
[root@centos8 ~]#tail -n 5 /etc/services | awk '{print NR $0}'
1axio-disc 35100/udp # Axiomatic discovery protocol
2pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
3cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
4cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
5spremotetablet 46998/tcp # Capture handwritten signatures
迭代
[root@wenzi ~]# tail -n 5 /etc/services | awk 'END{print NR}'
5
进程和线程区别
- 进程是操作系统分配资源的最小单位。
- 线程是程序执行的CPU调度的最小单位。
- 一个进程由一个或多个线程组成;线程是一个进程中代码的不同执行路线。
- 进程之间互相独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(打开文件和信号),某进程的线程在其它进程不可见。
进程结构
Linux内核中使用 task_struct 结构来表示一个进程,这个结构体保存了进程的所有信息,这个结构体称为进程控制块(PCB)。
内核把进程存放在 任务队列task list 的双向循环列表中,列表中每一项都是task_struct结构。
进程控制块PCB包含信息:
- 进程id、用户id和组id
- 程序计数器
- 进程的状态(就绪、运行、阻塞)
- 进程切换时需要保存和恢复的CPU寄存器的值
- 描述虚拟地址空间的信息
- 描述控制终端的信息
- 当前工作目录
- 文件描述符表,包含很多指向file结构体的指针
- 进程可以使用的资源上限(ulimit –a命令可以查看)
- 输入输出状态:配置进程使用I/O设备
进程状态
进程的基本状态
- 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写
- 控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
状态之间转换
- 创建——>就绪:进程被创建并准备好等待执行
- 就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
- 运行——>就绪:
- 主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的
- 在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
- 运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求,读取磁盘中的文件
- 阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
- 运行——>终止:进程完成其任务或被操作系统终止。
以下两种状态转换是不可能发生的:
- 阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
- 就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态
更多的状态:
R:running,该程序正在运作中。
S:sleep,该程序正处于睡眠状态,但可以被唤醒。
D:不可被中断的睡眠状态,通常该程序可能在等待I/O的情况(ex>打印)
T:stop,停止状态;暂停于内存,不会被调度,除非手动启动
Z:zombie,僵尸状态,进程已经终止,但无法被移除至内存外。
X:死亡状态,进程彻底结束,可回收该进程相关资源;几乎在进程状态变为X的瞬间就会被清理掉,所以很难捕捉到该状态进程
<:高优先级
N:低优先级
s:表示此为父进程,它还有子进程
+:前台进程
l:多线程进程
IPC通信 和 RPC通信
同一主机
- pipe:管道,单向传输。例如,在一个Shell脚本中,我们可以使用管道将一个命令的输出作为另一个命令的输入,实现数据传递和处理。
- socket:套接字文件,双工通信。
- Memory-maped file:文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存
- shared memory:共享内存。
- signal:信号
- Lock:对资源上锁,如果资源已被某进程锁住,则其它进程想修改甚至读取这些资源,都将被阻塞,直到锁被打开
- semaphore:信号量,一种计数器,类似停车场车位计数器
不同主机:socket 即IP+Port
- RPC:remote procedure call,远程过程调用
- 例如:将函数定义在单独的文件中,shell脚本中通过类似 . /etc/os-release 方式读取函数后可正常调用函数。
- 例如:在一个分布式文件系统中,可以使用RPC来实现不同节点之间的文件读写操作。
- MQ:消息队列,生产者和消费者,如:Kafka,RabbitMQ,ActiveMQ
前台、后台
前台作业:通过终端启动,且启动后一直占据终端(foreground)。
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端),你无法使用 ctrl + c 终止它,可以使用 bg/fb 呼叫该工作。
查看目前背景工作状态:jobs
jobs [-lrs]
-l:显示除工作编号与进程外,同时列出PID。
-r:显示正在后台running的工作。
-s:显示正在后台stop的工作。
+:代表最近一次被移至后台的工作 -:代表倒数第二个被移至后台的工作
- 将命令移至背景中执行:&
- 将当前工作移至背景中暂停:ctrl + z
- 将背景工作移至前景:fg jobnum
- 让后台停止的进程在后台运行:bg jobnum 或 kill -18 %jobnum
- 让后台运行的进程在后台停止:kill -19 %jobnum
nohup 命令 &> /dev/null &
可将终端执行的命令置于后台,关闭终端后不影响程序运行。
内核设计流派及特点
- 单内核:Linux、Unix
把左右的系统服务都放到内核里,所有功能都集成于同一个程序,分层实现不同的功能,系统庞大复杂。
- 微内核:Windows,HarmonyOS
简化内核功能,在内核之外的用户态尽可能多的实现系统服务,同时加入相关之间的安全保护,每种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差。
Linux使用单内核,且实现功能模块化,相当于吸收了微内核有点。
rocky启动流程
- UEFI/BIOS 初始化,运行POST开机自检。
- 选择启动设备。
- 引导加载程序 Grub2,加载程序的配置文件:
- /etc/grub.d/
- /etc/default/grub
- /boot/grub2/grub.cfg
- 加载 initramfs 驱动模块(可实现根文件系统的挂载)。
- 加载虚拟根中的内核。
- 虚拟根的内核初始化。第一支程序为systemd。
- 执行 initrd.target 所有单元,包括挂载 /etc/fstab。
- 从 initramfs 根文件系统切换至磁盘根目录。
- systemd 执行默认 target 配置,配置文件 /etc/systemd/system/default.target。
- systemd 执行 sysinit.target 初始化系统及 basic.target 准备操作系统。
- systemd 启动 multi-user.target 下的服务。
- systemd 执行 multi-user.target 下的 /etc/rc.d/rc.local 文件。
- systemd 执行 multi-user.target 下的 getty.target 及登录服务。
- systemd 执行 graphical 需要的服务。
GRUB工作流程
- 依据BIOS中设置的启动设备,从其MBR中加载gurb程序
- grub程序识别分区文件系统
- grub程序提供显示菜单功能,用户可选择启动的内核
- grub程序加载内核
- 内核加载完毕后,将控制权移交给内核
chkconfig服务脚本
固定写法部分
- #/bin/bash ---> shebang机制,必写
- # chkconfig: - 96 3 ---> 必写,- 表示任何运行级别下都不启动,可改为“2345”等;96 表示S启动时顺序;3 表示K关闭时顺序;可通过chkconfig --list 服务名 查看。仅影响开机启动时的设定。
- # description: xxx ---> 必写,表示描述
#!/bin/bash
# chkconfig: - 96 3
# description: This is test service script
. /etc/init.d/functions
start(){
[ -e /var/lock/subsys/testsrv ] && exit || touch /var/lock/subsys/testsrv
echo $PATH
action "Starting testsrv"
sleep 3
}
stop(){
[ -e /var/lock/subsys/testsrv ] && rm /var/lock/subsys/testsrv || exit
action "Stopping testsrv"
}
status(){
[ -e /var/lock/subsys/testsrv ] && echo "testsrv is running..." || echo "testsrv is stopped"
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 2
esac
systemd服务配置文件
etc/systemd/system
这是系统默认的systemd配置文件目录。在这个目录中,可以创建和修改自定义的systemd服务单元配置文件。这些配置文件定义了服务的名称、依赖项、启动顺序、运行环境等等。
/usr/lib/systemd/system
这是系统级别的systemd配置文件目录。在这个目录中,通常包含一些系统级别的服务和应用程序的配置文件。这些配置文件通常由软件包管理器在安装过程中自动创建和更新。类似CentOS6中的 /etc/init.d 目录
/usr/local/lib/systemd/system
这是用户级别的systemd配置文件目录。在这个目录中,可以创建和修改用户级别的服务单元配置文件。这些配置文件只在当前用户的主目录下有效,不会影响其他用户。
/run/systemd/system
这是运行时创建的systemd配置文件目录。在这个目录中,会存储正在运行的服务单元的配置文件。这些配置文件只在当前会话中有效,当系统重新启动时,这些配置文件会被清除。
systemd启动流程
- systemd 执行默认 target 配置,配置文件 /etc/systemd/system/default.target。
- systemd 执行 sysinit.target 初始化系统及 basic.target 准备操作系统。
- systemd 启动 multi-user.target 下的服务。
- systemd 执行 multi-user.target 下的 /etc/rc.d/rc.local 文件。
- systemd 执行 multi-user.target 下的 getty.target 及登录服务。
- systemd 执行 graphical 需要的服务。
awk
一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及
生成报表等等;在Linux下默认awk是gawk
awk 选项 ‘模式 {动作} ’ filename
工作原理
- 执行 BEGIN{ commands } 语句块中的语句。
- 从文件或标准输入(stdin)读取一行,然后执行 pattern{ commands } 语句块,它逐 行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
- 当读至输入流末尾时,执行 END{ commands } 语句块。
BEGIN语句块:
可选的语句块。在awk开始从输入流中读取行 之前 被执行,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
END语句块:
可选的语句块。在awk从输入流中读取完所有的行 之后 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成
pattern语句块:
可选的语句块。最重要的部分,如果没有提供pattern语句块,则默认执行 { print } ,即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
awk是以行为一次处理的单位,字段为最小的处理单位;
每一行的每个字段都是变量名的,即$1,$2,$3…;$0代表一整行内容;
awk中变量可以直接使用,不用加上$符号;
从文件中读取awk命令
[root@wenzi ~]# echo '{print $2}' > cs.awk
[root@wenzi ~]# tail -n 3 /etc/services | awk -f cs.awk
48619/tcp
48619/udp
49000/tcp
指定分隔符
[] 字符表示括号内任意一个字符,即每遇到一个 / 或 # 时,就分割一个字段
[root@centos8 ~]#tail -n 3 /etc/services
cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998/tcp # Capture handwritten signatures
[root@centos8 ~]#tail -n 3 /etc/services | awk '{print $2}'
45514/udp
45514/tcp
46998/tcp
[root@centos8 ~]#tail -n 3 /etc/services | awk -F '/' '{print $1}'
cloudcheck-ping 45514
cloudcheck 45514
spremotetablet 46998
[root@centos8 ~]#tail -n 3 /etc/services | awk -F '[/#]' '{print $3}'
ASSIA CloudCheck WiFi Management keepalive
ASSIA CloudCheck WiFi Management System
Capture handwritten signatures
变量赋值
[root@wenzi ~]# awk -v a=123 'BEGIN{print a}'
123
系统变量
[root@wenzi ~]# a=123 && awk -v a=$a 'BEGIN{print a}'
123
[root@wenzi ~]# a=123 && awk 'BEGIN{print '$a'}'
123
[root@centos8 ~]#awk -v "name=aa" 'BEGIN{print name;name="bb";print name}'
aa
bb
BEGIN和END
[root@centos8 ~]#tail -n 3 /etc/services | awk 'BEGIN{print "Service\t\tPort\t\tDes\n"} {print $0}'
Service Port Des
cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998/tcp # Capture handwritten signatures
[root@centos8 ~]#tail -n 3 /etc/services | awk '{print $0} END{print "-----END-----"}'
cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998/tcp # Capture handwritten signatures
-----END-----
匹配以 mata 开头的行
[root@wenzi ~]# tail -n 3 /etc/services | awk '/^mata/{print $0}'
matahari 49000/tcp # Matahari Broker
匹配包含blp5和tcp的行
[root@wenzi ~]# tail -n 10 /etc/services | awk '/blp5/ && /tcp/ {print $0}'
blp5 48129/tcp # Bloomberg locator
匹配以blp5开头的行 至 以com开头的行
[root@wenzi ~]# tail -n 10 /etc/services | awk '/^blp5/,/^com/ {print $0}'
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
FS
[root@centos8 ~]#tail -n 5 /etc/services | awk -F '/' '{print $1}'
axio-disc 35100
pmwebapi 44323
cloudcheck-ping 45514
cloudcheck 45514
spremotetablet 46998
OFS
[root@centos8 ~]#tail -n 5 /etc/services | awk -v FS="/" -v OFS="---" '{print $1OFS$2}'
axio-disc 35100---udp # Axiomatic discovery protocol
pmwebapi 44323---tcp # Performance Co-Pilot client HTTP API
cloudcheck-ping 45514---udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514---tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998---tcp # Capture handwritten signatures
NF
打印字段个数
[root@wenzi ~]# echo "a b c d e" | awk '{print NF}'
5
打印最后一个字段
[root@wenzi ~]# echo "a b c d e" | awk '{print $NF}'
e
打印倒数第二个字段
[root@wenzi ~]# echo "a b c d e" | awk '{print $(NF-1)}'
d
排除后两个字段
[root@wenzi ~]# echo "a b c d e" | awk '{$NF="";$(NF-1)="";print $0}'
a b c
NR
打印行数
[root@centos8 ~]#tail -n 5 /etc/services | awk '{print NR $0}'
1axio-disc 35100/udp # Axiomatic discovery protocol
2pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
3cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
4cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
5spremotetablet 46998/tcp # Capture handwritten signatures
打印总行数
[root@wenzi ~]# tail -n 5 /etc/services | awk 'END{print NR}'
5
打印第三行
[root@wenzi ~]# tail -n 5 /etc/services | awk 'NR==3 {print $0}'
iqobject 48619/tcp # iqobject
不匹配blp5行
[root@wenzi ~]# tail -n 5 /etc/services | awk '!/blp5/ {print $0}'
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject
matahari 49000/tcp # Matahari Broker
乘法
[root@wenzi ~]# seq 5 | awk '{print $0*2}'
2
4
6
8
10
打印偶数行
[root@wenzi ~]# seq 5 | awk '$0%2==0 {print $0}'
2
4
正则
[root@wenzi ~]# seq 5 | awk '$0~/[34]/ {print $0}'
3
4
[root@wenzi ~]# seq 5 | awk '$0!~/[34]/ {print $0}'
1
2
5
流程控制
if语句
[root@wenzi ~]# seq 5 | awk '{if ($0==3) print $0}'
3
[root@wenzi ~]# echo "123abc#456cde 789aaa#aaabbb " | xargs -n1 | awk -F '#' '{if ($2~/[0-9]/) print $2}'
456cde
[root@wenzi ~]# seq 5 | awk '{if ($0==3) print $0;else print "no"}'
no
no
3
no
no
[root@wenzi ~]# seq 5 | awk '{if ($0==1){print "yes"} else if ($0==2){print "no"} else if ($0==3){print $0}}'
yes
no
3
[root@centos8 ~]#df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 892520 0 892520 0% /dev
tmpfs 921932 0 921932 0% /dev/shm
tmpfs 921932 9264 912668 2% /run
tmpfs 921932 0 921932 0% /sys/fs/cgroup
/dev/mapper/cl-root 104806400 5080784 99725616 5% /
/dev/mapper/cl-data 52403200 398408 52004792 1% /data
/dev/nvme0n1p1 999320 197080 733428 22% /boot
tmpfs 184384 4 184380 1% /run/user/0
判断分区利用率,大于20的输出full,小于20的输出为OK
[root@centos8 ~]#df | awk -F"[ %]+" '/\/dev/ {if($(NF-1)>10){print $(NF-1)" full"}else {print $(NF-1)" OK"}}'
0 OK
0 OK
5 OK
1 OK
22 full
while语句
[root@wenzi ~]# tail -n 3 /etc/services
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject
matahari 49000/tcp # Matahari Broker
遍历打印所有字段
[root@wenzi ~]# tail -3 /etc/services | awk '{i=1;while(i<=NF){print $i;i++}}'
iqobject
48619/tcp
#
iqobject
iqobject
48619/udp
#
iqobject
matahari
49000/tcp
#
Matahari
Broker
[root@centos8 ~]#awk 'BEGIN{sum=0;i=1;while (i<=100){sum+=i;let i++};print sum}'
5050
for语句
[root@wenzi ~]# echo -e "1\t2\t3\n4\t5\t6\n7\t8\t9"
1 2 3
4 5 6
7 8 9
[root@wenzi ~]# echo -e "1\t2\t3\n4\t5\t6\n7\t8\t9" > cs.txt
[root@wenzi ~]# awk '{for(i=1;i<=NF;i++)print $i}' cs.txt
1
2
3
4
5
6
7
8
9
[root@centos8 ~]#awk 'BEGIN{for(i=1;i<=100;i++){sum+=i};print sum}'
5050
continue
中断本次循环
[root@centos8 ~]#awk 'BEGIN{for(i=1;i<=10;i++){if(i==5)continue;sum+=i};print sum}'
50
break
中断整个循环
[root@centos8 ~]#awk 'BEGIN{for(i=1;i<=10;i++){if(i==5)continue;sum+=i};print sum}'
10
next
提前结束对本行的处理而直接进入下一行处理(awk自身的循环)
[root@centos8 ~]#cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@centos8 ~]#cat /etc/passwd | head -n 3 | awk -F ':' '{if($3==1){next} print $1}'
root
daemon
数组
awk的数组是关联数组。如 weekdays["mon"]="Monday"
- 可使用任意字符串,字符串使用双引号括起来
- 如果某数组事先不存在,在引用时,awk会自动创建此元素,并将其初始值设为“空串”
- 若要判断数组中是否存在某元素,要用“index in array”格式遍历
- 若要遍历数组中每个元素,要用for循环
显示数组索引
[root@centos8 ~]#awk 'BEGIN{title["0"]="a";title["1"]="b";print "0" in title}'
1
判断数组索引是否存在
[root@centos8 ~]#awk 'BEGIN{title["0"]="a";title["1"]="b";if("0" in title){print "yes"}else{print "no"}}'
yes
遍历数组所有元素
[root@centos8 ~]#awk 'BEGIN{title["0"]="a";title["1"]="b";for(i in title){print i,title[i]}}'
0 a
1 b
函数
数值
[root@centos8 ~]#awk 'BEGIN{srand();for(i=1;i<=10;i++){print int(rand()*100)}}'
28
94
7
64
72
93
37
36
54
27
字符串处理
统计用户名长度
[root@centos8 ~]#cat /etc/passwd | head -n 3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@centos8 ~]#cat /etc/passwd | cut -d ':' -f1 | awk '{print length()}' | head -n 3
4
3
6
[root@centos8 ~]#cat /etc/passwd | awk -F ':' '{print length($1)}' | head -n 3
4
3
6
调用shell中命令
语法:system('cmd')
[root@centos8 ~]#awk 'BEGIN{system("hostname")}'
centos8.magedu.com
CA和证书
加密算法和协议
对称加密算法
加密和解密使用同一个秘钥。
特性
- 加密、解密使用同一个秘钥,效率高
- 将原始数据分割为固定大小的块,逐个加密
缺陷
- 秘钥过多
- 秘钥分发
- 数据来源无法确认
常见算法
DES、3DES、AES、IDEA、Blowfish、RC6
非对称加密算法
秘钥是成对出现
- 公钥:public key,公开给所有人,主要给别人加密使用
- 私钥:secret key,private key,自己留存,必须保证其私密性,用于自己加密签名
- 特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
功能
- 数据加密:适合加密较小数据;如:加密对称秘钥
- 数字签名:主要在于让接收方确认发送方身份
缺点
- 密钥长,算法复杂
- 加密解密,效率低下
常见算法
RSA、DSA、ECC
场景
非对称加密实现加密
接收者:生成公钥/秘钥对,公开公钥,保密秘钥
发送者:使用接收者的公钥来加密消息,将加密后的消息发送给接收者
接收者:使用秘钥来解密消息
非对称加密实现数字签名
发送者:生成公钥/秘钥对,公开公钥,保密秘钥,使用秘钥加密消息,将加密后的消息发送给接收者
接收者:使用发送者的公钥来解密
建立私有CA实现证书申请颁发
openssl配置文件:/etc/pki/tls/openssl.cnf
其中重要项:
[ CA_default ]
dir = /etc/pki/CA CA的主要目录,用于存储证书、私钥、CRL等文件。
certs = $dir/certs 存储已颁发的证书
crl_dir = $dir/crl 存储已签名的证书撤销列表(CRL)
database = $dir/index.txt 数据库索引文件,存储证书对应哪个网站
#unique_subject = no # Set to 'no' to allow creation of
# several certs with same subject.
new_certs_dir = $dir/newcerts 新证书的默认存储位置
certificate = $dir/cacert.pem CA的证书文件
serial = $dir/serial 当前的序列号,用于标识新证书
#crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem 当前的CRL文件
private_key = $dir/private/cakey.pem CA的私钥文件
x509_extensions = usr_cert 要添加到证书的扩展
[ policy_match ] 匹配策略,用于定义证书主题字段的匹配规则
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
三种策略:
- match:要求申请填写的信息根CA设置的信息必须一致
- optional:可有可无,跟CA设置信息可不一致
- supplied:必须填写这项信息
建立私有CA
- OpenCA:OpenCA开源组织使用Perl对OpenSSL进行二次开发而成的一套完善的PKI免费软件
- openssl:相关包 openssl和openssl-libs
1、创建CA所需要文件
生成证书索引数据库文件
touch /etc/pki/CA/index.txt
指定第一个颁发证书的序列号
echo 01 > /etc/pki/CA/serial
2、生成CA私钥
cd /etc/pki/CA;(umask 066; openssl genrsa -out private/cakey.pem 2048)
3、生成CA自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
选项说明:
-new:生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
CentOS7
从CentOS7将/etc/pki/CA目录内容复制到CentOS8,免去建立目录的步骤
[root@wenzi ~]#tree -d /etc/pki/CA
/etc/pki/CA
├── certs
├── crl
├── newcerts
└── private
[root@wenzi ~]#scp -r /etc/pki/CA [email protected]:/etc/pki/
CentOS8
生成CA私钥
[root@centos8 ~]#cd /etc/pki/CA;(umask 066; openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................................................................................................+++++
........................................................................................................................................................................................+++++
e is 65537 (0x010001)
[root@centos8 CA]#ll private/cakey.pem
-rw------- 1 root root 1675 Dec 31 04:42 private/cakey.pem
生成CA自签名证书
[root@centos8 CA]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN 国家
State or Province Name (full name) []:henan 省份
Locality Name (eg, city) [Default City]:zhengzhou 市名
Organization Name (eg, company) [Default Company Ltd]:wenzi 公司
Organizational Unit Name (eg, section) []:yunwei 部门
Common Name (eg, your name or your server's hostname) []:www.wenzi.com 使用证书的网站域名
Email Address []:[email protected] 邮箱
查看生成的CA自签证书,建议将此文件传输到windows系统,后缀改为.crt
[root@centos8 CA]#openssl x509 -in cacert.pem -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
52:27:46:0b:52:67:5f:60:c8:bf:38:25:b9:c7:0e:66:d4:52:95:6a
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = henan, L = zhengzhou, O = wenzi, OU = yunwei, CN = www.wenzi.com, emailAddress = [email protected]
Validity
Not Before: Dec 30 20:50:35 2023 GMT
Not After : Dec 27 20:50:35 2033 GMT
Subject: C = CN, ST = henan, L = zhengzhou, O = wenzi, OU = yunwei, CN = www.wenzi.com, emailAddress = [email protected]
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:bc:ac:9d:47:2c:4c:83:a6:2c:12:52:ba:f7:93:
6b:33:a6:e1:f0:9b:e7:4c:51:59:b0:95:db:b2:68:
ec:4a:2c:36:57:73:72:11:3c:21:6e:d3:fb:5a:0f:
a4:ca:05:21:fd:d5:a6:d7:4d:1f:72:91:15:3e:60:
da:cf:3a:e3:b2:c6:7b:c3:0e:4e:39:14:2c:94:f1:
ae:47:30:64:27:95:76:84:12:2e:a2:e0:60:2f:7c:
c9:83:3b:c9:d9:6a:4d:1f:78:a6:41:ea:ac:12:85:
d3:9a:43:f9:24:c7:66:f0:09:c7:01:91:ee:6a:ec:
1d:a4:7f:72:19:43:ca:91:78:ac:23:9e:6b:43:84:
5e:40:09:61:5e:b6:32:f2:19:9d:c6:b7:00:f8:d0:
00:fd:66:f3:f7:a2:a3:5a:81:71:1a:b0:2a:c2:e7:
42:f8:a9:b7:54:f6:1e:da:47:87:4a:6a:29:26:7f:
16:20:b9:e9:76:a7:92:b2:19:3a:4e:de:b0:ab:63:
12:6e:7a:f3:64:e5:91:93:1f:35:09:0b:b6:79:dd:
a3:27:8d:7a:2d:9a:3b:7f:a1:b1:d3:df:a2:0a:81:
60:0e:ec:69:9b:1a:a7:32:19:71:fa:9a:f1:93:91:
e7:48:8f:be:2a:85:a4:6d:f7:90:92:92:d7:08:06:
94:65
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
5D:EE:41:48:03:D1:0D:A6:85:DA:BC:05:29:AF:81:BF:82:67:11:05
X509v3 Authority Key Identifier:
keyid:5D:EE:41:48:03:D1:0D:A6:85:DA:BC:05:29:AF:81:BF:82:67:11:05
X509v3 Basic Constraints: critical
CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
5d:65:b2:c9:2d:8c:89:79:85:46:12:0a:17:12:87:21:3f:e1:
f3:bb:f5:c4:82:24:b9:43:74:c2:d6:52:5c:80:65:75:9d:3c:
45:fa:c4:88:5f:43:6d:1d:0e:3d:84:a0:e7:ab:60:35:f6:88:
c0:ac:8e:c7:ca:70:f7:71:09:ea:03:6f:3a:c7:2f:4e:bd:3b:
35:4c:ca:4e:ce:17:90:67:5a:8f:4b:8a:ef:3d:ce:3a:bc:9c:
ee:2a:cf:7d:3a:f0:36:9b:f7:19:71:73:f5:e7:4d:30:50:8c:
12:f8:f1:92:02:91:f7:3b:30:ce:07:4e:09:b9:f6:0f:72:92:
4d:76:c4:11:6c:a9:e3:56:ca:2f:fc:9e:05:b5:dd:e4:86:45:
6a:dd:c4:77:70:3e:bc:4a:5f:55:6e:eb:74:7d:46:4f:00:c4:
db:23:bc:d3:71:74:ef:e0:e4:06:27:8a:29:b6:e0:62:b3:04:
7e:fe:51:71:91:04:52:f4:61:12:55:37:48:8e:63:6a:50:05:
a3:e2:15:8f:cf:e5:d1:5b:d1:9c:bc:33:b1:88:6e:1b:21:89:
5b:3c:3f:34:0a:a3:b2:95:29:cf:8b:b6:fa:b9:47:28:17:56:
ff:95:28:20:68:fe:94:c6:49:79:f7:8e:16:03:46:f0:68:bd:
cd:a6:73:3c
申请证书并颁发证书
1、为需要使用证书的主机生成生成私钥
(umask 066; openssl genrsa -out /data/test.key 2048)
2、为需要使用证书的主机生成证书申请文件
openssl req -new -key /data/test.key -out /data/test.csr
3、在CA签署证书并将证书颁发给请求者
可以将客户端生成的申请文件发送至CA,生成证书后再把证书传送至客户端
openssl ca -in /data/test.csr -out /etc/pki/CA/certs/test.crt -days 100
注意:默认要求 国家,省,公司名称三项必须和CA一致
4、查看证书中的信息
openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
查看指定编号的证书状态
openssl ca -status SERIAL
用户生成自己的私钥,私钥应该存放至各应用相应目录下
[root@wenzi ~]#(umask 066;openssl genrsa -out /data/test.key 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
.........................+++++
.....+++++
e is 65537 (0x010001)
生成证书申请文件,其中国家代码、省名、公司名必须和CA中一致
[root@wenzi ~]#openssl req -new -key /data/test.key -out /data/test.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:henan
Locality Name (eg, city) [Default City]:luoyang
Organization Name (eg, company) [Default Company Ltd]:wenzi
Organizational Unit Name (eg, section) []:kaifa
Common Name (eg, your name or your server's hostname) []:www.wenzi.org
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
将客户端证书申请文件上传至CA
[root@wenzi ~]#rsync -av /data/test.csr [email protected]:/data/
[email protected]'s password:
sending incremental file list
test.csr
sent 1,135 bytes received 35 bytes 780.00 bytes/sec
total size is 1,041 speedup is 0.89
在CA上颁发证书
提前创建这两个必须存在的文件,不然会报错,提示找不到文件
[root@centos8 CA]#touch /etc/pki/CA/index.txt;touch /etc/pki/CA/serial
指定证书颁发起始序号
[root@centos8 CA]#echo 01 > /etc/pki/CA/serial
颁发证书
[root@centos8 CA]#openssl ca -in /data/test.csr -out /etc/pki/CA/certs/test.crt -days 100
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 31 02:41:47 2023 GMT
Not After : Apr 9 02:41:47 2024 GMT
Subject:
countryName = CN
stateOrProvinceName = henan
organizationName = wenzi
organizationalUnitName = kaifa
commonName = www.wenzi.org
emailAddress = [email protected]
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
35:72:9F:AE:C3:0D:1C:CE:43:34:84:F1:83:88:59:0E:DE:5E:B5:7C
X509v3 Authority Key Identifier:
keyid:5D:EE:41:48:03:D1:0D:A6:85:DA:BC:05:29:AF:81:BF:82:67:11:05
Certificate is to be certified until Apr 9 02:41:47 2024 GMT (100 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
查看当前CA目录下文件
[root@centos8 CA]#tree /etc/pki/CA/
/etc/pki/CA/
├── cacert.pem
├── certs
│ └── test.crt
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│ └── 01.pem
├── private
│ └── cakey.pem
├── serial
└── serial.old
查看下一个颁发证书的序号
[root@centos8 CA]#cat /etc/pki/CA/serial
02
查看颁发记录。 有效期 序号 信息
[root@centos8 CA]#cat /etc/pki/CA/index.txt
V 240409024147Z 01 unknown /C=CN/ST=henan/O=wenzi/OU=kaifa/CN=www.wenzi.org/[email protected]
查看证书信息
[root@centos8 CA]#openssl x509 -in /etc/pki/CA/certs/test.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = henan, L = zhengzhou, O = wenzi, OU = yunwei, CN = www.wenzi.com, emailAddress = [email protected]
Validity
Not Before: Dec 31 02:41:47 2023 GMT
Not After : Apr 9 02:41:47 2024 GMT
Subject: C = CN, ST = henan, O = wenzi, OU = kaifa, CN = www.wenzi.org, emailAddress = [email protected]
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:f2:cf:6e:74:80:8f:e2:19:09:19:20:8f:3d:5b:
d6:3c:96:99:30:d7:07:9e:a0:5a:7c:79:a2:9a:d6:
63:cb:a9:77:f1:10:d5:5f:69:55:53:90:8a:13:66:
f9:77:7b:69:2c:0d:fe:fe:56:78:fa:fe:2e:43:c7:
f9:88:b9:a2:42:d2:47:4b:73:e0:5d:da:c7:66:ce:
fe:3f:e8:9f:fe:93:39:46:a4:7a:05:95:74:ef:fb:
91:7d:8f:63:d8:ed:d4:6a:71:77:8d:b0:f8:37:38:
a2:94:cf:69:f7:02:73:8e:ba:b7:c8:7f:c6:5f:4f:
71:2d:d3:b1:9f:92:03:66:79:26:cb:1e:44:67:11:
29:35:17:bb:a9:c7:98:0f:8c:b9:2b:89:13:9f:32:
27:69:e7:15:3e:5c:05:6c:dc:0d:e9:81:24:ad:83:
2c:71:da:f4:42:04:6b:68:13:2b:ce:19:aa:a8:63:
c7:3a:ac:4f:6e:4e:4b:12:69:a9:2c:96:c9:d8:df:
eb:7a:17:82:3f:d4:82:5b:0c:7a:7b:01:89:3b:ac:
6c:51:f7:f7:c0:3e:46:49:b2:a7:0d:65:df:ac:d9:
ec:e6:21:77:8b:56:00:f7:35:b7:01:b3:76:07:63:
bc:1e:28:84:a6:99:7e:91:21:17:b2:cd:cc:ab:40:
1c:9d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
35:72:9F:AE:C3:0D:1C:CE:43:34:84:F1:83:88:59:0E:DE:5E:B5:7C
X509v3 Authority Key Identifier:
keyid:5D:EE:41:48:03:D1:0D:A6:85:DA:BC:05:29:AF:81:BF:82:67:11:05
Signature Algorithm: sha256WithRSAEncryption
91:8a:ba:32:4a:c4:36:0e:83:bd:e2:95:48:52:02:ce:d6:78:
5a:6b:73:ea:73:59:c7:68:f8:3e:fe:f7:52:2f:0a:3a:7b:8d:
4c:ac:bf:d8:d4:46:73:c3:34:25:3e:51:cd:b2:85:a5:a1:1b:
03:86:92:58:dd:f9:07:d6:72:ba:23:18:79:32:42:71:7d:c2:
ce:f9:0f:00:99:36:00:45:f5:c6:e3:4f:93:aa:e4:5c:aa:ad:
94:89:73:ca:09:e0:9d:64:41:7a:d6:60:da:35:c8:07:d8:f7:
7b:6c:46:41:3c:4c:ee:af:9a:82:b0:1e:25:e8:09:7f:88:e8:
55:7e:de:4e:23:3d:9c:21:ad:1b:e7:f9:7b:df:16:13:64:bc:
5f:fb:95:4f:79:15:cd:01:7b:e9:30:fa:4d:7d:0d:97:fe:9e:
06:40:c6:d0:e7:1f:ec:8a:4a:fd:ee:be:b3:50:8a:7a:9c:4d:
86:b6:33:81:75:af:3e:88:a2:d4:9b:6c:12:73:8a:1e:c5:46:
d7:7e:41:dc:ee:c1:15:29:74:f4:59:63:09:e9:9b:f3:53:4f:
b5:e9:2d:a7:cc:cd:82:17:a0:1e:54:a1:36:a7:f6:a4:3e:eb:
f0:14:de:be:41:e0:cc:78:36:d5:7a:ba:bb:04:8b:84:fb:3b:
40:53:81:dd
将证书发送至客户端,完成
[root@centos8 CA]#rsync -a certs/test.crt [email protected]:/data/
将客户端收到的证书传递至windows系统查看
吊销证书
在客户端获取要吊销的证书的serial
openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
查看crl文件
openssl crl -in /etc/pki/CA/crl.pem -noout -text
标签:CA,etc,awk,print,四周,root,centos8 From: https://blog.51cto.com/u_15894107/9047792