1、编写脚本实现登陆远程主机。(使用expect和shell脚本两种形式)
脚本形式:
#!/bin/bash
#****************************************************************************************#
#Author:
#QQ:
#Date: 2021-10-14
#FileName: ssh.sh
#URL:
#Description: non-interactive SSH script
#Copyright (C): 2021 All rights reserved
#*******************************定义颜色*************************************************#
RED="\e[1;31m"
GREEN="\e[1;32m"
SKYBLUE="\e[1;36m"
YELLOW="\e[1;43m"
BLUE="\e[1;44m"
END="\e[0m"
RandomColor="\e[1;34m"
#****************************************************************************************#
declare -A hosts
Move="echo -en \E[8G"
#如果位置参数是一个包含username:password:ip格式的文件,则将文件内容存储为数组
function arr_user {
#好像j的值是会变成最后一次循环后的值,没具体确认
j=1
for i in `grep -oE "^\w+" $1`;do
hosts[user$j]=$i
#echo $j is ${hosts[user$j]}
((j = ++j))
done
j=1
for l in `sed -nr 's/\w+\:(\w+)\:(.*)/\1/p' $1`;do
hosts[passwd$j]=$l
#echo $j is ${hosts[passwd$j]}
((j = ++j))
done
j=1
for k in `sed -nr 's/\w+\:(\w+)\:(.*)/\2/p' $1`;do
hosts[ip$j]=$k
#echo $j is ${hosts[ip$j]}
((j = ++j))
done
}
#ssh非交互式登录函数
function expect_ssh {
expect <<haha
set timeout 20
spawn ssh $1@$3
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$2\n";exp_continue }
-re "#|Ubuntu" { send "exit\n" } -re "refused|No\\\sroute" { send "Connection failed!\n" }
}
expect eof
haha
}
#arr_user $1
#echo ${hosts[*]}
#for ((e=1;e<=3;e++));do
# echo ${hosts[user$e]}
# echo ${hosts[passwd$e]}
3 echo ${hosts[ip$e]}
#done
[ $# -eq 0 ] && { echo -n "Usage: " && $Move; echo "`basename $0` /PATH/TO/FILENAME";$Move; echo "`basename $0` USERNAME PASSWD IP";exit; }
if [ -f $1 ];then
arr_user $1
number=`cat $1 | wc -l`
for (( n=1;n<=$number;n++ ));do
expect_ssh ${hosts[user$n]} ${hosts[passwd$n]} ${hosts[ip$n]}
done
exit
else
expect_ssh $1 $2 $3
exit
fi
expect形式
#!/usr/bin/expect
set user [lindex $argv 0]
set passwd [lindex $argv 1]
set ip [lindex $argv 2]
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$passwd\n";exp_continue }
-re "#|Ubuntu" { send "exit\n" } -re "refused|No\\\sroute" { send "Connection failed!\n" }
}
expect eof
2、生成10个随机数保存于数组中,并找出其最大值和最小值
#!/bin/bash
declare -A number
function Random_number {
for ((i=0;i<=9;i++));do
number[digit[$i]]=$RANDOM
done
echo "Random Number Range: ${number[*]}"
}
Random_number
max=0
min=0
for j in `seq 0 9`;do
[ ${number[digit[$j]]} -gt $max ] && max=${number[digit[$j]]}
#cmd1和cmd2任意一个执行成功都执行cmd3
[ $min -eq 0 ] || [ ${number[digit[$j]]} -lt $min ] && min=${number[digit[$j]]}
done
echo "Max number is: $max"
echo "Min number is: $min"
3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
#!/bin/bash
#****************************************************************************************#
#Author: Yb11
#QQ: 394960885
#Date: 2021-10-15
#FileName: bubble_sort.sh
#URL: https://github.com/yabao11
#Description: Bubble_sort
#Copyright (C): 2021 All rights reserved
#*******************************定义颜色*************************************************#
RED="\e[1;31m"
GREEN="\e[1;32m"
SKYBLUE="\e[1;36m"
YELLOW="\e[1;43m"
BLUE="\e[1;44m"
END="\e[0m"
RandomColor="\e[1;34m"
#****************************************************************************************#
function Random_number {
if [[ $1 =~ [[:digit:]]+ ]];then
for ((i=0;i<$1;i++));do
number[$i]=$RANDOM
done
echo "Random Number range: ${number[@]}"
echo
elif [[ $1 =~ \-h ]];then
echo "[help info]"
else
echo "Wrong Number!"
echo "[help info]"
fi
}
function bubble_sort {
for ((j=0;j<$1;j++));do
for ((k=0;k<$1;k++));do
l=$[$k + 1]
if [[ $2 =~ \-i ]];then
if [ $l -eq $1 ];then
break
elif [ ${number[$k]} -gt ${number[$l]} ];then
{ temp=${number[$l]};number[$l]=${number[$k]};number[$k]=$temp; }
else
continue
fi
elif [[ $2 =~ \-d ]];then
if [ $l -eq $1 ];then
break
elif [ ${number[$k]} -lt ${number[$l]} ];then
{ temp=${number[$l]};number[$l]=${number[$k]};number[$k]=$temp; }
else
continue
fi
else
echo "Wrong option!"
echo
fi
done
done
}
Random_number $1
if [[ $1 =~ [[:digit:]]+ ]];then
for ((j=0;j<$1;j++));do
bubble_sort $1 $2
done
else
echo "Usage: "
echo " `basename $0` NUMBER [-i|-d] "
echo " `basename $0` -h"
echo
echo "[options]"
echo "-i increasing"
echo "-d decreasing"
exit
fi
#echo ${number[*]} | sort -n
for m in `seq 0 $1`;do
echo ${number[$m]}
done
4、总结查看系统负载的几种命令,总结top命令的指标大概什么含义(不要求全部写出来)
uptime:查看系统平均负载
mpstat:百分比显示CPU利用率的各项指标
top和htop:查看进程的实时状态
free:查看内存空间的使用状态
pmap:查看进程对应的内存映射,可以看到进程依赖的子模块占用的内存数量,可以以此判断OOM
vmstat:查看虚拟内存的信息,可以以用户定义的间隔不断刷新状态,能够看到内存与SWAP、磁盘之间的IO情况;
iostat:能够看到更丰富的IO性能状态,可以自定义刷新间隔判断哪块硬盘的IO比较繁忙;-x参数可以看到磁盘基于扇区的IO,队列长度,处理时间等
iotop:以top方式监控磁盘的I/O,实时监控,而且可以只显示正在执行读写的进程,提供很多非交互式参数;
iftop:显示网络带宽的使用情况,查看访问当前主机的流量的实时信息,实时连接等;
nload:只能以接口为单位查看实时吞吐量,看不到连接信息,只有速率信息;
top命令的指标
top - 17:21:28 up 8:49, 2 users, load average: 0.00, 0.02, 0.07
Tasks: 148 total, 1 running, 145 sleeping, 2 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.2 hi, 0.2 si, 0.0 st
MiB Mem : 1790.4 total, 1274.4 free, 225.1 used, 290.9 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1387.5 avail Mem
PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND
879 2.2 229132 40800 288 1356 39140 10 0 0.0 sssd_nss
809 1.5 416616 28400 8 37804 15136 53 0 0.0 tuned
775 1.3 1628184 23316 104 54744 17040 75 0 0.0 polkitd
777 1.0 391668 18464 3344 26896 16056 60 0 0.0 NetworkManager
851 0.8 227520 15356 224 2132 12804 9 0 0.0 sssd_be
646 0.8 128924 14548 304 5972 8348 9 0 0.0 systemd-udevd
773 0.8 218960 14500 80 1640 12452 26 0 0.0 sssd
1 0.8 185928 14060 1288 20808 9252 75 0 0.0 systemd
897 0.7 217660 12404 664 22136 3508 10 0 0.0 rsyslogd
top - 17:21:28 up 8:49, 2 users, load average: 0.00, 0.02, 0.07
`当前时间` `开机时间` `当前登录用户数` `平均负载,5分钟、10分钟、15分钟`
Tasks: 148 total, 1 running, 145 sleeping, 2 stopped, 0 zombie
`总任务数` `当前正在运行的任务数` `处于休眠的任务数` `停止状态的任务数` `僵尸态的进程数`
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.2 hi, 0.2 si, 0.0 st
上一次刷新后间隔内CPU状态的百分比情况;是多核CPU的平均值,可以按1切换显示为独立的CPU统计;
us:用户空间内没有nice调整过优先级的进程运行的时间
sy:内核空间进程运行的时间
ni:调整过nice的用户空间进程运行时间
id:空闲时间
wa:等待IO的时间
hi,硬中断时间
si,软中断(模式切换)
st,虚拟机偷走的时间(虚拟机内进程执行的时间)
MiB Mem : 1790.4 total, 1274.4 free, 225.1 used, 290.9 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1387.5 avail Mem
内存和交换分区的使用情况:
total:总大小
free:空闲大小,加上buff/cache后是真正可以使用的总空闲空间
used:已使用的大小
buff/cache:数据缓存占用的大小
PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND
PID:进程ID
%MEM:内存使用百分比
VIRT:使用的虚拟内存大小,包括已经被映射但还未被使用的页表
RES:使用的物理内存大小
CODE:可用于执行代码的物理内存数量
DATA:进程保留的私有内存空间,可能还未被映射到物理内存,但已经被算到虚拟内存空间中
SHR:共享内存空间,可以被其他进程共享
PR:top命令显示的优先级0-39之间,越小
NI:nice优先级
%CPU:CPU利用率
TIME+:进程启动之后占用的CPU时间,是时间片的累计
COMMAND:进程关联程序的名称,或启动进程的命令
5、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
for实现
#!/bin/bash
for ip in `seq 254`;do
echo -n "ping 192.168.0.$ip ...."
ping 192.168.0.$ip -c 1 -w 1 &> /dev/null
if [ $? == 0 ]; then
echo "success!"
else
echo "fail!"
fi
done
while实现
#!/bin/bash
ip=1
while ((ip<=254));do
echo -n "ping 192.168.0.$ip ...."
ping 192.168.0.$ip -c 1 -w 1 &> /dev/null
if [ $? == 0 ]; then
echo "success!"
else
echo "fail!"
fi
let ip++
done
6、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
想不到这道题坑这么多
[root@centos8mini ~]# crontab -l
PATH=/root:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
30 1 * * * backup.sh
[root@centos8mini ~]# cat backup.sh
#!/bin/bash
[[ `date +%w` =~ [1-5] ]] && tar -cJPf /backup/etcbak-`date -d -1day +%F-%H`.tar.xz /etc || exit