1、编写脚本实现登陆远程主机。(使用expect和shell脚本两种形式)
expect格式+执行效果
[root@centos8:~]#
vim ssh.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
interact
执行效果
[root@centos8:~]#
chmod +x ssh.exp
[root@centos8:~]#
./ssh.exp 10.0.0.7 root 123456
spawn ssh root@10.0.0.7
root@10.0.0.7's password:
Last failed login: Tue Mar 22 20:23:53 CST 2022 from 10.0.0.8 on ssh:notty
There were 2 failed login attempts since the last successful login.
Last login: Tue Mar 22 20:13:15 2022 from 10.0.0.8
[20:29:50 root@centos7 ~]#
shell脚本格式+执行效果
[root@centos8:~]#
vim ssh.sh
#!/bin/bash
ip=$1
user=$2
password=$3
expect <<EOF
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect eof
EOF
执行效果
[root@centos8:~]#
bash ssh.sh 10.0.0.7 root 123456
spawn ssh root@10.0.0.7
root@10.0.0.7's password:
Last login: Tue Mar 22 20:35:42 2022 from 10.0.0.8
[20:43:46 root@centos7 ~]#
2、生成10个随机数保存于数组中,并找出其最大值和最小值
[root@centos8:~]#
vim max_min.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[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
执行效果
[root@centos8:~]#
bash max_min.sh
All numbers are 24187 27783 16818 18761 23160 11817 15228 414 27041 29505
Max is 29505
Min is 414
3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
[root@centos8:~]#
vim bubb.sh
#!/bin/bash
read -p "请输入数值个数:" COUNT
declare -a num
for ((i=0;i<$COUNT;i++));do
num[$i]=$RANDOM
done
echo "The initial array:"
echo ${num[@]}
for (( i=0; i<$COUNT-1; i++ ));do
for (( j=0; j<$COUNT-1-i; j++ ));do
let x=$j+1
if [ ${num[$j]} -lt ${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[$(($COUNT-1))]}"
执行:
[root@centos8:~]#
bash bubb.sh
请输入数值个数:6
The initial array:
11234 5016 3473 12924 5650 11792
After sort:
12924 11792 11234 5650 5016 3473
the max integer is 12924,the min integer is 3473
4、总结查看系统负载的几种命令,总结top命令的指标大概什么含义(不要求全部写出来)
答:查询负载的命令有以下命令:
1.uptime:查询中显示两个时间,分别是系统启动时长和空闲进程的总时长(按总的CPU核数计算)
[root@centos8:~]#
uptime
22:04:51 up 7:45, 2 users, load average: 0.00, 0.01, 0.00
分别对应的是当前时间,启动后运行的时长,用户登录数 ,前 1、5 和 15 分钟系统的平均负载。
2.mpstat:实时系统监控工具,报告CPU的一些统计信息,存放于/proc/stat文件中,在多CPU系统里。其不但能查看所有CPU信息,也能查看特定的CPU信息。
[root@centos8:~]#
mpstat
Linux 4.18.0-348.el8.x86_64 (centos8.wwzroom.org) 03/22/2022 _x86_64_ (2 CPU)
10:14:14 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:14:14 PM all 0.22 0.00 0.18 0.30 0.22 0.07 0.00 0.00 0.00 99.01
输出参数的含义:
参数 | 释义 | 从/proc/stat获得的数据 |
---|---|---|
cpu | 处理器id | |
%usr | 在internal时间段里,用户态的CPU时间(%),不包含 nice值为负进程 | usr/total*100 |
%nice | 在internal时间段里,nice值为负进程的CPU时间(%) | nice/total*100 |
%sys | 在internal时间段里,核心时间(%) | system/total*100 |
%iowait | 在internal时间段里,硬盘IO等待时间(%) | iowait/total*100 |
%irq | 在internal时间段里,硬中断时间(%) | irq/total*100 |
%soft | 在internal时间段里,软中断时间(%) | softirq/total*100 |
%steal | 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比 | steal/total*100 |
%guest | 显示运行虚拟处理器时CPU花费时间的百分比 | guest/total*100 |
%gnice | gnice/total*100 | |
%idle | 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) | idle/total*100 |
3.top和htop:top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。默认进入top时,各进程是按照CPU的占用量来排序的。
有许多内部命令:
帮助:h 或 ? ,按 q 或esc 退出帮助
排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1 (数字)
memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W
[root@centos8:~]#
top
top - 22:50:09 up 8:30, 2 users, load average: 0.03, 0.02, 0.00
Tasks: 227 total, 1 running, 226 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 0.8 sy, 0.0 ni, 97.3 id, 0.0 wa, 0.8 hi, 0.2 si, 0.0 st
MiB Mem : 2958.0 total, 958.4 free, 845.8 used, 1153.9 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1914.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 173288 11344 8068 S 0.7 0.4 0:03.08 systemd
863 root 20 0 292140 11844 9980 S 0.7 0.4 1:03.12 vmtoolsd
27 root 20 0 0 0 0 S 0.3 0.0 0:00.01 kauditd
853 dbus 20 0 84820 7988 5988 S 0.3 0.3 0:01.94 dbus-daemon
第一行信息和uptime信息相同,
第二行和第三行为进程和cpu的信息
当有多个CPU时,这些内容可能会超过两行,其参数如下:
内容 | 含义 |
---|---|
227 total | 进程总数 |
1 running | 正在运行的进程数 |
226 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
0.8 us | 用户空间占用CPU百分比 |
0.8 sy | 内核空间占用CPU百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
97.3 id | 空闲CPU百分比 |
0.0 wa | 等待输入输出的CPU时间百分比 |
0.8 hi | 硬中断(Hardware IRQ)占用CPU的百分比 |
0.2 si | 软中断(Software Interrupts)占用CPU的百分比 |
0.0 st | 用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间。 |
第4、5行为内存信息
其参数如下:
内容 | 含义 |
---|---|
MiB Mem: 2958.0 total | 物理内存总量 |
954.2 free | 空闲内存总量 |
847.6 used | 使用的物理内存总量 |
1156.2 buff/cache | 用作内核缓存的内存量 |
MiB Swap: 2048.0 total | 交换区总量 |
2048.0 free | 空闲交换区总量 |
0.0 used | 使用的交换区总量 |
1912.2 avail Mem | 代表可用于进程下一次分配的物理内存数量 |
计算可用内存数有一个近似的公式:
第四行的free + 第四行的buffers + 第五行的cached
进程信息:
列名 | 含义 |
---|---|
PID | 进程id |
PPID | 父进程id |
RUSER | Real user name |
UID | 进程所有者的用户id |
USER | 进程所有者的用户名 |
GROUP | 进程所有者的组名 |
TTY | 启动进程的终端名。不是从终端启动的进程则显示为 |
PR | 优先级 |
NI | nice值。负值表示高优先级,正值表示低优先级 |
P | 最后使用的CPU,仅在多CPU环境下有意义 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
TIME | 进程使用的CPU时间总计,单位秒 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
%MEM | 进程使用的物理内存百分比 |
VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
SWAP | 进程使用的虚拟内存中,被换出的大小,单位kb |
RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
CODE | 可执行代码占用的物理内存大小,单位kb |
DATA | 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb |
SHR | 共享内存大小,单位kb |
nFLT | 页面错误次数 |
nDRT | 最后一次写入到现在,被修改过的页面数。 |
S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
COMMAND | 命令名/命令行 |
WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
Flags | 任务标志 |
htop命令时增强版的top命令,来自epel源,比top功能更强。
5、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
for循环
[root@centos8:~]#
vim ping192.168.0.sh
#!/bin/bash
net=192.168.0
for i in {1..254};do
{
if
ping -c1 -w1 ${net}.${i} &>/dev/null;then
echo $net.$i is success!
else
echo $net.$i is fail!
fi
}&
done
wait
执行:
[root@centos8:~]#
bash ping192.168.0.sh
192.168.0.1 is fail!
192.168.0.4 is fail!
192.168.0.5 is fail!
while循环
[root@centos8:~]#
vim ping192.168.0while.sh
#!/bin/bash
net=192.168.0
declare -i address=1
while [ $address -le 254 ];do
{
ping -c1 -w1 ${net}.${address} &>/dev/null
if [ $? -eq 0 ];then
echo $net.$address is success!
else
echo $net.$address is fail!
fi
}&
let address++
done
wait
执行:
[root@centos8:~]#
bash ping192.168.0while.sh
192.168.0.1 is fail!
192.168.0.13 is fail!
192.168.0.4 is fail!
192.168.0.5 is fail!
192.168.0.8 is fail!
192.168.0.15 is fail!
192.168.0.10 is fail!
6、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
1.编写备份打包脚本
[root@centos8:~]#
vim etcback.sh
#!/bin/bash
DIR=etcbak-`date -d '-1 day' +%Y-%m-%d-%H`
tar -Jcvf /backup/${DIR}.tar.xz /etc/ &> /dev/null
2.创建cron
[root@centos8:~]#
crontab -e
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
30 1 * * 1-5 bash etcback.sh