马哥教育Linux-第04周作业

学号:N74058

(根据自己的情况选做6道)
1. 总结脚本高级命令trap, install, mktemp, expect, 进程优先级命令:nice, renice, 进程管理工具: ps, pstree, prtstat, pgrep, pidof, uptime,mpstat,top,htop, free, pmap, vmstat, iostat, iotop, iftop, nload, nethogs, iptraf-ng, dstat, glances, cockpit, kill, jobs, 任务相关的命令: at, crontab, 命令,选项,示例。
trap 是shell内置命令,它对硬件信号和其他事情做出响应。trap定义并激活信号处理过程,信号处理过程是当shell接收信号或其他特殊条件时要运行的处理过程。
install 是安装或升级软件或备份数据,它的使用权限是所有用户。install命令和cp命令类似,都可以将文件/目录拷贝到指定的地点。但是,install允许你控制目标文件的属性。install通常用于程序的makefile,使用它来将程序拷贝到目标(安装)目录。
mktemp 是为安全创建临时文件而设计的。虽然在创建临时文件之前,它不会检查临时文件是否存在,但是它支持唯一文件名和清除机制,因此可以减轻安全攻击的风险。
expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。
nice 命令以更改过的优先序来执行程序,如果未指定程序,则会印出目前的排程优先序,内定的 adjustment 为 10,范围为 -20(最高优先序)到 19(最低优先序)。 使用权限:所有使用者。
renice 命令用于重新指定一个或多个行程(Process)的优先序(一个或多个将根据参数而定)。
ps 命令用于显示当前进程的状态,类似于 windows 的任务管理器。
pstree 命令将所有进程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的进程。
prtstat 可以用来显示进程的父子关系,以树形结构显示 作者:bili_293943556 https://www.bilibili.com/read/cv10420282/ 出处:bilibili
pgrep 是一个根据名称查找进程ID的命令,返回的是进程ID,若存在当个进程,则分为不同的行返回ID(默认实现)。
pidof 是Linux系统中用来查找正在运行进程的进程号(pid)的工具,功能类似pgrep和ps。
uptime 用于显示系统总共运行了多长时间和系统的平均负载。
mpstat 是一款常用的多核CPU性能分析工具,用来实时查询每个CPU的性能指标,以及所有CPU的平均指标。
top 命令用于实时显示 process 的动态。
htop 基于NCourses的Linux进程查看器。它类似于top,但允许您垂直和水平滚动,因此您可以看到系统上运行的所有进程,以及它们的完整命令行,还可以将它们视为进程树,选择多个进程并同时对它们执行操作。
free 用于显示内存状态。
pmap 命令主要用于显示指定进程的内存映像(或称地址空间)。其中,pids是一个或一组进程的PID。
vmstat 最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
iostat 主要用于监控系统设备的IO负载情况,iostat提供了丰富的参数给我们查询各种维度的io数据, iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。
iotop 免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息。它是Python语言编写的,与iostat工具比较,iostat是系统级别的IO监控,而iotop是进程级别IO监控。
iftop 可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等,详细的将会在后面的使用参数中说明。
nload 用于实时监控linux下网络流量信息,是命令行工具,用来监控网络的吞吐量。它使用两个图表数据来对进出站流量进行可视化。
nethogs 是一个类似于Linux的top命令的开源的命令行工具,用来按进程或程序实时统计网络带宽使用率,它可以直观的显示每个进程占用的带宽。
iptraf-ng 是用于Linux的基于控制台的网络监视程序,该程序显示有关IP流量的信息,下面为大家详细讲解一下IPTraf-ng的使用方法。
dstat 可以监测CPU、磁盘、网络流量、IO、内存等,是一个全能的系统信息统计工具。
glances 是一个跨平台的监视工具,旨在通过curses或基于Web的界面提供大量监视信息,下面为大家详细讲解一下 Linux下使用Glances具体方法。
cockpit 是CentOS 8内置的一款基于Web的可视化管理工具,对一些常见的命令行管理操作都有界面支持,比如用户管理、防火墙管理、服务器资源监控等,使用非常方便,号称人人可用的Linux管理工具。
kill 命令用于删除执行中的程序或工作。
jobs 在用管理员执行一个命令后,用Ctrl+Z把命令转移到了后台。导致无法退出root的。
at 是个可以处理仅执行一次就结束调度的指令,不过要执行 at 时, 必须要有 atd 这 个服务 (第十七章) 的支持才行。
crontab 这个指令所设置的工作将会循环的一直进行下去! 可循环的时间为分 钟、小时、每周、每月或每年等。

2. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。(跳过)

3. 求10个随机数的最大值与最小值。
shell脚本

#!/bin/bahs

# 生成10个随机数
for i in {1..10}
do
  array[$i]=$RANDOM
done

# 找到最大值和最小值
max=${array[1]}
min=${array[1]}
for i in ${array[@]}
do
  if [[ $i -gt $max ]]; then
     max=$i
  fi
  if [[ $i -lt $min ]]; then
     min=$i
  fi
done

echo "随机数为:"
echo "${array[@]}"
echo "最大值为:${max}"
echo "最小值为:${min}"

执行脚本结果

  

4. 使用递归调用,完成阶乘算法实现。(跳过)

3. 解析进程和线程的区别?
进程:是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计算器、寄存器和程序变量的当前值。
线程:进程的创建、销毁与切换存在着较大的时空开销,因此人们急需一种轻型的进程技术来减少开销。线程被设计成进程的一个执行路径,同一个进程中的线程共享进程的资源,因此系统对线程的调度所需的成本远远小于进程。
进程与线程的区别总结:
本质区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
包含关系:一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
资源开销:每个进程都有独立的地址空间,进程之间的切换会有较大的开销;线程可以看做轻量级的进程,同一个进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。
影响关系:一个进程崩溃,在保护模式下其他进程不会被影响,但是一个线程崩溃可能导致整个进程被操作系统杀掉,所以多进程要比多线程健壮。

4. 解析进程的结构。

进程描述符(Process Descriptor,简称为“进程体”或“task_struct”):记录进程的基本信息,包括进程ID、进程状态、进程优先级、进程的父进程、进程的子进程、进程的信号处理函数、进程使用的CPU时间等。
进程标识符表(Process Identifier Table,简称为“进程表”):记录系统中所有进程的基本信息,包括进程描述符和进程的状态。
进程地址空间(Process Address Space):进程的代码、数据、堆、栈等内容都存放在进程地址空间中。每个进程都有自己独立的地址空间,互相之间不会干扰。
文件描述符表(File Descriptor Table):记录进程所打开的所有文件的基本信息,包括文件的类型、读写位置、文件状态等。
信号处理表(Signal Handling Table):记录进程对各种信号的处理方式。
栈(Stack):进程的栈用于存放函数调用的返回地址、局部变量以及函数参数等。
线程描述符(Thread Descriptor):记录进程的线程信息,包括线程ID、线程状态、线程优先级、线程栈等。
进程间通信(Inter-Process Communication,简称为“IPC”)机制:进程之间可以通过管道、消息队列、共享内存等方式进行通信。
以上是Linux进程的主要结构,不同的操作系统可能会有所不同。

5. 解析磁盘中的代码如何在计算机上运行的?

在计算机上运行代码需要经过以下步骤:
预处理:将代码中的预处理指令进行处理,例如#include指令会将指定的头文件内容插入到代码中。
编译:将源代码翻译成目标代码,目标代码是一种与计算机硬件相关的低级语言,它由机器指令组成。
链接:将目标代码与库文件进行链接,生成可执行文件。库文件是一些预先编译好的代码,可以在程序中使用。
加载:将可执行文件加载到内存中,操作系统会将可执行文件中的程序代码、数据和其他资源加载到内存中,以便程序能够运行。
运行:CPU执行内存中的程序代码,程序开始运行。
总的来说,计算机执行代码的过程就是将高级语言代码转换成机器语言代码,然后通过CPU执行这些机器语言代码,从而实现程序的运行。

