Linux shell练习2

实验环境为Ubuntu 20.04

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

脚本

#!/usr/bin/expect
# 

#设置登录主机IP
set ip 192.168.31.214
#设置登录用户
set user test
#设置登录用户密码
set password 123456
#设置超时时间
set timeout 10
spawn ssh $user@$ip
expect {
    "yes/no" { send "yes\n" ; exp_continue }
    "password" { send "$password\n" }
}
interact

测试

w@gw-computer:/data/scritps$ ./expect.sh 
spawn ssh test@192.168.31.214
$ 
shell

脚本

#!/bin/bash
# 
read -p "请输入想要登录的主机:" IP
read -p "请输入登录的用户:" user
#密码为静默输入
read -sp "请输入密码:" pass
sshpass -p $pass ssh ${user}@${IP}

测试

w@gw-computer:/data/scritps$ bash login.sh 
请输入想要登录的主机:192.168.31.214
请输入登录的用户:test
请输入密码:
$ 
2、生成10个随机数保存于数组中,并找出其最大值和最小值

脚本

#!/bin/bash
#
declare -i max
declare -i min
declare -a num
for i in {0..9};do
    num[$i]=`echo $RANDOM`
done
echo "生成的十个数为: ${num[*]}"

max=${num[0]}
min=${num[0]}

for i in {0..9};do
    ! [ $max -le ${num[i]} ] || max=${num[i]}
    ! [ $min -ge ${num[I]} ] || min=${num[i]}
done

echo "十个数中的最大值为:$max"
echo "十个数中的最小值为:$min"

测试

[root@OurLab scripts]# bash sortnum1.sh
生成的十个数为: 16716 21062 18805 15424 27836 8772 7795 22232 17837 16261
十个数中的最大值为:27836
十个数中的最小值为:15424
3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
脚本
!/bin/bash
# 

declare -a arr

#定义升序排序函数
asc (){
    echo "请从键盘输入您想排序的数字,以空格隔开,回车结束:"
    read -a arr
    len=${#arr[*]}
    #冒泡排序法
    for ((j=0;j<$len;j++));do
        for ((i=0;i<$len-1;i++));do
            if [ ${arr[$i]} -gt ${arr[$i+1]} ];then
                x=${arr[$i]}
                arr[$i]=${arr[$i+1]}
                arr[$i+1]=$x
            fi
        done
    done
    echo "升序排序后的结果为:" ${arr[*]}
}

#定义降序排序函数
desc (){
    echo "请从键盘输入您想排序的数字,以空格隔开,回车结束:"
    read -a arr
    len=${#arr[*]}
    #冒泡排序法
    for ((j=0;j<$len;j++));do
        for ((i=0;i<$len-1;i++));do
            if [ ${arr[$i]} -lt ${arr[$i+1]} ];then
                x=${arr[$i]}
                arr[$i]=${arr[$i+1]}
                arr[$i+1]=$x
            fi
        done
    done
    echo "降序排序后的结果为:" ${arr[*]}
}

#死循环,用于从键盘读取排序选项
while :
do
    read -p "请输入选项(a:升序排序,d:降序排序,q:退出程序):" flag
    case $flag in
    a)
        #调用升序排序函数,continue用于结束本次循环,但不退出死循环,用于下次选择
        asc
        continue
        ;;
    d)
        #调用降序排序函数,continue用于结束本次循环,但不退出死循环,用于下次选择
        desc
        ;;
    q)
        #break结束整个程序运行
        echo "结束程序,祝您笑口常开:)"
        break
        ;;
    *)
        #输入其他“非法”字符,需重新输入选项,continue用于结束本次循环,但不退出死循环,用于下次选择
        echo "输入选项错误,请重新输入:)"
        continue
        ;;
    esac
done
测试
gw@gw-computer:/data/scritps$ bash sort2.sh
请输入选项(a:升序排序,d:降序排序,q:退出程序):a
请从键盘输入您想排序的数字,以空格隔开,回车结束:
234 567 87654 345 6545 45 5465
升序排序后的结果为: 45 234 345 567 5465 6545 87654
请输入选项(a:升序排序,d:降序排序,q:退出程序):d
请从键盘输入您想排序的数字,以空格隔开,回车结束:
345 234 567 345 2345 667788 234 123 45 
降序排序后的结果为: 667788 2345 567 345 345 234 234 123 45
请输入选项(a:升序排序,d:降序排序,q:退出程序):1
输入选项错误,请重新输入:)
请输入选项(a:升序排序,d:降序排序,q:退出程序):q
结束程序,祝您笑口常开:)
4、总结查看系统负载的几种命令,总结top命令的指标大概什么含义(不要求全部写出来)
1)top
top - 20:08:14 up 42 min,  1 user,  load average: 0.87, 0.72, 0.56
Tasks: 280 total,   1 running, 278 sleeping,   0 stopped,   1 zombie
%Cpu(s):  5.3 us,  2.7 sy,  0.0 ni, 92.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  23877.8 total,  18827.4 free,   2516.7 used,   2533.7 buff/cache
MiB Swap:   7698.0 total,   7698.0 free,      0.0 used.  20403.4 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                           
   1668 gw        20   0 1183844  93608  51672 S  11.8   0.4   2:14.02 Xorg                                                                                                                              
   5163 gw        20   0   20656   4176   3340 R  11.8   0.0   0:00.04 top                                                                                                                               
   1824 gw        20   0 4987220 286096 115876 S   5.9   1.2   2:39.10 gnome-shell                                                                                                                       
   3349 gw        20   0 2911620 244920 160504 S   5.9   1.0   0:30.52 Web Content                                                                                                                       
   4074 gw        20   0 2847640 217784 144628 S   5.9   0.9   0:19.55 Web Content                                             

