admin 管理员组

文章数量: 887021

SRE

目录

  • 1、编写脚本实现登陆远程主机
    • expect
    • shell
  • 2、生成10个随机数保存于数组中,并找出其最大值和最小值
  • 3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
  • 4、总结查看系统负载的几种命令,总结top命令的指标大概什么含义
    • 4.1 uptime
    • 4.2 mpstat (来自sysstat包)
    • 4.3 top
  • 5、编写脚本
    • for循环
    • while循环
  • 6、计划任务
  • 7、使用awk以冒号分隔获取/etc/passwd文件第一列
  • 8、创建私有CA并进行证书申请,有实践过程和结果。
  • 9、总结ssh常用参数,用法。需要SSH交互原理分析,需要画图
  • 10、总结sshd服务常用参数。

1、编写脚本实现登陆远程主机

(使用expect和shell脚本两种形式)

expect

[root@localhost ~]# vim expect2

#!/bin/expect
spawn ssh root@192.168.10.13
expect {"yes/no" {send "yes\n";exp_continue }"password" {send "admin\n" }
}
interact

赋予执行权限

[root@localhost ~]# chown a+x expect2

#执行 (注意:不是shell脚本不能用bash执行)

[root@localhost ~]# expect expect2 
spawn ssh root@192.168.10.13
The authenticity of host '192.168.10.13 (192.168.10.13)' can't be established.
ECDSA key fingerprint is SHA256:/wriyBYH4okyq7+rcwYcfTihkIotcdiivwndxO/w8Q0.
ECDSA key fingerprint is MD5:fc:a8:c6:6f:fd:9b:18:3e:f6:4c:bf:f5:ec:8b:39:e6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.13' (ECDSA) to the list of known hosts.
root@192.168.10.13's password: 
Last login: Fri Oct 21 07:21:06 2022 from 192.168.10.104
[root@localhost ~]# 

shell

[root@localhost ~]# vim ssh.sh
#!/bin/bash
expect<<EOF
spawn ssh root@192.168.110.110
expect {"yes/no" { send "yes\n" ;exp_continue }"password" { send "admin\n" }
}
expect eof
EOF

执行

[root@localhost ~]# bash ssh.sh
spawn ssh root@192.168.110.110
root@192.168.110.110's password: 
Last login: Fri Oct 21 18:51:09 2022 from 192.168.110.70
[root@test ~]# 

2、生成10个随机数保存于数组中,并找出其最大值和最小值

生成10个随机数放到数组

[root@localhost ~]# for i in {0..9};do test[$i]=$(echo $RANDOM);done

使用awk RS=" "以空格为回车换行符,将10个数值打印成10行。再用判断从第一行开始数值大于MAX就赋值MAX=$1,依次每列执行,得到最后的MAX就是最大值

[root@localhost ~]# echo ${test[*]} | awk 'BEGIN{RS=" "}{print $0}' | awk 'BEGIN{MAX=0} {if($1>MAX) MAX=$i;fi} END{print MAX}'   

3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序

[root@localhost ~]# vim sum.sh
#!/bin/bash
for i in {1..5};donum[$i]=$(echo $RANDOM)
doneecho "随机产生的5个数值是:${num[*]}"for ((i=1;i<=4;i++));dofor ((j=1;j<=$[5-$i];j++));doif [ ${num[$j]} -gt ${num[$j+1]} ];thentmp=${num[j+1]}num[j+1]=${num[$j]}num[$j]=$tmpfidone
doneecho "排序后的数值:${num[*]}"

执行结果

[root@localhost ~]# bash sum.sh 
随机产生的5个数值是:10354 31953 6857 22250 16441
排序后的数值:6857 10354 16441 22250 31953

4、总结查看系统负载的几种命令,总结top命令的指标大概什么含义

4.1 uptime

当前时间,运行时长,在线用户数,load average后面数值代表1、5、15分钟的系统平均负载

[root@localhost ~]# uptime23:00:04 up  5:30,  2 users,  load average: 0.00, 0.02, 0.05

4.2 mpstat (来自sysstat包)

显示cpu相关统计

[root@localhost ~]# mpstat
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 	10/21/2022 	_x86_64_	(2 CPU)11:03:41 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:03:41 PM  all    0.04    0.00    0.10    0.00    0.00    0.00    0.00    0.00    0.00   99.86

#隔一秒显示一次,一共三次

[root@localhost ~]# mpstat 1 3         
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 	10/21/2022 	_x86_64_	(2 CPU)11:06:54 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:06:55 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:06:56 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11:06:57 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:     all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

4.3 top