6. 总结OOM原理,及处理方法。
OOM原理
OOM(Out of Memory)即内存溢出,发生在程序申请内存时,操作系统无法分配足够的内存给程序使用时,就会出现OOM错误。这种错误通常是由于程序中存在内存泄漏或内存使用不当等问题导致的。
当程序运行时,会向操作系统申请一定的内存空间用于存储程序执行过程中需要使用的数据。如果程序的内存使用量超过了操作系统所能分配的内存空间,就会出现OOM错误。
OOM错误通常会导致应用程序崩溃、系统运行缓慢或停止响应等问题,严重的甚至会导致操作系统崩溃。
处理方法
增加内存:如果出现OOM错误,可以考虑增加系统内存或者为程序分配更多的内存空间,这样可以解决程序运行时内存不足的问题。
优化程序:检查程序是否存在内存泄漏或内存使用不当等问题,优化代码,减少内存使用量。
垃圾回收:对于Java等高级语言,可以使用垃圾回收机制来自动管理内存,及时释放不再使用的内存空间。
分析内存:使用内存分析工具分析程序的内存使用情况,找到内存泄漏或者内存使用不当的问题。
限制内存使用:在程序开发中,可以设置内存使用上限,防止程序过度占用内存而导致OOM错误。
限制进程数:在操作系统层面上,可以限制进程数,防止过多的进程同时运行而导致OOM错误。

7. 结合进程管理命令,说明进程各种状态。
在Linux系统中,进程状态可以通过进程管理命令来查看。常见的进程状态包括以下几种:
1、运行态(Running):正在运行的进程,占用CPU资源。
2、中断睡眠态(Interruptible sleep):进程正在等待某个事件发生,如等待IO操作完成。此时进程可以被中断,例如按下Ctrl+C。
3、不可中断睡眠态(Uninterruptible sleep):进程正在等待某个事件发生,但此时进程无法被中断,如等待磁盘IO完成。通常只有在等待硬件资源时才会进入这种状态。
4、僵尸态(Zombie):进程已经结束,但是其父进程还没有处理它的退出状态。
5、停止态(Stopped):进程被暂停,无法继续执行。可以通过kill命令发送SIGCONT信号来唤醒进程。
6、可以通过以下进程管理命令来查看进程状态:
7、ps命令:显示当前进程的信息,包括进程ID、父进程ID、进程状态等。
8、top命令:实时显示进程状态及CPU、内存等系统信息。
9、kill命令:向某个进程发送信号,可以用来终止进程或者唤醒进程。
10、strace命令:跟踪进程的系统调用和信号传递等信息。
11、lsof命令:列出当前系统打开的文件及进程信息。

8. 说明IPC通信和RPC通信实现的方式。
IPC通信和RPC通信都是用于不同进程间通信的方式。
IPC通信(Inter-Process Communication)是指在同一台计算机的不同进程之间进行通信的技术。IPC通信可以通过多种方式实现,例如管道、共享内存、消息队列和信号量等。其中,管道是最基本的IPC通信方式,也是最常用的方式之一。在管道中,一个进程将数据写入管道,另一个进程从管道中读取数据。
RPC通信(Remote Procedure Call)是指在网络中不同计算机之间进行通信的技术。RPC通信实现的关键在于远程过程调用,也就是将方法调用转换为网络上的数据传输。在RPC通信中,客户端发起请求,服务端接收请求并处理,然后将结果返回给客户端。
实现方式方面,IPC通信的实现通常是在同一台计算机上的不同进程之间进行通信,因此实现较为简单,可以使用操作系统提供的IPC机制来实现。而RPC通信的实现需要涉及网络传输,因此需要使用网络协议和相关的框架来实现。常见的RPC框架包括gRPC、Thrift和Apache Dubbo等。

9. 通过mkfifo, cat, 来解释秒杀的并发问题,如何通过队列解决的?最好结合图形。说明消息队列的作用?
Linux通过mkfifo、cat解释秒杀的并发问题
在Linux中,mkfifo命令可以创建FIFO(命名管道),通过FIFO可以实现进程间通信。而cat命令则可以读取FIFO中的数据。
假设有一个秒杀场景,多个用户同时发起秒杀请求,如果直接处理请求,可能会导致并发问题。这时可以通过FIFO来解决。
具体做法是,先创建一个FIFO,多个用户的请求都写入FIFO中,然后由另外一个进程(例如Web服务器)读取FIFO中的请求,并进行处理。这样就可以避免多个请求同时被处理的问题。
下面是示意图:

 队列解决并发问题

