1. 使用while read line和/etc/passwd,计算用户id总和。
2. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。
索引数组
示例:一次赋值数组B多个元素
关联数组
关联数组必须先声明,再赋值
示例:声明关联数组H,并赋值
引用和查看数组
${数组名[X]}:数组特定元素的值
${数组名[*]}:数组的所有值
${!数组名[X]}:数组的下标
${#数组名[*]}:数组的元素个数
示例:查看数组A的所有元素值
示例:查看数组H的所有下标
示例:查看数组A的所有元素个数
删除数组
unset 数组名:删除整个数组
unset 数组名[X]:删除数组特定元素
示例:删除数组A
字符串处理
基于偏移量取字符串
${#var}:变量var字符串的长度
${var:offset:number}:变量var跳过前offset个字符,取number个字符
${var: -offset}:取变量var最后offset个字符
${var: -offset:-number}:变量var先取最后offset个字符,再去掉后面number个字符
示例:查看变量GX跳过前2个字符,取2个字符
示例:查看数组A的2元素取最后3个字符
示例:查看数组A的0元素先取最后3个字符,再去掉最后一个字符,取剩余部分
基于模式取字符串
${var#*word}:删除从开头到第一个word之间所有的字符
${var##*word}:删除从开头到最后一个word之间所有的字符
${var%word*}:删除从结尾到第一个word之间所有的字符
${var%%word*}:删除从结尾到最后一个word之间所有的字符
示例:删除变量GX从开头到第一个/之间的所有字符
示例:删除变量GX从结尾到最后一个/之间所有字符
查找替换
${var/pattern/substr}:查找变量var中第一次被pattern匹配的字符串,并替换为substr
${var//pattern/substr}:查找变量var中所有被pattern匹配的字符串,并替换为substr
${var/#pattern/substr}:查找变量var中行首被pattern匹配的字符串,并替换为substr
${var/%pattern/substr}:查找变量var中行尾被pattern匹配的字符串,并替换substr
示例:将变量A的第一个345l字符替换为6789
示例:将变量A行首的nsf字符替换为56
查找删除
${var/patter}:删除变量var中第一个被pattern匹配的字符串
${var//patter}:删除变量var中所有被pattern匹配的字符串
${var/#patter}:删除变量var中行首被pattern匹配的字符串
${var/%patter}:删除变量var中行尾被pattern匹配的字符串
示例:删除变量A的fm2g字符
示例:删除变量A的所有2字符
高级变量
间接变量引用
示例:a变量引用b1变量的值
3. 求10个随机数的最大值与最小值。
4. 使用递归调用,完成阶乘算法实现。
5. 解析进程和线程的区别?
进程是资源分配和调度的最小单位
线程是任务调度的最小单位
一个进程由一个或多个线程组成,线程是进程中代码的不同执行路线
进程之间互相独立,但同一个进程下的线程之间互相共享程序的内存空间
6. 解析进程的结构。
进程由内存空间(程序代码,数据集合,进程空间,打开文件)和一个或多个线程组成
7. 结合进程管理命令,说明进程各种状态。
运行状态:R,running
休眠状态:S,sleeping,分为两种,可中断,不可中断
停止状态:T,stopped,暂停于内存,但不会被调度,除非手动启动
僵死状态:Z,zombies,父进程受到影响,对杀死的子进程无法处理
8. 说明IPC通信和RPC通信实现的方式。
IPC指设备内不同进程间通信
RPC指不同设备之间进程通信
10. 总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。
前台作业
通过终端启动,启动后一直占据终端,一旦终端关闭,这个进程也随之消失
后台作业
也叫守护进程,可以通过终端启动,启动后转后台运行,不受终端控制
让作业运行于后台
运行中作业:ctrl+z
尚未启动的作业:COMMAND &
后台作业到前台执行
fg %JOB_NUM
11. 总结内核设计流派及特点。
单内核设计:把所有功能模块集成于同一个程序(Linux),支持模块化如进程调度,内存管理,文件系统,硬件驱动等,支持模块的动态装载和卸载
微内核设计:每种功能模块使用一个单独子系统实现(Windows),把一些应用放到了用户空间,服务与服务之间隔离,单个服务故障或者被攻击,也不会导致操作系统挂掉
12. 总结rocky 启动流程,grub工作流程
POST:加电自检,检测系统硬件设备CPU,主板,显卡,内存等
Bootloader:
grub1阶段:加载MBR0扇区的前446字节启动引导程序
grub1.5阶段:0扇区后的空间,boot分区驱动
grub2阶段:解析/boot/grub.conf文件内容,加载内核文件和伪根文件系统驱动到内存
kernel:
探测识别系统硬件设备
加载所有硬件驱动程序
以只读方式挂载根文件系统
运行第一个进程init
init初始化
加载/etc/inittab文件,获取默认运行级别
加载/etc/rc.d/rc.sysinit脚本,系统初始化
加载/etc/rc.d/rc#.d/S..脚本,运行系统服务
加载/etc/rc.d/rc.local脚本,运行用户自定义服务
终端登录
13. 手写chkconfig服务脚本,可以实现服务的开始,停止,重启。
1 [Unit] 2 Description=Hello World 3 [Service] 4 TimeoutStartSec=0 5 ExecStart=/bin/sh -c "while ture; do echo Hello World; sleep 1; done" 6 ExecStop=/bin/kill sh 7 [Install] 8 WantedBy=multi-user.target
开启服务
停止服务
重启服务
14. 总结systemd服务配置文件
systemd服务配置文件由三部分组成
[Unit]:定义与Unit类型相关的通用选项,用于提供unit描述消息,unit行为,依赖关系
[Service]:与特定类型相关的专用选项
[Install]:定义由systemclt enable/disable命令在实现服务开机启动或不启动时用到的一些选项
Unit段常用选项
Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动
Requires:依赖到的其他units,被依赖的units无法激活时,当前unit也无法激活
Wants:依赖到的其他units
Conflicts:定义units间的冲突关系
Service段常用选项
Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
ExecStart:指明启动unit要运行命令或脚本的绝对路径
ExecStop:指明停止unit要运行的命令或脚本
Install段常用选项
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖
WantedBy:被哪些units所依赖
Also:安装被服务的时候还要安装别的相关服务
15. 总结system启动流程
POST加电自检
Bootloader,grub2启动引导程序:/etc/grub.d,/etc/default/grub,/boot/grub2/grub.cfg
解压initramfs文件,加载驱动模块,挂载根文件系统
加载虚拟根中的内核
虚拟根的内核初始化,运行第一个进程systemd
执行initrd.target所有单元
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置,配置文件/etc/systemd/system/defaul.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需要的服务
16. 总结awk工作原理,awk命令,选项,示例。
awk工作原理
第一步:执行BEGIN{action}语句
第二步:从文件或标准输入中读取一行,然后执行pattern{action}语句,与sed一样逐行扫描处理,从第一行到最后一行重复这个过程,知道全部被读取完毕
第三步:文件读取完毕后,执行END{action}语句
格式:awk [选项] ‘program’ [var=X] filename
选项:
-F:指定输入的字段分隔符,默认为若干个连续空白符
-v var=X:指定变量赋值
-f filename:指定自定义函数或脚本文件
示例:以:为分隔符,打印passwd文件的第1和3个域字段
示例:修改FS输入分隔符为:,并且输出时使用FS分割
示例:以.为域字段分隔符,空格为输入行分隔符,***为输出行分隔符
示例:打印df除了第一行之外的所有行
示例:显示passwd文件的列数,以及最后一列内容
示例:打印df除了第一行外的其他行
示例:打印行号大于等于3小于7的行
示例:打印第七个字段不为/sbin/nologin,并且行号小于等于20的行
示例:awk的if条件判断
示例:awk的while循环
示例:awk的for循环
17. 总结awk的数组,函数。
awk数组为关联数组
关联下标可以为任意字符串,字符串要使用双引号
如果某数组元素不存在,在引用时,awk会自动创建此元素,并将其值初始化为空串
awk函数分为内置函数和自定义函数
数值处理
rand():返回1和0之间随机数
srand():配置rand函数,生成随机数种子
int():返回整数
字符串处理
length(X):返回指定字符串长度
sub(r,s,x):对x字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
gsub(r,s,x):对x字符串搜索r,并将匹配的所有内容替换为s
split(s,array,r):对r为分隔符,切割字符串s,并将切割后的结果保存至array数组
自定义函数
格式
function name(形参){
命令
return var
}
18. 总结ca管理相关的工具,根据使用场景总结示例。
创建CA相关文件
mkdir -p /etc/pki/CA/{certs,netwcerts,crl,private}
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
生成CA私钥
(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem
生成CA自签名证书
openssl req -new -x509 -key /etc/pki/CA/cakey.pem -out /etc/pki/CA/cacert.pem -days Num
生成用户私钥
(umask 066;openssl genrsa -out filename)
生成用户证书请求文件
openssl req -new -in filename -out filename
颁发用户证书
openssl ca -in filename -out filename -days Num
查看证书信息
openssl x509 -in filename -noout -text
吊销证书
echo 01 > /etc/pki/CA/crlnumber
openssl ca -revoke /etc/pki/CA/newcerts/Num.pem
openssl ca gencrl -out /etc/pki/CA/crl.pem
19. 总结对称加密和非对称加密算法和用openssl签发证书步骤
对称加密算法
加密和解密使用同一个密钥
特性:
加密、解密使用同一个密钥,效率高
将原始数据分割成固定大小的块,逐个进行加密
缺陷:
密钥多
密钥分发
数据来源无法确认
常用对称加密算法:
DES,3DES,AES
非对称加密算法
密钥成对出现
公钥:公开给所有人
私钥:自己留存,保证私密性
特点:用公钥加密,只能使用与之匹配的私钥解密,反之亦然
缺陷:
密钥长,算法复杂
加密解密效率低
常见算法:
RSA,DSA
openssl签发证书步骤
生成证书申请请求文件
RA核验
CA签署
获取证书