第一行:当前时间,运行市场,在线用户,load average后面数值代表1、5、15分钟的系统平均负载
第二行:是关于进程,进程总数,正在运行的进程,休眠进程数,停止进程数,僵尸进程数
第三行:关于cpu利用率
第三行:内存使用率
第五行:swap分区使用率

[root@localhost ~]# top
top - 23:13:20 up  5:44,  2 users,  load average: 0.01, 0.03, 0.05
Tasks: 106 total,   1 running, 105 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1863248 total,   902988 free,   492708 used,   467552 buff/cache
KiB Swap:  2002940 total,  2002940 free,        0 used.  1170972 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                           6413 mysql     20   0 1792824 393400  15452 S   0.3 21.1   1:14.19 mysqld                                            1 root      20   0  128116   6640   4172 S   0.0  0.4   0:01.37 systemd                                           2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd 

top选项:
-d # 指定刷新时间间隔,默认为3秒
-b 全部显示所有进程
-n # 刷新多少次后退出
-H 线程模式

[root@localhost ~]# top -d 1 -n 3        #一秒刷新一次,刷新3次后退出

top内置命令(在top下直接按键)
按P :以占据的CPU百分比,%CPU
按M:占据内存百分比,%MEM
按T:累积占据CPU时长,TIME+

首部信息显示:
按l:uptime信息
按t:tasks及cpu信息
按1 (数字):cpu分别显示
按m命令:memory信息

退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W

5、编写脚本

使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出”success!”,若ping不通则输出”fail!

for循环

[root@localhost ~]# vim ping_for.sh
#!/bin/bash
NET=192.168.10
for i in {1..20};do
ping -c1 -w1 ${NET}.${i} &>/dev/null && echo "${NET}.${i} success" || echo "${NET}.${i} fail"
done

执行结果

[root@localhost ~]# bash ping_for.sh
192.168.10.1 success
192.168.10.2 fail
192.168.10.3 fail
192.168.10.4 fail
192.168.10.5 fail
...

while循环

[root@localhost ~]# vim ping_while.sh
#!/bin/bash
NET=192.168.10
i=1
while [ i -le 255 ];do    #判断i小于255则继续执行
ping -c1 -w1 ${NET}.${i} &>/dev/null && echo "${NET}.${i} success" || echo "${NET}.${i} fail"
let i++                   #每次循环后执行i++即i=i+1
done

执行结果

[root@localhost ~]# bash ping_for.sh
192.168.10.1 success
192.168.10.2 fail
192.168.10.3 fail
192.168.10.4 fail
...

6、计划任务

每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间

#编写备份脚本
[root@localhost ~]# vim /root/etcbak.sh
#!/bin/bash
tar -jcvf /backup/etcbak`date +%F`.tar.xz /etc#编写用户计划任务
[root@localhost ~]# crontab -e
20 17 * * 1-5 /root/etcbak.sh  #查看结果
[root@localhost ~]# ll /backup/
total 8844
-rw-r--r--. 1 root root 9054210 Oct 24 17:18 etcbak2022-10-24.tar.xz

查看计划任务日志
计划任务默认执行结果标准输出和错误都会以邮件方式发送给用户邮箱

#查看是否执行
[root@localhost ~]# cat /var/log/cron
#详细执行结果,错误
[root@localhost ~]# cat /var/spool/mail/root

7、使用awk以冒号分隔获取/etc/passwd文件第一列

[root@localhost ~]# cat /etc/passwd | awk -F: '{print $1}'
root
bin
daemon
adm
lp
...

8、创建私有CA并进行证书申请,有实践过程和结果。

私有CA的初始化配置
安装openssl

[root@localhost ~]# yum -y install openssl openssl-libs

创建CA所需文件
指定第一个颁发证书的序列号

[root@localhost ~]# touch /etc/pki/CA/index.txt
[root@localhost ~]# echo 01 > /etc/pki/CA/serial

生成CA私钥

[root@localhost ~]# cd /etc/pki/CA/
[root@localhost CA]# (umask 066;openssl genrsa -out private/cakey.pem)

生成CA自签证书