除了FIFO,队列也可以用来解决并发问题。队列是一种数据结构,具有先进先出(FIFO)的特点。在并发场景中,可以将请求放入队列中,由另外一个进程或线程依次处理队列中的请求。
下面是示意图:

可以看到,在队列中,请求被一个个有序地处理,不会发生并发问题。同时,队列还可以缓解请求的压力,避免系统崩溃。

消息队列的作用
消息队列是进程间通信(IPC)的一种方式,它可以实现不同进程之间的异步通信。消息队列具有以下作用:
解耦:通过消息队列,不同进程之间可以实现松耦合,进程之间的依赖性降低,不需要知道对方的具体实现。
异步:消息队列可以实现异步通信,即发送方不需要立即等待接收方的响应,可以继续执行其他操作。
缓存:消息队列可以作为缓冲区,暂时存储发送方发送的消息,等待接收方处理。
削峰填谷:消息队列可以用于削峰填谷,当系统的请求量过大时,可以将请求缓存到消息队列中,等待系统处理能力恢复后再进行处理。
下面是示意图:

 可以看到,不同的进程通过消息队列进行通信,进程之间的依赖性降低,系统的可维护性和可扩展性都得到了提高。

10. 总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。
在Linux中,前台作业指的是当前正在运行的任务,如果该任务需要用户输入,则需要等待用户输入并等待任务执行完毕。后台作业指的是在后台运行的任务,这些任务不需要用户输入,可以在后台运行并继续执行其他任务。以下是前台和后台作业的区别:
1、用户交互:前台作业需要等待用户输入,而后台作业不需要用户输入。
2、运行状态:前台作业一直处于运行状态,直到任务执行完毕或被中断,而后台作业可以在后台继续运行。
3、输出:前台作业的输出会显示在终端上,而后台作业的输出不会显示在终端上。
4、在前台和后台之间进行状态转换可以使用以下命令:
5、将前台作业转换为后台作业:在终端中按下Ctrl + Z,该任务将被暂停,并且可以使用“bg”命令将其转换为后台任务。
6、将后台作业转换为前台作业:在终端中使用“fg”命令将后台作业转换为前台作业。

11. 总结内核设计流派及特点。

Linux内核设计流派分为两种:
微内核设计流派:将操作系统的核心功能放置在内核空间之外,只在必要时通过消息传递与内核进行通信。典型的微内核设计流派有Mach、L4等。Linux曾经也有过微内核设计的尝试,但是最终还是采用了单内核设计。
单内核设计流派:将操作系统的核心功能全部放置在内核空间中,并且以模块化的方式进行组织。典型的单内核设计流派有Unix、Linux等。
Linux内核采用的是单内核设计流派,其特点如下:
单内核设计,所有操作系统的核心功能都在内核空间中实现,提高了操作系统的运行效率。
模块化设计,可以根据需要动态加载或卸载模块,减少内核体积,提高了系统的可扩展性和灵活性。
多任务设计,支持多任务并发运行,提高了系统的并发能力。
按需调度,根据进程的优先级和调度策略,动态地分配CPU资源,提高了系统的响应能力和效率。
支持虚拟内存,将物理内存和磁盘空间组合起来管理,提高了系统的内存利用率和可靠性。
支持文件系统,将文件和目录组织起来,提供了方便的文件访问接口。
支持网络协议栈,提供了丰富的网络通信功能,支持多种网络协议。
总之,Linux内核采用了单内核设计,并且以模块化、多任务、按需调度、支持虚拟内存、文件系统和网络协议栈等特点,使其成为一款高效、可扩展、灵活的操作系统内核。

12. 总结centos 6 启动流程,grub工作流程

