Linux进程管理、任务计划、内核管理、加密
一、编写脚本实现登陆远程主机(使用expect和shell脚本两种形式)。
expect:
#!/usr/bin/expect spawn ssh 192.168.163.143 expect { "yes/no" {send "yes\n";exp_continue} "password" {send "123456\n"} } interact
shell:
#!/bin/bash ip="192.168.163.143" passwd="123456" expect <<EOF spawn ssh $ip expect { "yes/no" {send "yes\n";exp_continue } "password" {send "${passwd}\n" } } expect "#" {send "pwd\n"} expect "#" {send "exit\n"} expect eof EOF
二、生成10个随机数保存于数组中,并找出其最大值和最小值
#!/bin/bash declare -a nums for i in `seq 10`;do nums[$i]=$RANDOM [ $i -eq 1 ] && min=${nums[1]} && max=${nums[1]} && continue [ ${nums[$i]} -lt $min ] && min=${nums[$i]} && continue [ ${nums[$i]} -gt $max ] && max=${nums[$i]} done echo -e 'Nums:\t' ${nums[@]} echo -e 'Min:\t' $min echo -e 'Max:\t' $max
三、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
#!/bin/bash declare -a num n=10 for ((i=0;i<$n;i++));do num[$i]=$RANDOM done echo -e "原数组:\t"${num[@]} for ((i=1;i<$n;i++));do for ((j=0;j<$n-$i;j++));do left=${num[$[j]]} right=${num[$j+1]} if [ ${left} -gt ${right} ];then tmp=$left num[$j]=$right num[$[j+1]]=$left fi done done echo -e "排序后:\t"${num[@]}
四、总结查看系统负载的几种命令,总结top命令的指标大概含义
查看系统负载主要命令有:uptime、mpstat、free、vmstat、iostat、iotop、iftop、nload、dstat、top等。
uptime(系统运行时间、平均负载)
[root@CentOS etc]#uptime 14:41:32 up 1 day, 1:30, 1 user, load average: 0.01, 0.02, 0.05
系统平均负载: 指在特定时间间隔内运行队列中的平均进程数,通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
mpstat(CPU相关统计信息)
来自sysstat包
[root@CentOS sh]#mpstat Linux 3.10.0-1160.el7.x86_64 (shichu) 04/21/2022 _x86_64_ (2 CPU) 05:22:52 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 05:22:52 AM all 0.03 0.00 0.17 0.03 0.00 0.03 0.00 0.00 0.00 99.73
free(内存空间)
常用选项:
-b以字节为单位 -m以MB为单位 -g以GB为单位 -h易读格式 -o不显示-/+buffers/cache行 -t 显示RAM + swap的总和 -s n 刷新间隔为n秒 -c n 刷新n次后即退出
vmstat(虚拟内存)
[root@ubuntu ~]#vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 910932 3128 878868 0 0 0 2 27 39 0 0 100 0 0
显示说明如下:
procs: r:可运行(正运行或等待运行)进程的个数,和核心数有关 b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度) memory: swpd: 交换内存的使用总量 free:空闲物理内存总量 buffer:用于buffer的内存总量 cache:用于cache的内存总量 swap: si:从磁盘交换进内存的数据速率(kb/s) so:从内存交换至磁盘的数据速率(kb/s) io: bi:从块设备读入数据到系统的速率(kb/s) bo: 保存数据至块设备的速率 system: in: interrupts 中断速率,包括时钟 cs: context switch 进程切换速率 cpu: us:Time spent running non-kernel code sy: Time spent running kernel code id: Time spent idle. Linux 2.5.41前,包括IO-wait time. wa: Time spent waiting for IO. 2.5.41前,包括in idle. st: Time stolen from a virtual machine. 2.6.11前, unknown.
iostat(CPU和设备I/O)
提供更丰富的IO性能状态数据(来自sysstat包)
[root@CentOS sh]#iostat Linux 3.10.0-1160.el7.x86_64 (shichu) 04/21/2022 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.03 0.00 0.21 0.03 0.00 99.73 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.17 2.06 1.81 293652 257424 scd0 0.00 0.01 0.00 1028 0 dm-0 0.00 0.02 0.00 2204 0 dm-1 0.18 1.99 1.81 283471 257392
说明:
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。\ "一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。 kB_read/s:每秒从设备(drive expressed)读取的数据量; kB_wrtn/s:每秒向设备(drive expressed)写入的数据量; kB_read:读取的总数据量; kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。 await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系 统IO响应时间应该低于5ms,如果大于10ms就比较大了。
iotop(监视磁盘I/O)
来自iotop包
iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO
iftop(网络带宽)
来自epel源iftop包
nload(网络实时吞吐量)
来自epel源nload包
dstst(系统资源统计)
由pcp-system-tools包提供,但安装dstat包即可, 可用于代替 vmstat,iostat功能
top/htop命令指标说明
top - 05:42:13 up 1 day, 16:31, 2 users, load average: 0.00, 0.01, 0.05 Tasks: 102 total, 2 running, 100 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st KiB Mem : 2027896 total, 1438128 free, 190880 used, 398888 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 1661708 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24528 root 20 0 0 0 0 S 0.3 0.0 0:07.51 kworker/0:1 1 root 20 0 125380 3936 2616 S 0.0 0.2 0:04.81 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.09 kthreadd 4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0.0 0.0 0:19.59 ksoftirqd/0 7 root rt 0 0 0 0 S 0.0 0.0 0:00.11 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 R 0.0 0.0 1:57.58 rcu_sched 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
显示信息说明如下:
1)前五行
第1行: top - 05:42:13 up 1 day, 16:31, 2 users, load average: 0.00, 0.01, 0.05
第1行是任务队列信息,其参数如下:
内容 | 含义 |
---|---|
05:42:13 | 表示当前时间 |
up 1 day, 16:31 | 系统运行时间 格式为时:分 |
2 users | 当前登录用户数 |
load average: 0.00, 0.01, 0.05 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 |
load average: 如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第2行: Tasks: 102 total, 2 running, 100 sleeping, 0 stopped, 0 zombie
第3行: %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
第2、3行为进程和CPU的信息
当有多个CPU时,这些内容可能会超过两行,其参数如下:
内容 | 含义 |
---|---|
102 total | 进程总数 |
2 running | 正在运行的进程数 |
100 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
0.0 us | 用户空间占用CPU百分比 |
0.3 sy | 内核空间占用CPU百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
99.5 id | 空闲CPU百分比 |
0.0 wa | 等待输入输出的CPU时间百分比 |
0.0 hi | 硬中断(Hardware IRQ)占用CPU的百分比,CPU服务于硬中断所耗费的时间总额 |
0.2 si、0.0 st | CPU服务于软中断所耗费的时间总额、Steal Time |
第4行: KiB Mem : 2027896 total, 1438128 free, 190880 used, 398888 buff/cache
第5行:KiB Swap: 2097148 total, 2097148 free, 0 used. 1661708 avail Mem
第4、5行为内存信息
其参数如下:
内容 | 含义 |
---|---|
KiB Mem: 2027896 total | 物理内存总量 |
190880 used | 使用的物理内存总量 |
1438128 free | 空闲内存总量 |
398888 buff/cache | 用作内核缓存的内存量 |
KiB Swap: 2097148 total | 交换区总量 |
0 used | 使用的交换区总量 |
2097148 free | 空闲交换区总量 |
1661708 avail Mem | 缓冲的交换区总量。 |
上述最后提到的缓冲的交换区总量,这里解释一下,所谓缓冲的交换区总量,即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。
计算可用内存数有一个近似的公式:
第四行的free + 第四行的buff/cache + 第五行的avail Mem
2)进程信息
列名 | 含义 |
---|---|
PID | 进程id |
USER | 进程所有者的用户名 |
PR | 优先级 |
NI | nice值。负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
SHR | 共享内存大小,单位kb |
S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 命令名/命令行 |
五、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
for:
#!/bin/bash net=192.168.0 for i in {1..254};do ip=$net'.'$i { `ping -c1 -W1 $ip &> /dev/null` && echo -e "\e[1;32m$ip success!\e[0m" || echo -e "\e[1;31m$ip fail!\e[0m" }& done wait
while:
#!/bin/bash net=192.168.0 i=1 while [ $i -lt 255 ];do ip=$net'.'$i { `ping -c1 -W1 $ip &> /dev/null` && echo -e "\e[1;32m$ip success!\e[0m" || echo -e "\e[1;31m$ip fail!\e[0m" }& let i++ done wait
六、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
- 创建备份脚本(/home/shichu/sh/backup.sh),并添加执行权限
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin cp -r /etc /backup/`date -d yesterday "+%Y-%m-%d-%H"`.tar.xz
chmod +x /home/shichu/sh/backup.sh
2. 添加任务计划 crontab -e
30 1 * * 1-5 /home/shichu/sh/backup.sh
七、描述密钥交换的过程
- 客户端发起链接请求
- 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
- 客户端生成密钥对
- 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
- 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
- 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
- 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都
会被加密
八、https的通信过程
- 客户端发起HTTPS请求
用户在浏览器里输入一个https网址,然后连接到服务器的443端口 - 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥 - 传送服务器的证书给客户端
证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等 - 客户端解析验证服务器证书
这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书中公钥对该随机值进行非对称加密 - 客户端将加密信息传送服务器
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了 - 服务端解密信息
服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值 - 服务器加密信息并发送信息
服务器将数据利用随机值进行对称加密,再发送给客户端 - 客户端接收并解密信息
客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容
九、使用awk以冒号分隔获取/etc/passwd文件第一列
awk -F: '{print $1}' /etc/passwd
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?