项目三 项目实训(Shell循环控制)
【实训任务】
本实训的主要任务是使用for、while等语句编写循环控制脚本,从而提高Shell脚本的逻辑处理能力。
【实训目的】
(1)理解循环控制的基本概念。
(2)掌握for语句的基本语法,能够编写for循环控制脚本。
(3)掌握while语句的基本语法,能够编写while循环控制脚本。
【实训内容】
(1)编写shell脚本,使用for语句循环遍历备份目录列表,依次对每个目录进行备份,并将备份文件传输到远程服务器。
(2)编写shell脚本,使用for语句监控系统的CPU和内存使用情况,定期输出监控数据。
(3)编写shell脚本,使用while语句创建用户并设置其密码。
(4)编写shell脚本,使用while语句监控当前系统的网络连接信息。
【实训环境】
在进行本项目的实训操作前,提前准备好Linux操作系统环境,RHEL、CentOS Stream、Debian、Ubuntu、华为openEuler、麒麟openKylin等常见Linux发行版都可以进行项目实训。
项目实施
任务一 编写for语句脚本
1.任务描述
(1)在Linux操作系统中创建shell脚本for-multiplication.sh,使用for语句输出九九乘法表。
(2)在Linux操作系统中创建shell脚本for-backup.sh,通过for语句遍历备份目录列表,依次对每个目录进行备份,并将备份文件传输到远程服务器。
(3)在Linux操作系统中创建shell脚本for-monitor.sh,使用for语句监控系统的CPU和内存使用情况,定期输出监控数据。
2.任务实施
(1)在huawei用户家目录中,创建脚本文件for-multiplication.sh。
[root@redhat01 ~]# vim for-multiplication.sh
[root@redhat01 ~]# cat for-multiplication.sh
#!/bin/bash
for ((i=1; i<=9; i++))
do
for ((j=1; j<=i; j++))
do
product=$((i * j))
echo -n "$i*$j=$product "
done
echo
done
[root@redhat01 ~]# bash for-multiplication.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
(2)在huawei用户家目录中,创建脚本文件for-backup.sh。
[root@redhat01 ~]# vim for-backup.sh
[root@redhat01 ~]# cat for-backup.sh //此脚本不用执行
#!/bin/bash
backup_dirs=("/etc" "/mnt" "/tmp")
dest_dir="/backup"
dest_server="node1"
backup_date=$(date +%b-%d-%y)
echo "Starting backup of: ${backup_dirs[@]}"
for i in "${backup_dirs[@]}"; do
sudo tar -Pczf /tmp/$i-$backup_date.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i backup succeeded."
else
echo "$i backup failed."
fi
scp /tmp/$i-$backup_date.tar.gz $dest_server:$dest_dir
if [ $? -eq 0 ]; then
echo "$i transfer succeeded."
else
echo "$i transfer failed."
fi
done
sudo rm /tmp/*.gz
echo "Backup is done."
(3)在huawei用户家目录中,创建脚本文件for-monitor.sh。
[root@redhat01 ~]# vim for-monitor.sh
[root@redhat01 ~]# cat for-monitor.sh
#!/bin/bash
# 监控时间间隔(单位为s)
interval=3
# 循环次数
max_loops=10
# 监控CPU和内存使用情况
for ((i=1; i<=$max_loops; i++))
do
timestamp=$(date +%H:%M:%S)
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
# 获取内存使用率
mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
echo "[$timestamp] CPU使用率:$cpu_usage% 内存使用率:$mem_usage%"
sleep $interval
done
[root@redhat01 ~]# bash for-monitor.sh
[10:55:32] CPU使用率:3% 内存使用率:47.6417%
[10:55:35] CPU使用率:0% 内存使用率:47.663%
[10:55:39] CPU使用率:0% 内存使用率:48.4943%
[10:55:42] CPU使用率:5.8% 内存使用率:48.4943%
[10:55:45] CPU使用率:3.1% 内存使用率:48.4943%
[10:55:48] CPU使用率:0% 内存使用率:47.2879%
[10:55:51] CPU使用率:3.2% 内存使用率:47.3096%
[10:55:55] CPU使用率:6% 内存使用率:47.3096%
[10:55:58] CPU使用率:0% 内存使用率:47.5432%
^C
//执行完会实时输出,使用ctrl+c终止即可
任务二 编写while语句脚本
1.任务描述
(1)在Linux操作系统中创建shell脚本while-useradd.sh,使用while语句和计数器变量迭代创建用户并设置其密码,同时,将每个用户的用户名和密码写入文件,以便后续参考和使用。
(2)在Linux操作系统中创建shell脚本while-userdel.sh,使用while语句和计数器变量迭代删除用户,在循环内部,通过id命令检查用户是否存在,如果存在则使用userdel命令删除用户,否则输出用户不存在的信息。
(3)在Linux操作系统中创建shell脚本while-netstat.sh,用于监控当前系统的网络连接信息。
2.任务实施
(1)在huawei用户家目录中,创建脚本文件while-useradd.sh。
[root@redhat01 ~]# vim while-useradd.sh
[root@redhat01 ~]# cat while-useradd.sh
#!/bin/bash
# 创建一个文件来存储用户名和密码
password_file="passwords.txt"
> "$password_file" # 清空文件内容
count=1
# 循环创建10个用户
while [ $count -le 10 ]
do
# 生成随机密码
password=$(openssl rand -base64 12 | tr -dc 'a-zA-Z0-9' | head -c 10)
# 创建用户
username="user$count"
useradd "$username"
# 设置密码
echo "$username:$password" | chpasswd
# 将用户名和密码写入文件
echo "Username: $username" >> "$password_file"
echo "Password: $password" >> "$password_file"
echo "---------------------" >> "$password_file"
count=$((count + 1))
done
echo "用户创建和密码设置完成!密码已保存到 $password_file 文件中。"
[root@redhat01 ~]# bash while-useradd.sh
用户创建和密码设置完成!密码已保存到 passwords.txt 文件中。
(2)在huawei用户家目录中,创建脚本文件while-userdel.sh。
[root@redhat01 ~]# vim while-userdel.sh
[root@redhat01 ~]# cat while-userdel.sh
#!/bin/bash
count=1
# 循环删除10个用户
while [ $count -le 10 ]
do
username="user$count"
# 检查用户是否存在
if id "$username" >/dev/null 2>&1; then
# 删除用户
userdel -r "$username"
echo "用户 $username 删除成功。"
else
echo "用户 $username 不存在。"
fi
count=$((count + 1))
done
[root@redhat01 ~]# bash while-userdel.sh
用户 user1 删除成功。
用户 user2 删除成功。
用户 user3 删除成功。
用户 user4 删除成功。
用户 user5 删除成功。
用户 user6 删除成功。
用户 user7 删除成功。
用户 user8 删除成功。
用户 user9 删除成功。
用户 user10 删除成功。
(3)在huawei用户家目录中,创建脚本文件while-netstat.sh。
[root@redhat01 ~]# vim while-netstat.sh
[root@redhat01 ~]# cat while-netstat.sh
#!/bin/bash
# 循环执行netstat和grep命令
while true; do
# 获取HTTP服务连接信息
HTTP_CONNECTIONS=$(netstat -an | grep :80)
# 统计HTTP服务监听状态的连接数量
LISTEN_CONNECTIONS=$(echo "$HTTP_CONNECTIONS" | grep "LISTEN" | wc -l)
# 统计HTTP服务建立连接的数量
ESTABLISHED_CONNECTIONS=$(echo "$HTTP_CONNECTIONS" | grep "ESTABLISHED" | wc -l)
# 统计HTTP服务连接的总数
TOTAL_CONNECTIONS=$(echo "$HTTP_CONNECTIONS" | wc -l)
# 输出统计信息
echo "HTTP connections in LISTEN state: $LISTEN_CONNECTIONS"
echo "HTTP connections in ESTABLISHED state: $ESTABLISHED_CONNECTIONS"
echo "Total HTTP connections: $TOTAL_CONNECTIONS"
# 等待2s
sleep 2
done
[root@redhat01 ~]# bash while-netstat.sh
HTTP connections in LISTEN state: 0
HTTP connections in ESTABLISHED state: 0
Total HTTP connections: 1
HTTP connections in LISTEN state: 0
HTTP connections in ESTABLISHED state: 0
Total HTTP connections: 1
HTTP connections in LISTEN state: 0
HTTP connections in ESTABLISHED state: 0
Total HTTP connections: 1
^C
//CTRL+c终止