CentOS 6启动流程:
BIOS自检:计算机通电后,首先进行的是BIOS自检,检测硬件设备是否正常。
主引导记录(MBR):BIOS自检完毕后,会把控制权交给位于磁盘第一个扇区的MBR程序。
GRUB引导程序:MBR程序会读取安装在操作系统根分区的GRUB引导程序,把控制权交给GRUB。
GRUB菜单:GRUB会显示菜单,让用户选择要启动的操作系统或内核。
内核启动:用户选择后,GRUB会启动相应的内核,并把参数传递给内核。
init进程启动:内核启动后,会启动init进程,它是所有进程的父进程。
运行级别:在CentOS 6中,运行级别是由/etc/inittab文件指定的。init进程会读取该文件,并根据默认运行级别加载相应的服务。
启动服务:在相应的运行级别中,init进程会启动一系列服务,包括网络服务、文件系统服务、安全服务等。
用户登录:所有服务启动完成后,系统就进入了用户登录状态,用户可以使用用户名和密码登录系统。
Grub工作流程:
BIOS自检完成后,会把控制权转交给位于磁盘第一个扇区的MBR程序。
MBR程序会读取安装在操作系统根分区的GRUB引导程序。
GRUB引导程序会显示菜单,让用户选择要启动的操作系统或内核。
用户选择后,GRUB引导程序会加载相应的内核,并把参数传递给内核。
内核启动后,会启动init进程,接下来的启动流程就和上面的CentOS 6启动流程一样了。

13. 手写chkconfig服务脚本,可以实现服务的开始,停止,重启。
以下是一个手写的Nginx服务脚本示例,可以实现服务的开始、停止、重启操作,并且支持chkconfig命令:

# 制作启停脚本
[root@localhost ~]# vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: 2345 99 20
# description: Ningx Server Control Scripts shell
PROG="/data/app/nginx/sbin/nginx"
PIDF="/data/log/nginx/nginx.pid"
case "$1" in
  start)
    if [ -f $PIDF ];then
      echo -e "Nginx is running...					[\033[31m失败\033[0m]"
    else
      $PROG
      echo -e "Nginx start...						[\033[32m成功\033[0m]"
    fi
  ;;
  stop)
    if [ -f $PIDF ];then
      $PROG -s stop
      echo -e "Nginx stop...						[\033[32m成功\033[0m]"
      rm -f $PIDF
    else
      echo -e "Nginx is already stopped...			[\033[31m失败\033[0m]"
    fi
  ;;
  restart)
    $0 stop
    sleep 1
    $0 start
  ;;
  reload)
    if [ -f $PIDF ];then
      $PROG -s reload
    else
      echo -e "Error: Nginx is stopped...			[\033[31m失败\033[0m]"
    fi
  ;;
  status)
    if [ -f $PIDF ];then
      echo "Nginx is running."
    else
      echo "Nginx is stopped."
    fi
  ;;
  *)
    echo "Usage: $0 (start|stop|restart|reload|status)"
    exit 1
esac
exit 0
# nginx可执行权限
[root@localhost ~]# chmod +x /etc/init.d/nginx
# 添加nginx服务
[root@localhost ~]# chkconfig --add nginx
# 开机自启设置
[root@localhost ~]# chkconfig nginx on
# nginx启动服务
[root@localhost ~]# /etc/init.d/nginx start
# nginx重启服务
[root@localhost ~]# /etc/init.d/nginx restart
# nginx停止服务
[root@localhost ~]# /etc/init.d/nginx stop
# nginx加载配置
[root@localhost ~]# /etc/init.d/nginx reload   

14. 总结systemd服务配置文件

systemd是CentOS 7中的初始化系统,它通过systemd服务管理器来启动、停止和控制系统中的各个服务。以下是systemd服务配置文件的总结:
服务文件存放位置
CentOS 7中的服务配置文件都存放在/usr/lib/systemd/system/和/etc/systemd/system/目录下。其中,/usr/lib/systemd/system/目录下的服务文件是系统自带的服务文件,而/etc/systemd/system/目录下的服务文件是用户自定义的服务文件。用户自定义的服务文件优先级高于系统自带的服务文件。
服务配置文件的命名规则
服务配置文件以.service为扩展名,文件名必须与服务名称一致。例如,httpd.service是Apache Web服务器的服务配置文件。
服务配置文件的格式
服务配置文件采用INI格式,分为[Unit]、[Service]和[Install]三个部分。

