Shell-day06
1. 上周知识点回顾
1. Shell的基本介绍
Shell编程介绍 交互式和非交互式
为什么要学习Shell
如何学习Shell
Shell能做什么
Shell的开发规范及习惯
Shell的执行方式
登录式和非登录式的区别
2. Shell变量
Shell变量介绍
用户自定义变量
系统环境变量应用 export
位置变量 脚本的传参 $1 $2 ..
特殊变量 预定义变量
命令的嵌套 $($())
Shell变量的赋值Read
Read的示例语法
修改主机名脚本
修改IP地址脚本
判断IP地址是否通畅脚本
监控内存的使用率脚本
备份场景脚本 备份目录
批量文件名重命名脚本
判断字符串的长度脚本
Shell的变量运算 + - * / % ^
整数运算 及 小数运算 expr $(()) $[] let bc awk python
变量运算的案例 ps aux| grep VSZ 这列的和 虚拟内存集的和
Shell的变量案例
系统信息的变量案例
变量替换的案例
3. 流程控制语句
流程控制语句介绍 单分支 双分支 多分支
文件比较 -e -f -s -d -r -w -x
企业级数据库备份脚本
整数比较 -eq -ne -gt -lt -ge -le
监测服务是否运行脚本
监控磁盘根分区的使用率脚本
创建用户脚本
函数库的使用 判断URL地址是否能够正常的访问
字符的比较 == != -z -n
多条件比较 -a -o && || [[]]
判断学生成绩优劣的脚本
正则比较 =~ ^[0-9]+$ ^[a-Z]+$
创建用户脚本的案例 输入前缀和后缀
清空系统日志脚本
根据系统版本安装不同的Yum源
流程控制语句之Case语句
安装不同Nginx版本的脚本
Rsync启动停止脚本
Nginx启动停止脚本 reload
加锁机制 防止脚本被同时使用
加强版Nginx启动停止脚本 判断语法的条件
2. 实现系统管理工具箱
1. 帮助信息
2. 系统版本信息
3. 系统内核信息
4. 磁盘使用情况
5. 内存使用情况
6. 系统负载情况
7. 用户登录情况
8. 所有IP地址
9. 外网IP地址
0. 退出脚本
[root@shell /service/scripts/day06]
Menu() {
cat<<EOF
###################
1. 帮助信息
2. 系统版本信息
3. 系统内核信息
4. 磁盘使用情况
5. 内存使用情况
6. 系统负载情况
7. 用户登录情况
8. 所有IP地址
9. 外网IP地址
0. 退出脚本
###################
EOF
}
Menu
while true
do
read -p "请根据菜单输入对应的编号获取对应的系统信息:" Num
if [[ ! $Num =~ ^[0-9]$ ]];then
echo "你输入的不符合条件!请输入数字0-9之间的任意一个!"
exit
fi
case $Num in
1)
clear
Menu
;;
2)
clear
echo "系统版本信息如下:"
awk '{print $1,$(NF-1)}' /etc/redhat-release
;;
3)
clear
echo "系统内核信息如下:"
uname -r
;;
4)
clear
echo "系统磁盘使用情况如下:"
df -h
;;
5)
clear
echo "系统内存使用情况如下:"
free -m
;;
6)
clear
echo "系统负载情况如下:"
uptime
;;
7)
clear
echo "当前系统用户登录情况如下:"
w -h
;;
8)
clear
echo "系统所有IP地址如下:"
ifconfig | awk '/inet /{print $2}'
;;
9)
clear
echo "系统外网IP地址如下:"
curl -s ifconfig.me
echo
;;
0)
clear
echo "你选择了退出程序!"
exit
;;
esac
done
while true
do
done
3. 实现简单的Jumpserver
1. 执行脚本时,可以看到你所能够管理的主机 主机清单
2. 提示用户要进行管理哪台主机 连接某台主机
3. 需要写个循环,连接完一台主机后,还可以继续连接其他主机 不能退出脚本
4. 不能让跳板机可以使用Ctrl + c d z 等操作
5. 用户不能管理你的跳板机 每次登陆系统,自动执行脚本
6. 给自己留个后门,自己能够出去,退出脚本,不能告诉别人怎样退出脚本
[root@shell /service/scripts/day06]
Menu() {
cat<<EOF
######################
1. 显示主机清单
2. Web01-10.0.0.7
3. Web02-10.0.0.8
4. Lb01-10.0.0.5
5. Db01-10.0.0.51
6. 退出脚本程序
######################
EOF
}
Menu
trap "" HUP INT TSTP
while true
do
read -p "请根据菜单,选择你要管理的主机:" Num
case $Num in
1)
clear
Menu
;;
2)
echo "你选择了要进行管理Web01主机"
ping -c1 -W1 10.0.0.7 &>/dev/null
if [ $? -eq 0 ];then
echo "Web01主机网络是通畅的!"
Port=$(nmap -p22 10.0.0.7 | awk '/22/{print $2}')
if [ $Port == "open" ];then
echo "Web01主机的远程连接端口是开放的!正在为您连接这台主机...."
ssh root@10.0.0.7
else
echo "Web01主机的远程连接端口没有打开!无法进行连接!"
continue
fi
else
echo "Web01主机的网络是不通畅的!请检查该主机是否启动!"
continue
fi
;;
3)
echo "你选择了要进行管理Web02主机"
ping -c1 -W1 10.0.0.8 &>/dev/null
if [ $? -eq 0 ];then
echo "Web02主机网络是通畅的!"
Port=$(nmap -p22 10.0.0.8 | awk '/22/{print $2}')
if [ $Port == "open" ];then
echo "Web02主机的远程连接端口是开放的!正在为您连接这台主机...."
ssh root@10.0.0.8
else
echo "Web02主机的远程连接端口没有打开!无法进行连接!"
continue
fi
else
echo "Web02主机的网络是不通畅的!请检查该主机是否启动!"
continue
fi
;;
4)
echo "你选择了要进行管理Lb01主机"
ping -c1 -W1 10.0.0.5 &>/dev/null
if [ $? -eq 0 ];then
echo "Lb01主机网络是通畅的!"
Port=$(nmap -p22 10.0.0.5 | awk '/22/{print $2}')
if [ $Port == "open" ];then
echo "Lb01主机的远程连接端口是开放的!正在为您连接这台主机...."
ssh root@10.0.0.5
else
echo "Lb01主机的远程连接端口没有打开!无法进行连接!"
continue
fi
else
echo "Lb01主机的网络是不通畅的!请检查该主机是否启动!"
continue
fi
;;
5)
echo "你选择了要进行管理Db01主机"
ping -c1 -W1 10.0.0.51 &>/dev/null
if [ $? -eq 0 ];then
echo "Db01主机网络是通畅的!"
Port=$(nmap -p22 10.0.0.51 | awk '/22/{print $2}')
if [ $Port == "open" ];then
echo "Db01主机的远程连接端口是开放的!正在为您连接这台主机...."
ssh root@10.0.0.51
else
echo "Db01主机的远程连接端口没有打开!无法进行连接!"
continue
fi
else
echo "Db01主机的网络是不通畅的!请检查该主机是否启动!"
continue
fi
;;
6)
read -s -p "请输入暗号退出脚本!" Anhao
echo
if [ $Anhao == "anhao" ];then
echo "内部管理人员退出脚本操作!切勿将暗号告诉别人!"
exit
else
echo "你输入的暗号不对!请重新输出!"
continue
fi
;;
*)
echo "你输入的不符合要求!请输入数字1-9"
continue
esac
done
[root@shell ~]
/bin/bash /service/scripts/day06/jumpserver.sh
4. 实现多级菜单
主菜单 有退出脚本的功能
两个子菜单
执行脚本时,进入的是主菜单
根据主菜单进行选择进入子菜单
子菜单负责具体的命令
有返回上一级菜单的功能
安装Nginx 和PHP
1. 安装Nginx服务
2. 安装PHP服务
3. 退出脚本程序
1. 安装Nginx-1.16版本
2. 安装Nginx-1.17版本
3. 安装Nginx-1.18版本
4. 返回上一级菜单
1. 安装PHP-5.6版本
2. 安装PHP-7.1版本
3. 安装PHP-7.2版本
4. 返回上一级菜单
[root@shell /service/scripts/day06]
Master_Menu() {
cat<<EOF
########主菜单########
1. 安装Nginx服务
2. 安装PHP服务
3. 退出脚本程序
######################
EOF
}
Nginx_Menu() {
cat<<EOF
########Nginx########
1. 安装Nginx-1.16版本
2. 安装Nginx-1.17版本
3. 安装Nginx-1.18版本
4. 返回上一级菜单
#####################
EOF
}
PHP_Menu() {
cat<<EOF
#########PHP#########
1. 安装PHP-5.6版本
2. 安装PHP-7.1版本
3. 安装PHP-7.2版本
4. 返回上一级菜单
#####################
EOF
}
while true
do
Master_Menu
read -p "请根据主菜单进行选择安装服务:" Install
case $Install in
1)
clear
echo "你选择了安装Nginx服务...."
while true
do
Nginx_Menu
read -p "请输入你要安装的Nginx的版本:" Install_Nginx
case $Install_Nginx in
1)
clear
echo "你选择安装Nginx-1.16版本...."
echo "正在安装Nginx-1.16版本,请稍后...."
sleep 5
echo "Nginx-1.16版本安装成功...."
;;
2)
clear
echo "你选择安装Nginx-1.17版本...."
echo "正在安装Nginx-1.17版本,请稍后...."
sleep 5
echo "Nginx-1.17版本安装成功...."
;;
3)
clear
echo "你选择安装Nginx-1.18版本...."
echo "正在安装Nginx-1.18版本,请稍后...."
sleep 5
echo "Nginx-1.18版本安装成功...."
;;
4)
clear
echo "你选择了返回上一级菜单!"
break
;;
*)
clear
echo "你输入的不符合要求!请重新输入!"
esac
done
;;
2)
clear
echo "你选择了安装PHP服务...."
while true
do
PHP_Menu
read -p "请根据菜单选择你要安装PHP的版本:" Install_PHP
case $Install_PHP in
1)
clear
echo "你选择了安装PHP-5.6版本...."
echo "正在安装PHP-5.6版本,请稍后...."
sleep 5
echo "PHP-5.6版本安装成功....."
;;
2)
clear
echo "你选择了安装PHP-7.1版本...."
echo "正在安装PHP-7.1版本,请稍后...."
sleep 5
echo "PHP-7.1版本安装成功....."
;;
3)
clear
echo "你选择了安装PHP-7.2版本...."
echo "正在安装PHP-7.2版本,请稍后...."
sleep 5
echo "PHP-7.2版本安装成功....."
;;
4)
clear
echo "你选择了返回上一级菜单!"
break
;;
*)
clear
echo "你输入的不符合要求!请重新输入!"
esac
done
;;
3)
echo "你选择了退出脚本程序!"
exit
;;
*)
echo "你输入的不符合要求!请重新输入!"
esac
done
[root@shell /service/scripts/day06]
1. 安装Nginx服务
2. 安装PHP服务
3. 退出脚本程序
请根据主菜单进行选择安装服务:1
你选择了安装Nginx服务....
1. 安装Nginx-1.16版本
2. 安装Nginx-1.17版本
3. 安装Nginx-1.18版本
4. 返回上一级菜单
请输入你要安装的Nginx的版本:1
你选择安装Nginx-1.16版本....
正在安装Nginx-1.16版本,请稍后....
Nginx-1.16版本安装成功....
1. 安装Nginx-1.16版本
2. 安装Nginx-1.17版本
3. 安装Nginx-1.18版本
4. 返回上一级菜单
请输入你要安装的Nginx的版本:4
你选择了返回上一级菜单!
1. 安装Nginx服务
2. 安装PHP服务
3. 退出脚本程序
请根据主菜单进行选择安装服务:2
你选择了安装PHP服务....
1. 安装PHP-5.6版本
2. 安装PHP-7.1版本
3. 安装PHP-7.2版本
4. 返回上一级菜单
请根据菜单选择你要安装PHP的版本:1
你选择了安装PHP-5.6版本....
正在安装PHP-5.6版本,请稍后....
PHP-5.6版本安装成功.....
1. 安装PHP-5.6版本
2. 安装PHP-7.1版本
3. 安装PHP-7.2版本
4. 返回上一级菜单
请根据菜单选择你要安装PHP的版本:4
你选择了返回上一级菜单!
1. 安装Nginx服务
2. 安装PHP服务
3. 退出脚本程序
请根据主菜单进行选择安装服务:3
你选择了退出脚本程序!
5. 循环语句之For循环基本概述
基础语法:
for 变量名 in 取值列表
do
循环体
done
当条件为真时,执行循环体,当条件为假时,循环体结束
多种取值方法
[root@shell /service/scripts/day06]
for i in file1 file2 file3
do
echo "$i"
echo "#########"
done
[root@shell /service/scripts/day06]
file1
file2
file3
[root@shell /service/scripts/day06]
for i in \$10 \$100 \$100
do
echo "menoy is $i"
done
[root@shell /service/scripts/day06]
menoy is $10
menoy is $100
menoy is $100
[root@shell /service/scripts/day06]
for i in '$10 $10' '$100' '$100'
do
echo "menoy is $i"
done
[root@shell /service/scripts/day06]
menoy is $10 $10
menoy is $100
menoy is $100
[root@shell /service/scripts/day06]
List='file1 file2 file3'
for i in $List
do
echo $i
done
[root@shell /service/scripts/day06]
file1
file2
file3
[root@shell /service/scripts/day06]
[root@shell /service/scripts/day06]
List='$10 $100 $1000'
for i in $List
do
echo $i
done
[root@shell /service/scripts/day06]
$10
$100
$1000
[root@shell /service/scripts/day06]
for i in $(head -1 /etc/passwd | cut -d ':' -f1-7| tr ':' ' ')
do
echo $i
done
[root@shell /service/scripts/day06]
root
x
0
0
root
/root
/bin/bash
[root@shell /service/scripts/day06]
for i in $(cat /etc/hosts)
do
echo $i
done
[root@shell /service/scripts/day06]
127.0.0.1
localhost
localhost.localdomain
localhost4
localhost4.localdomain4
::1
localhost
localhost.localdomain
localhost6
localhost6.localdomain6
IFS=:
IFS=$'\n'
IFS=:' '
[root@shell /service/scripts/day06]
IFS=':'
for i in $(head -1 /etc/passwd)
do
echo $i
done
[root@shell /service/scripts/day06]
root
x
0
0
root
/root
/bin/bash
[root@shell /service/scripts/day06]
IFS=$'\n'
for i in $(cat /etc/hosts)
do
echo $i
done
[root@shell /service/scripts/day06]
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@shell /service/scripts/day06]
root:x:0:0 root:/root /bin/bash
[root@shell /service/scripts/day06]
[root@shell /service/scripts/day06]
IFS=:' '
for i in $(cat test.txt)
do
echo $i
done
[root@shell /service/scripts/day06]
root
x
0
0
root
/root
/bin/bash
6. For循环C语言风格
[root@shell /service/scripts/day06]
for ((i=0;i<10;i++))
do
echo $i
done
[root@shell /service/scripts/day06]
0
1
2
3
4
5
6
7
8
9
[root@shell /service/scripts/day06]
for ((i=0,j=9;i<10;i++,j--))
do
echo $i $j
done
[root@shell /service/scripts/day06]
0 9
1 8
2 7
3 6
4 5
5 4
6 3
7 2
8 1
9 0
[root@shell /service/scripts/day06]
for ((i=0,j=9;i<10;i++,j--))
do
echo "$i + $j = $(($i+$j))"
done
[root@shell /service/scripts/day06]
0 + 9 = 9
1 + 8 = 9
2 + 7 = 9
3 + 6 = 9
4 + 5 = 9
5 + 4 = 9
6 + 3 = 9
7 + 2 = 9
8 + 1 = 9
9 + 0 = 9
[root@shell /service/scripts/day06]
a=0
b=9
for i in {1..10}
do
echo "$a + $b = $(($a+$b))"
let a++
let b--
done
[root@shell /service/scripts/day06]
0 + 9 = 9
1 + 8 = 9
2 + 7 = 9
3 + 6 = 9
4 + 5 = 9
5 + 4 = 9
6 + 3 = 9
7 + 2 = 9
8 + 1 = 9
9 + 0 = 9
[root@shell /service/scripts/day06]
for i in {1..10}
do
echo $i
done
[root@shell /service/scripts/day06]
1
2
3
4
5
6
7
8
9
10
[root@shell /service/scripts/day06]
for i in $(seq 10)
do
echo $i
done
[root@shell /service/scripts/day06]
1
2
3
4
5
6
7
8
9
10
7. For循环案例:创建用户
通过读入文件的方式进行创建用户
cat user.txt
aaa1
aaa2
aaa3
[root@shell /service/scripts/day06]
for i in $(cat user.txt)
do
id $i &>/dev/null
if [ $? -eq 0 ];then
echo "${i}用户已经存在!无需再次进行创建!"
else
useradd $i &>/dev/null
if [ $? -eq 0 ];then
echo "用户${i}创建成功!"
else
echo "用户创建失败!"
fi
fi
done
[root@shell /service/scripts/day06]
用户aaa1创建成功!
用户aaa2创建成功!
用户aaa3创建成功!
[root@shell /service/scripts/day06]
aaa1用户已经存在!无需再次进行创建!
aaa2用户已经存在!无需再次进行创建!
aaa3用户已经存在!无需再次进行创建!
[root@shell /service/scripts/day06]
[root@shell /service/scripts/day06]
aaa1用户已经存在!无需再次进行创建!
aaa2用户已经存在!无需再次进行创建!
aaa3用户已经存在!无需再次进行创建!
用户aaa4创建成功!
[root@shell /service/scripts/day06]
aaa1:ughiruhg
aaa2:ughiruhg
aaa3:ughiruhg
aaa4:ughiruhg
aaa5:ughiruhg
aaa6:ughiruhg
aaa7:ughiruhg
[root@shell /service/scripts/day06]
[root@shell /service/scripts/day06]
[root@shell /service/scripts/day06]
for i in $(cat user.txt)
do
id ${i%%:*} &>/dev/null
if [ $? -eq 0 ];then
echo "用户${i%%:*}已经存在!无需再次进行创建!"
else
useradd ${i%%:*} &>/dev/null && echo ${i#*:} | passwd --stdin ${i%%:*} &>/dev/null
if [ $? -eq 0 ];then
echo "用户${i%%:*}创建成功!密码设置成功!"
else
echo "用户${i%%:*}创建失败!"
fi
fi
done
[root@shell /service/scripts/day06]
用户aaa1已经存在!无需再次进行创建!
用户aaa2已经存在!无需再次进行创建!
用户aaa3已经存在!无需再次进行创建!
用户aaa4已经存在!无需再次进行创建!
用户aaa5创建成功!密码设置成功!
用户aaa6创建成功!密码设置成功!
用户aaa7创建成功!密码设置成功!
[root@shell /service/scripts/day06]
用户aaa1已经存在!无需再次进行创建!
用户aaa2已经存在!无需再次进行创建!
用户aaa3已经存在!无需再次进行创建!
用户aaa4已经存在!无需再次进行创建!
用户aaa5已经存在!无需再次进行创建!
用户aaa6已经存在!无需再次进行创建!
用户aaa7已经存在!无需再次进行创建!
8. 批量创建用户脚本
1、提示用户输入创建用户的前缀 比如:qls
2、判断这个前缀是否为字母组成
3、提示用户输入创建用户的后缀 后缀为创建用户的数量 比如: 10 就要创建10个用户 qls1..qls10
4. 判断用户的后缀是否为数字
5. 提示用户所要创建的用户列表 询问是否进行创建 yes no
6. yes则进行判断用户是否存在 存在则不进行创建, 不存在则进行创建
7. 创建成功,进行提示创建结果
8. no表示不进行创建
[root@shell /service/scripts/day06]
read -p "请输入你要创建用户的前缀[前缀必须是字母组成的]:" Qz
if [[ ! $Qz =~ ^[a-Z]+$ ]];then
echo "你输入的不符合要求!前缀必须是由字母组成的!"
exit
fi
read -p "请输入你要创建用户的数量:" Num
if [[ ! $Num =~ ^[0-9]+$ ]];then
echo "你输入的不符合要求!创建用户的数量必须为正整数!"
exit
fi
echo "接下来你要创建的用户为:${Qz}1..${Qz}${Num}"
read -p "你是否确定要进行创建这些用户[y/n]:" Confirm
case $Confirm in
y|Y|Yes|yes)
echo "你选择了要进行创建这些用户!"
for i in $(seq $Num)
do
User=${Qz}${i}
id $User &>/dev/null
if [ $? -eq 0 ];then
echo "用户${User}已经存在!无需再次进行创建!"
else
useradd $User &>/dev/null
if [ $? -eq 0 ];then
echo "用户${User}创建成功....."
else
echo "用户${User}创建失败,,,,,"
fi
fi
done
;;
n|no|N|No)
echo "你选择了不创建这些用户!再见!"
exit
;;
*)
echo "你输入的不符合要求!"
exit
esac
[root@shell /service/scripts/day06]
请输入你要创建用户的前缀[前缀必须是字母组成的]:324v
你输入的不符合要求!前缀必须是由字母组成的!
[root@shell /service/scripts/day06]
请输入你要创建用户的前缀[前缀必须是字母组成的]:bbb
请输入你要创建用户的数量:fe3
你输入的不符合要求!创建用户的数量必须为正整数!
[root@shell /service/scripts/day06]
请输入你要创建用户的前缀[前缀必须是字母组成的]:bbb
请输入你要创建用户的数量:5
接下来你要创建的用户为:bbb1..bbb5
你是否确定要进行创建这些用户[y/n]:n
你选择了不创建这些用户!再见!
[root@shell /service/scripts/day06]
请输入你要创建用户的前缀[前缀必须是字母组成的]:bbb
请输入你要创建用户的数量:5
接下来你要创建的用户为:bbb1..bbb5
你是否确定要进行创建这些用户[y/n]:y
你选择了要进行创建这些用户!
用户bbb1创建成功.....
用户bbb2创建成功.....
用户bbb3创建成功.....
用户bbb4创建成功.....
用户bbb5创建成功.....
[root@shell /service/scripts/day06]
请输入你要创建用户的前缀[前缀必须是字母组成的]:bbb
请输入你要创建用户的数量:5
接下来你要创建的用户为:bbb1..bbb5
你是否确定要进行创建这些用户[y/n]:Y
你选择了要进行创建这些用户!
用户bbb1已经存在!无需再次进行创建!
用户bbb2已经存在!无需再次进行创建!
用户bbb3已经存在!无需再次进行创建!
用户bbb4已经存在!无需再次进行创建!
用户bbb5已经存在!无需再次进行创建!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现