The Sixth Week(Lucklyzpp)

      expect脚本示例,简单在这记录下下面会用到的一些命令

  set timeout         #设置超时时间,默认超时时间10s.

  spawn shell command   # spawn后面接的是我们要执行的shell命令

  expect "hi"      #匹配输出内容“hi”

  {send “hello ”}      # 匹配到内容''hi"后输出“hello”,“ ”是代表是返回字符。

  interact           #执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可改为[expect eof]

1 ,编写脚本实现登陆远程主机。(使用expect和shell脚本两种形式)。

[14:39:22 root@lucklyzpp8 data]#cat login_expect2.exp 
#!/usr/bin/expect 
set ip [lindex $argv 0]  
set port [lindex $argv 1] 
set passwd "root123"
spawn ssh $ip -p$port  
expect {
    "yes/no" {send "yes
";exp_continue}
    "password:" {send "$passwd
"}
}
interact

[14:37:42 root@lucklyzpp8 data]#./login_expect2.exp 192.168.33.128 22
spawn ssh 192.168.33.128 -p22
root@192.168.33.128's password: 
Last login: Mon Oct 18 22:36:26 2021 from 192.168.33.131
[22:38:50 root@lucklyzpp7 ~]#
[22:58:50 root@lucklyzpp7 ~]#exit
[14:59:29 root@lucklyzpp8 data]#cat login_expect.exp 
#!/usr/bin/expect
spawn ssh root@192.168.33.128
expect {
"*(yes/no*" { send "yes
";exp_continue }
"*password:*" { send "root123
";exp_continue }
}
interact
[14:58:15 root@lucklyzpp8 data]#./login_expect.exp 
[22:58:37 root@lucklyzpp7 ~]#ls
anaconda-ks.cfg  data  redis-6.2.5.tar.gz
[22:58:38 root@lucklyzpp7 ~]#hostname
lucklyzpp7
[15:16:06 root@lucklyzpp8 data]#cat relogin.sh 
#!/bin/bash
Address=192.168.33.128
User=root
Passwd=root123
expect <<EOF
spawn ssh $User@$Address
expect {
"*(yes/no*" { send "yes
";exp_continue  }
"*password:*" { send "root123
";exp_continue  }
}
interact;
EOF
[15:16:11 root@lucklyzpp8 data]#bash relogin.sh 
spawn ssh root@192.168.33.128
root@192.168.33.128's password: 
Last login: Mon Oct 18 23:15:31 2021 from 192.168.33.131
[23:16:14 root@lucklyzpp7 ~]#

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

[15:19:51 root@lucklyzpp8 data]#bash -n zu.sh 
[15:19:58 root@lucklyzpp8 data]#bash zu.sh 
“All numbers are 9226 11048 23498 13201 31271 17642 31355 16391 13548 30543”
Max is 31355
Min is 9226
[15:20:04 root@lucklyzpp8 data]#cat zu.sh 
#!/bin/bash 
declare -i min max 
declare -a nums 
for ((i=0;i<10;i++));do 
    nums[$i]=$RANDOM 
    [ $i -eq 0 ] && min=${nums[$i]} && max=${nums[$i]}&& continue 
    [ ${nums[$i]} -gt $max ] && max=${nums[$i]} 
    [ ${nums[$i]} -lt $min ] && min=${nums[$i]} 
done 
echo “All numbers are ${nums[*]}” 
echo Max is $max 
echo Min is $min

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

[15:27:39 root@lucklyzpp8 data]#cat mun.sh 
#!/bin/bash
read -p "请输入数值个数:" COUNT
declare -a nums
for ((i=0;i<$COUNT;i++));do
    num[$i]=$RANDOM
done
echo "The initial array:"
echo ${num[@]}

declare -i n=$COUNT
for (( i=0; i<n-1; i++ ));do
    for (( j=0; j<n-1-i; j++ ));do
        let x=$j+1
        if (( ${num[$j]} < ${num[$x]} ));then
 #从大到小排列
           tmp=${num[$x]}
            num[$x]=${num[$j]}
            num[$j]=$tmp
        fi
    done
done
echo "After sort:"
echo ${num[*]}
echo "the max integer is $num,the min integer is ${num[$((n-1))]}"
[15:29:04 root@lucklyzpp8 data]#bash mun.sh 
请输入数值个数:9
The initial array:
29719 12356 24301 15770 853 20815 9794 20667 13857
After sort:
29719 24301 20815 20667 15770 13857 12356 9794 853
the max integer is 29719,the min integer is 853

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

[15:31:48 root@lucklyzpp8 data]#w
 15:35:23 up  1:10,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.33.2     14:25    0.00s  0.58s  0.00s w
[15:35:23 root@lucklyzpp8 data]#cat /proc/cpuinfo 
processor    : 0
vendor_id    : GenuineIntel
cpu family    : 6
model        : 142
model name    : Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
stepping    : 9
microcode    : 0x62
.............
[15:35:49 root@lucklyzpp8 data]#uptime 
 15:35:54 up  1:11,  1 user,  load average: 0.00, 0.00, 0.00
——————————————————————————————
什么原因导致cpu不正常了,系统的瓶颈在哪里,通过vmstat查看
r:有多少个进程处于run状态;1个cpu处理10个进程
b: 阻塞的进程;被网络,硬盘显示处理等待状态,卡死了,block;有多少个进程在等待
swapd:当数字不停变换,表示内存不够;如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器
si:有多少kb数据从swap进入到内存中
so:有多少从内存出来的到swap
bi:从磁盘读,判断磁盘读   
bo:从磁盘写,判断磁盘写
us:用户占用cpu,比如mysql,http,表示用户态的资源,长时间大于50,表示资源不够,一共是100
sy:系统态
id:空闲的
wa:等待cpu的百分百,有多少进程在等待,这列很大表示cpu不够用
——————————————————
[15:35:54 root@lucklyzpp8 data]#vmstat
进程                内存            交换分区     磁盘IO   系统        cpu
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 234164   3260 225864    0    0    47    10   74  163  1  1 98  0  0
[15:36:13 root@lucklyzpp8 data]#top | head -n9
top - 15:36:54 up  1:12,  1 user,  load average: 0.22, 0.06, 0.02
Tasks: 136 total,   1 running, 135 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.6 us,  5.6 sy,  0.0 ni, 77.8 id, 11.1 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    699.5 total,    227.9 free,    247.8 used,    223.8 buff/cache
MiB Swap:   5120.0 total,   5120.0 free,      0.0 used.    334.9 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                 
   1594 root      20   0  274288   4424   3800 R   6.7   0.6   0:00.01 top                     
      1 root      20   0  176752  10784   8348 S   0.0   1.5   0:02.64 systemd

top - 15:45:43 up  1:21,  1 user,  load average: 0.07, 0.05, 0.01
15:45:43:系统当前时间 
1 users:当前1用户在线 

Tasks: 135 total,   1 running, 134 sleeping,   0 stopped,   0 zombie
135 total:当前有135个任务 
1 running:1个任务正在运行 
134 sleeping:134个进程处于睡眠状态 
0 stopped:停止的进程数 
0 zombie:僵死的进程数

%Cpu(s):  0.0 us,  6.2 sy,  0.0 ni, 93.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
us:用户态进程占用CPU时间百分比 
sy:内核占用CPU时间百分比 
ni:renice值为负的任务的用户态进程的CPU时间百分比。nice是优先级的意思 

id:空闲CPU时间百分比
wa:等待I/O的CPU时间百分比
hi:CPU硬中断时间百分比
si:CPU软中断时间百分比

sar命令介绍。

监控系统状态
[15:45:44 root@lucklyzpp8 data]#yum install -y sysstat
15:57:18 root@lucklyzpp8 data]#sar -n DEV 1
Linux 4.18.0-193.el8.x86_64 (lucklyzpp8)     2021年10月18日     _x86_64_    (1 CPU)
15时58分28秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
15时58分29秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00  查看系统负载
[15:58:39 root@lucklyzpp8 data]#sar -q 1 5
Linux 4.18.0-193.el8.x86_64 (lucklyzpp8)     2021年10月18日     _x86_64_    (1 CPU)
15时59分51秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
15时59分52秒         0       361      0.00      0.04      0.01         0
15时59分53秒         0       361      0.00      0.04      0.01         0
15时59分54秒         0       361      0.00      0.04      0.01         0
15时59分55秒         0       361      0.00      0.04      0.01         0
15时59分56秒         0       361      0.00      0.04      0.01         0
平均时间:         0       361      0.00      0.04      0.01         0
监控cpu
[15:59:56 root@lucklyzpp8 data]#sar -u 1 3
Linux 4.18.0-193.el8.x86_64 (lucklyzpp8)     2021年10月18日     _x86_64_    (1 CPU)
16时00分34秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
16时00分35秒     all      0.00      0.00      0.00      0.00      0.00    100.00
16时00分36秒     all      0.00      0.00      1.98      0.00      0.00     98.02
16时00分37秒     all      0.00      0.00      0.00      0.00      0.00    100.00
平均时间:     all      0.00      0.00      0.67      0.00      0.00     99.33

IO传输速率的监控
[16:00:37 root@lucklyzpp8 data]#sar -b 3 3
Linux 4.18.0-193.el8.x86_64 (lucklyzpp8)     2021年10月18日     _x86_64_    (1 CPU)
16时01分34秒       tps      rtps      wtps   bread/s   bwrtn/s
16时01分37秒      0.00      0.00      0.00      0.00      0.00
16时01分40秒      0.00      0.00      0.00      0.00      0.00
16时01分43秒      0.00      0.00      0.00      0.00      0.00

 tps:每秒钟物理设备的 I/O 传输总量。
 rtps:每秒钟从物理设备读入的数据总量。
 wtps:每秒钟向物理设备写入的数据总量。
 bread/s:每秒钟从物理设备读入的数据量,单位为 块/s。
 bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s。

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

[16:26:20 root@lucklyzpp8 data]#bash ping.sh 
192.168.33.2 lived,Successed
192.168.33.1 lived,Successed
192.168.33.131 lived,Successed
192.168.33.127 lived,Successed
192.168.33.128 lived,Successed
192.168.33.222 lived,Successed
[16:26:49 root@lucklyzpp8 data]#cat ping.sh 
#!/bin/bash
#
Id=192.168.33.
for HostId in {1..254};do
{
    if /bin/ping -c 1 -W 1 $Id$HostId > /dev/null;then
        echo "$Id$HostId lived,Successed"
    else
        echo "$Id$HostId not lived,Failed"
    fi

} &
done
wait

[16:26:53 root@lucklyzpp8 data]#bash ping1.sh 
2 lived,Successed
1 lived,Successed
131 lived,Successed
128 lived,Successed
127 lived,Successed
222 lived,Successed
[16:28:01 root@lucklyzpp8 data]#cat ping1.sh 
#!/bin/bash
#
Id=192.168.33.
declare -i HostId=1
while [ $HostId -le 254 ];do
{       ping -c 1 -W 1 $Id$HostId > /dev/null
        if [ $? -eq 0 ];then
                echo "$NetId$HostId lived,Successed"
        else
                echo "$NetId$HostId no lived,Failed"
    fi
} &
    let HostId++
done
wait

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

[16:34:49 root@lucklyzpp8 data]#bash etcback.sh 
[16:35:02 root@lucklyzpp8 data]#ls /backup/
etcbak-2021-10-17-16.log  etcbak-2021-10-17-16.tar.gz
[16:35:26 root@lucklyzpp8 data]#cat etcback.sh 
#!/bin/bash
BackDir="/backup"
Filename_tar="etcbak-"`date -d "-1 days" +%Y-%m-%d-%H`".tar.gz"
Filename_log="etcbak-"`date -d "-1 days" +%Y-%m-%d-%H`".log"
[ ! -d $BackDir ]&& mkdir -p /backup
tar czvf $BackDir/$Filename_tar /etc > $BackDir/$Filename_log   2>&1

[16:38:57 root@lucklyzpp8 data]#crontab -l
30 1 * * 1-5 /data/etcback.sh

原文地址:https://www.cnblogs.com/zpkf/p/15421169.html