[Unit]部分:用于定义服务名称、描述、依赖关系等信息。
[Service]部分:用于定义服务的启动方式、执行命令、环境变量等信息。
[Install]部分:用于定义服务的安装方式、启动级别等信息。
示例:

[Unit]
Description=Apache Web Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/httpd -DFOREGROUND
EnvironmentFile=/etc/sysconfig/httpd
User=apache
Group=apache
Restart=always
[Install]
WantedBy=multi-user.target

常用的服务配置文件指令
以下是常用的服务配置文件指令:
Description:服务的描述信息。
After:定义服务的启动顺序,例如After=network.target表示服务需要在网络服务启动后才能启动。
Type:定义服务的启动方式,常用的有simple、forking、oneshot等。其中,simple表示服务以前台方式启动,forking表示服务以后台方式启动,oneshot表示服务只运行一次。
ExecStart:定义服务的启动命令。
EnvironmentFile:定义服务运行的环境变量文件路径。
User和Group:定义服务运行的用户和用户组。
Restart:定义服务的重启策略,例如always表示总是重启服务。
WantedBy:定义服务的启动级别,例如multi-user.target表示在多用户模式下启动服务。
服务文件的常用操作
以下是服务文件的常用操作:
systemctl start <服务名>:启动服务。
systemctl stop <服务名>:停止服务。
systemctl restart <服务名>:重启服务。
systemctl enable <服务名>:设置服务开机自启动。
systemctl disable <服务名>:取消服务开机自启动。
systemctl status <服务名>:查看服务状态信息。
以上是关于CentOS 7中systemd服务配置文件的总结。

15. 总结system启动流程

CentOS 7的启动流程可以分为以下几个步骤:
1、BIOS/UEFI阶段
当计算机开机时,BIOS/UEFI会进行自检并加载启动设备。在加载设备时,如果发现有可引导的设备,BIOS/UEFI会将控制权转移到该设备的引导扇区。
2、GRUB阶段
GRUB(GRand Unified Bootloader)是一个多操作系统的引导加载程序。它会加载内核文件和初始化RAM磁盘。GRUB会在启动时显示一个菜单,让用户选择要启动的操作系统或内核版本。
3、内核引导阶段
内核是操作系统的核心部分,它会被加载到内存中并初始化系统硬件。在这个阶段,内核会执行以下任务:
加载驱动程序:例如,加载硬件驱动程序和文件系统驱动程序。
挂载根文件系统:内核会在启动时挂载根文件系统,该文件系统包含了操作系统的所有文件和目录。
运行init程序:在CentOS 7中,init程序被替换为systemd。
4、systemd阶段
systemd是一个系统和服务管理器,它会在CentOS 7中代替传统的init程序。它会执行以下任务:
启动各种服务:例如,网络服务、SSH服务和防火墙服务。
挂载文件系统:systemd会挂载其他文件系统,例如,/tmp和/var。
启动用户进程:systemd会启动用户进程和守护进程。
总结起来,CentOS 7的启动流程可以简要描述为:BIOS/UEFI -> GRUB -> 内核引导 -> systemd。

16. 总结awk工作原理,awk命令,选项,示例。

awk是一种文本处理工具,其工作原理为逐行读取文本文件并对每一行进行处理。awk会将每一行根据指定的分隔符进行分割,然后对每个字段进行处理,可以进行匹配、替换、计算等操作。awk还支持自定义函数和变量,可以进行更加复杂的文本处理操作。
awk命令的基本语法为:awk 'pattern {action}' file
其中,pattern表示匹配模式,可以是正则表达式或字符串;action表示对匹配到的文本进行的操作,可以是打印、计算等操作;file表示要处理的文件。

awk选项,awk支持很多选项,常用的选项包括:
-F:指定分隔符,默认为制表符;
-v:定义变量;
-f:指定awk脚本文件;
-i:修改原文件。

