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