[root@localhost CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 365 -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                         #填写CA的国家
State or Province Name (full name) []:guangdong              #省份    
Locality Name (eg, city) [Default City]:zhuhai               #城市
Organization Name (eg, company) [Default Company Ltd]:ken    #公司
Organizational Unit Name (eg, section) []:IT                 #部门
Common Name (eg, your name or your server's hostname) []:ken  #使用者
Email Address []:ken@163                                #邮箱

选项说明:
-new: 生成新证书签署请求
-x509: 专用于CA生成自签证书(用户生成不需要)
-key: 生成球球时用到的私钥
-days:证书有效期(私有CA尽量设置长)
-out: 证书的保存路径

为客户端创建证书
为需要使用证书的主机创建私钥

[root@localhost ~]# cd /root/data/
[root@localhost data]# (umask 066;openssl genrsa -out /root/data/nginx.key)

为需要使用证书的主机生成证书申请文件
注意:国家(Country Name),省(State or Province Name),组织(Organization Name)必须和上面CA自签证书一致

[root@localhost data]# openssl req -new -key /root/data/nginx.key -out /root/data/nginx.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) []:guangdong
Locality Name (eg, city) [Default City]:zhuhai   
Organization Name (eg, company) [Default Company Ltd]:ken
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:nginx 
Email Address []:       #选填Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:               #选填
An optional company name []:           #选填

在CA签署证书并将证书颁发给请求者

[root@localhost data]# openssl ca -in /root/data/nginx.csr -out /etc/pki/CA/certs/nginx.crt -days 365

查看刚刚在CA申请的证书

[root@localhost ~]# ll /etc/pki/CA/certs/nginx.crt 
-rw-r--r--. 1 root root 4484 Oct 26 22:28 /etc/pki/CA/certs/nginx.crt[root@localhost ~]# cat /etc/pki/CA/index.txt   #前面创建的索引文件是存放证书状态信息
V	231026232340Z		01	unknown	/C=CN/ST=guangdong/O=ken/OU=IT/CN=nginx

查看证书信息

[root@localhost ~]# cat /etc/pki/CA/certs/nginx.crt 
Certificate:Data:Version: 3 (0x2)Serial Number: 1 (0x1)Signature Algorithm: sha256WithRSAEncryptionIssuer: C=CN, ST=guangdong, L=zhuhai, O=ken, OU=IT, CN=kenValidityNot Before: Oct 26 23:23:40 2022 GMTNot After : Oct 26 23:23:40 2023 GMTSubject: C=CN, ST=guangdong, O=ken, OU=IT, CN=nginxSubject Public Key Info:Public Key Algorithm: rsaEncryptionPublic-Key: (2048 bit)Modulus:00:bf:0a:f7:83:67:9a:98:a8:83:a5:a7:8d:61:ba:fd:b8:06:c3:d3:e5:6a:85:da:a9:f5:8e:b6:0d:1a:fd:ed:36:1e:1f:7d:69:21:81:8a:bb:2c:3c:0e:cc:52:7f:a5:be:8a:69:16:c7:56:ba:58:56:da:58:28:
...

可以把证书发送到windows查看(支持.crt后缀)


因为私有CA的自签证书不在windows受信任的根颁发机构中,所以提示该证书无法验证
解决:将私有CA自签证书导入到windows受信任的根证书颁发机构中即可。

9、总结ssh常用参数,用法。需要SSH交互原理分析,需要画图

选项用法
-l指定用户名
-p指定远程端口
-o-o StrictHostKeyChecking=no ,关闭首次登录询问检查yes/no
-i#指定私钥文件路径,实现基于key验证,默认使用文件: /.ssh/id_dsa,/.ssh/id_ecdsa, /.ssh/id_ed25519,/.ssh/id_rsa等

SSH交互通信原理

公钥交换

• 客户端发起链接请求
• 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
• 客户端生成密钥对
• 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
• 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
• 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
• 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

SSH加密通讯原理

  • 客户端发送数据给服务端,使用服务端公钥加密,服务端用自己的私钥解密
  • 服务端发送数据给客户端,使用客户端端公钥加密,客户端用自己的私钥解密

10、总结sshd服务常用参数。

服务器端:sshd
服务器端的配置文件: /etc/ssh/sshd_config

[root@localhost ~]# vim /etc/ssh/sshd_config 
Port  22                                  #端口 生产建议修改
ListenAddress ip
LoginGraceTime 2m
PermitRootLogin yes                      #默认ubuntu不允许root远程ssh登录
StrictModes yes                          #检查.ssh/文件的所有者,权限等
MaxAuthTries  6                          #pecifies the maximum number of authentication
attempts permitted per connection. Once the number of failures reaches half this
value, additional failures are logged. The default is 6.
MaxSessions  10                         #同一个连接最大会话
PubkeyAuthentication yes                #基于key验证
PermitEmptyPasswords no                #空密码连接
PasswordAuthentication yes             #基于用户名和密码连接
GatewayPorts no
ClientAliveInterval 10                #单位:秒
ClientAliveCountMax 3                 #默认3
UseDNS yes                           #提高速度可改为no
GSSAPIAuthentication yes             #提高速度可改为no
MaxStartups                         #未认证连接最大值,默认值10

本文标签: SRE