17. 总结awk的数组,函数。
awk支持一维数组和多维数组。数组元素可以是任意类型的值,包括字符串、数字、甚至是其他数组。
一维数组,awk中的一维数组使用关键字array定义,可以通过下标访问数组元素。
多维数组,awk中的多维数组是多个一维数组的组合,使用逗号分隔不同维度的下标。
awk支持内置函数和自定义函数两种类型的函数。
自定义函数,awk支持自定义函数,使用关键字function定义函数。自定义函数可以接受参数,也可以返回值。

18. 总结ca管理相关的工具,根据使用场景总结示例。

OpenSSL是一个开源的加密工具库,也是一个命令行工具集,支持SSL和TLS协议,可以用于生成和管理证书和密钥等操作。常用的命令包括:
genrsa:生成RSA密钥对
req:生成证书签名请求
x509:生成自签名证书或签名请求的签名证书
ca:证书颁发机构相关操作,如签署证书请求、吊销证书等
crl:生成证书吊销列表

easy-rsa是一个用于生成和管理证书的Shell脚本工具集,基于OpenSSL,可以快速生成证书和密钥,方便管理。常用的命令包括:
init-pki:初始化证书管理环境
build-ca:创建CA证书
gen-dh:生成Diffie-Hellman参数
build-server-full:生成服务器证书和密钥
build-client-full:生成客户端证书和密钥

cfssl是一个基于Go语言的PKI工具,可以用于生成和管理证书和密钥,支持多种证书格式和加密算法,还支持REST API接口。常用的命令包括:
gencert:生成证书和密钥
sign:签署证书请求
newkey:生成新的密钥
newcert:生成新的自签名证书
ocspserve:启动OCSP服务

使用OpenSSL生成自签名证书:

# 生成RSA密钥对
openssl genrsa -out server.key 2048
# 生成证书签名请求
openssl req -new -key server.key -out server.csr
# 生成自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

使用cfssl签署证书请求:

# 生成CA证书和密钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# 签署证书请求
cfssl sign -ca ca.pem -ca-key ca-key.pem -config config.json -profile server server.csr | cfssljson -bare server

使用OpenSSL生成证书吊销列表并吊销证书:

# 生成证书吊销列表
openssl ca -gencrl -out crl.pem -config openssl.cnf
# 吊销证书
openssl ca -revoke server.crt -config openssl.cnf

使用easy-rsa生成服务器证书和密钥:

# 初始化证书管理环境
easyrsa init-pki
# 创建CA证书
easyrsa build-ca
# 生成服务器证书和密钥
easyrsa build-server-full server nopass

19. 总结openssh免密认证原理,及免认证实现过程。

OpenSSH免密认证基于公钥加密原理,具体步骤如下:
用户在客户端生成一对公钥和私钥。
将公钥传送给服务器端。
服务器端将公钥保存到用户的家目录下的~/.ssh/authorized_keys文件中。
用户从客户端连接服务器时,服务器向客户端发送一段随机信息。
客户端使用私钥对随机信息进行加密,然后将加密后的信息发送给服务器。
服务器使用保存的公钥对加密后的信息进行解密,如果解密成功,就说明客户端可信,允许登录。

免认证实现过程
下面以Linux系统为例,介绍如何实现OpenSSH免密认证:
生成公钥和私钥。在客户端使用ssh-keygen命令生成公钥和私钥,保存到默认路径下(一般为~/.ssh目录下)。
命令:ssh-keygen

将公钥传送到服务器端。可以使用ssh-copy-id命令将公钥复制到服务器端的~/.ssh/authorized_keys文件中。
命令:ssh-copy-id user@server

测试免密认证。执行ssh user@server命令,如果不需要输入密码就成功登录了,说明免密认证已经实现了。
需要注意的是,如果服务器端的~/.ssh目录或authorized_keys文件的权限设置不正确,或者配置文件/etc/ssh/sshd_config的设置不正确,都可能导致免密认证失败。因此,在实际使用中要注意相关配置的设置。

posted @ 2023-03-06 10:40  Jack_Cui  阅读(39)  评论(0编辑  收藏  举报