第一行:

top - 20:08:14 up 42 min, 1 user, load average: 0.87, 0.72, 0.56
20:08:14:系统当前时间
up 42 min:系统开机到现在经过了42分钟
1 users:当前1用户在线
load average:0.87, 0.72, 0.56:系统1分钟、5分钟、15分钟的CPU负载信息
备注:load average后面三个数值的含义是最近1分钟、最近5分钟、最近15分钟系统的负载值。这个值的意义是,单位时间段内CPU活动进程数。如果你的机器为单核,那么只要这几个值均<1,代表系统就没有负载压力,如果你的机器为N核,那么必须是这几个值均<N才可认为系统没有负载压力。

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

第三行:
%Cpu(s): 5.3 us, 2.7 sy, 0.0 ni, 92.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
5.3 us:用户态进程占用CPU时间百分比
2.7 sy:内核占用CPU时间百分比
0.0 ni:renice值为负的任务的用户态进程的CPU时间百分比,nice是优先级的意思
92.0 id:空闲CPU时间百分比
0.0 wa:等待I/O的CPU时间百分比
0.0 hi:CPU硬中断时间百分比
0.0 si:CPU软中断时间百分比
0.0 st:当前VM中的cpu cycle被虚拟化偷走的比例

第四行:
MiB Mem : 23877.8 total, 18827.4 free, 2516.7 used, 2533.7 buff/cache
323877.8 total:物理内存总数
18827.4 free:空闲的物理内存
2516.7 used: 使用的物理内存
2533.7 cached:用作缓存的内存

第五行:
MiB Mem : 23877.8 total, 18827.4 free, 2516.7 used, 2533.7 buff/cache
23877.8 total:交换空间的总量
18827.4 free:空闲的交换空间
2516.7 used: 使用的交换空间
2533.7 cached:缓存的交换空间

最后一行:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID:进程ID
USER:进程的所有者
PR:进程的优先级
NI:nice值
VIRT:占用的虚拟内存
RES:占用的物理内存
SHR:使用的共享内存
S:进行状态 S:休眠 R运行 Z僵尸进程 N nice值为负
%CPU:占用的CPU
%MEM:占用内存
TIME+: 占用CPU的时间的累加值
COMMAND:启动命令

2) uptime
gw@gw-computer:/data/scritps$ uptime 
 20:18:14 up 52 min,  1 user,  load average: 0.82, 0.69, 0.60
3) w
gw@gw-computer:/data/scritps$ w
 20:18:38 up 52 min,  1 user,  load average: 0.54, 0.64, 0.58
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
gw       :0       :0               19:26   ?xdm?  20:40   0.00s /usr/lib/gdm3/gdm-x-session --run-script env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session --systemd --session=ubuntu
4) vmstat
gw@gw-computer:/data/scritps$ 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 19121792 123056 2517112    0    0    66    24  188  524  4  1 94  0  0
5、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
1).while

脚本

#!/bin/bash
# 

declare -i i=1
#192.168.0.0/24网段,192.168.0.255为广播地址,不用检测
while [ $i -le 254 ];do
    #判断此次命令的执行结果,并将输出到终端的内容输出到/dev/null中
    #ping设置连接超时时间为1s,减少脚本运行时间,但是可能会出现错误的判断
    #ping3次,与缩短超时时间出现的错误率互补
    if  ping -W 1 -c 3 192.168.0.$i >> /dev/null;then
        echo "192.168.0.$i:success!"
    else
        echo "192.168.0.$i:fail!"
    fi
    #i使循环变量每次循环加1,实现所有IP全部被扫到
    let i+=1
done

测试

gw@gw-computer:/data/scritps$ bash ping1.sh 
192.168.0.1:fail!
192.168.0.2:fail!
192.168.0.3:fail!
192.168.0.4:fail!
192.168.0.5:fail!
······
2).for

脚本

#!/bin/bash
# 

#192.168.0.0/24网段,192.168.0.255为广播地址,不用检测
for ((i=1;i<=254;i++));do
    #判断此次命令的执行结果,并将输出到终端的内容输出到/dev/null中
    #ping设置连接超时时间为1s,减少脚本运行时间,但是可能会出现错误的判断
    #ping3次,与缩短超时时间出现的错误率互补
    if  ping -W 1 -c 1  192.168.0.$i >> /dev/null;then
        echo "192.168.0.$i:success!"
    else
        echo "192.168.0.$i:fail!"
    fi
done

测试

gw@gw-computer:/data/scritps$ bash ping2.sh 
192.168.0.1:fail!
192.168.0.2:fail!
192.168.0.3:fail!
192.168.0.4:fail!
192.168.0.5:fail!
6、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间

备份脚本

#!/bin/bash
# 

#如果/backup路径不存在,则创建backup文件夹
[ -d /backup ] || mkdir /backup
backname=`etcbak-date -d-1day +%F-%H`
tar -Jcvf /backup/${backname}.tar.xz /etc/ &> /dev/null

添加定时任务,因为不是root用户登录,使用root用户创建定时任务

#分	   时   日   月  周(0表示周天)
 30 	1 	 * 	 *	 0  /bin/bash /data/scripts/etcback.sh
posted @ 2021-08-15 21:45  温白开  阅读(116)  评论(0编辑  收藏  举报