1、编写脚本实现登陆远程主机。(使用expect和shell脚本两种形式)。
expect形式
#!/usr/bin/expect
set timeout 20
set passwd "cqt@1234"
spawn ssh root@192.168.234.101
expect {
"yes/no" {send "yes\n"; exp_continue }
"password" { send "$passwd\n" }
}
interact
执行结果:可以成功登录到test02主机上。
[20:26:10 root@test01 ~]#./expect
spawn ssh root@192.168.234.101
root@192.168.234.101's password:
Last login: Sun Oct 31 20:18:20 2021 from 192.168.234.1
[20:26:42 root@test02 ~]#
[20:26:43 root@test02 ~]#
[20:26:43 root@test02 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:51:24:43 brd ff:ff:ff:ff:ff:ff
inet 192.168.234.101/24 brd 192.168.234.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::3bdc:97e4:318d:cfba/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[20:26:46 root@test02 ~]#exit
logout
Connection to 192.168.234.101 closed.
[20:26:49 root@test01 ~]#
shell脚本格式
#!/bin/bash
ip=$1
username=$2
passwd=$3
expect << EOF
set timeout 20
spawn ssh $username@$ip
expect {
"yes/no" { send "yes\n"; exp_continue }
"password" { send "$passwd\n" }
}
expect eof
EOF
shell脚本调用expect执行结果:
[21:44:05 root@test01 ~]#sh -x ssh.sh 192.168.234.101 root mage
+ ip=192.168.234.101
+ username=root
+ passwd=mage
+ expect
spawn ssh root@192.168.234.101
root@192.168.234.101's password:
Last login: Sun Oct 31 21:42:38 2021 from 192.168.234.100
[21:44:10 root@test02 ~]#
2、生成10个随机数保存于数组中,并找出其最大值和最小值
#!/bin/bash
declare -i min max
declare -a nums
for ((i=0;i<10;i++));do#第一次取第0个数据,最小和最大值都是他本身。继续循环,在取第1个数据,去和第0个数据判断谁大,如果大于max,则赋值新的数据给max,否则和min进行比较,如果小于min>,则把新的数据赋值给min,其他数据不赋值,依次循环,直到i取到9,打印最终的max和min。
nums[$i]=$RANDOM
[ $i -eq 0 ] && min=${nums[0]} && max=${nums[0]} && continue
[ ${nums[$i]} -gt $max ] && max=${nums[$i]} && continue
[ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done
echo "All numbers are ${nums[*]}"
echo "Max is $max"
echo "Min is $min"
[22:27:09 root@test01 ~]#sh arr.sh
All numbers are 7416 1808 15997 8906 12204 29804 25471 22347 13504 16552
Max is 29804
Min is 1808
[22:27:21 root@test01 ~]#sh arr.sh
All numbers are 4611 11917 26709 20207 23253 22523 12690 3644 7895 19816
Max is 26709
Min is 3644
[22:27:22 root@test01 ~]#sh arr.sh
All numbers are 2329 32290 8358 8388 18035 21923 30270 29207 20256 30949
Max is 32290
Min is 2329
3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
语法
declare(选项)(参数)
选项
-:给变量舍得类型属性
+:取消变量的类型属性
-a:将变量声明为数组型
-i:将变量声明为整型
-x:将变量声明为环境变量
-r:将变量声明为只读变量
-p:查看变量的被声明的类型
#!/bin/bash
read -p "输入数组内数值的个数" count
#将变量声明为数组型
declare -a nums
#生成随机数数组
for ((i=0;i<$count;i++));do
nums[$i]=$RANDOM
done
echo "原始数组:${nums[@]}"
#将变量声明为整型
declare -i n=$count
#根据数组的数量决定循环次数。
for ((i=0;i<n-1;i++));do
#内部循环,每次循环选出最小值。
for ((j=0;j<n-1-i;j++));do
let k=$j+1
#倒序,j和k进行比较,如果j小,则和k互换位置,依次循环,把第一趟的最小值换到最后1个位置。
if (( ${nums[$j]} < ${nums[$k]} ));then
#x作为中间量,进行j和k的互换。
x=${nums[$k]}
nums[$k]=${nums[$j]}
nums[$j]=$x
fi
done
done
echo "倒序后的数组为:${nums[*]}"
for ((i=0;i<=n-1;i++));do
for ((j=0;j<n-1-i;j++));do
let k=j+1
if (( ${nums[$j]} > ${nums[$k]} ));then
x=${nums[$k]}
nums[$k]=${nums[j]}
nums[$j]=$x
fi
done
done
echo "正序后的数组为:${nums[*]}"
[19:14:24 root@test01 ~]#sh arr1.sh
输入数组内数值的个数: 6
原始数组:29006 30736 5068 22609 22716 12899
倒序后的数组为:30736 29006 22716 22609 12899 5068
正序后的数组为:5068 12899 22609 22716 29006 30736
4、总结查看系统负载的几种命令,总结top命令的指标大概什么含义
查看系统负载的命令:
1, uptime
2, top
3, w
第一行解释:
#和uptime命令执行结果一样
top - 19:50:26 up 1:03, 3 users, load average: 0.06, 0.03, 0.05
load average:0.05, 0.05, 0.01:系统1分钟、5分钟、15分钟的CPU负载信息.
备注:load average后面三个数值的含义是最近1分钟、最近5分钟、最近15分钟系统的负载值。这个值的意义是,单位时间段内CPU活动进程数。如果你的机器为单核,那么只要这几个值均<1,代表系统就没有负载压力,如果你的机器为N核,那么必须是这几个值均<N才可认为系统没有负载压力。
第二行解释:
Tasks: 370 total, 2 running, 368 sleeping, 0 stopped, 0 zombie
370 total:当前有370个任务
2 running:2个任务正在运行
368 sleeping:368个进程处于睡眠状态
0 stopped:停止的进程数
0 zombie:僵死的进程数
第三行解释:
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
0.0%us:用户态进程占用CPU时间百分比
0.3%sy:内核占用CPU时间百分比
0.0%ni:renice值为负的任务的用户态进程的CPU时间百分比。nice是优先级的意思
99.7%id:空闲CPU时间百分比
0.0%wa:等待I/O的CPU时间百分比
0.0%hi:CPU硬中断时间百分比
0.0%si:CPU软中断时间百分比
第四行解释(free):
KiB Mem : 1868660 total, 1278252 free, 183340 used, 407068 buff/cache
1868660 total:物理内存总数
1278252 used: 使用的物理内存
183340 free:空闲的物理内存
407068 cached:用作缓存的内存
第五行解释:
KiB Swap: 2097148 total, 2097148 free, 0 used. 1486792 avail Mem
2097148 total:交换空间的总量
2097148 free:空闲的交换空间
0 used: 使用的交换空间
1486792 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:启动命令
5、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
for
#!/bin/bash
net=192.168.234
for ip in {1..254} ;
do
{
ping -W1 -c 1 $net.$ip &> /dev/null && echo "ping $net.$ip is successed!" || echo "ping $net.$ip is failed!"
} &
done
wait
while
#!/bin/bash
net=192.168.234
i=1
while ((i<255));
do
{
ping -W1 -c 1 $net.$i &> /dev/null && echo "ping $net.$i is success" || echo "ping $net.$i is fail"
} &
let i+=1
done
wait
~
6、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
[21:58:04 root@test01 backup]#crontab -l
30 1 * * 1-5 /home/backup.sh
[21:58:22 root@test01 backup]#cat /home/backup.sh
#!/bin/bash
/usr/bin/tar -cJPf /backup/etcbak-`date -d yesterday +%F-%H`.tar.xz /etc/
[21:58:00 root@test01 backup]#ls
etcbak-2021-11-06-21.tar.xz
[21:58:28 root@test01 backup]#date +%F-%H
2021-11-07-21