OneShellScript
rm -rf OneShellScript.sh && curl -O https://wangjian.run/ShellScript/OneShellScript.sh && clear && bash OneShellScript.sh
debug模式
sh -x 全部执行检查
sh -x 显示脚本执行过程
1、带+号 表示执行过程
2、没有+号表示标准输出
set 指定位置执行检查
set命令 设置开始debug和结束debug的位置,显示脚本某一个部分执行过程,解决复杂故障
#开启显示
[root@wj ~]# set -x #在控制台执行了命令后,下面的执行都会显示
++ printf '\033]0;%s@%s:%s\007' root wj '~'
[root@wj ~]# pwd
+ pwd
/root
++ printf '\033]0;%s@%s:%s\007' root wj '~'
#结束显示
[root@wj ~]# set +x
+ set +x
#实战中想看哪段代码执行结果,就添加在哪个位置
[root@wj ~]# more check_host_ping.sh.sh
. /etc/init.d/functions
check_ip(){
ip=192.168.15.$1
set -x #开始
ping -c1 -i1 -w1 $ip &>/dev/null
if [[ $? -eq 0 ]];then
action "$ip is true" /bin/true
else
action "$ip is false" /bin/false
fi
set +x #结束
}
main(){
for n in {128..129}
do
check_ip $n
usleep 100
done
}
main
[root@wj ~]# sh check_host_ping.sh.sh
+ ping -c1 -i1 -w1 192.168.15.128
+ [[ 0 -eq 0 ]]
+ action '192.168.15.128 is true' /bin/true
+ local STRING rc
+ STRING='192.168.15.128 is true'
+ echo -n '192.168.15.128 is true '
#
单步执行检查
判断IP是否能ping通
版本1
#!/bin/bash
. /etc/init.d/functions
check_ip(){
ip=192.168.15.$1
ping -c1 -i1 -w1 $ip &>/dev/null
if [[ $? -eq 0 ]];then
action "$ip is true" /bin/true
else
action "$ip is false" /bin/false
fi
}
main(){
for n in {128..129}
do
check_ip $n
usleep 100
done
}
main
版本2
docker
一键在线安装最新版本的docker
yum -y install wget && wget https://wangjian.run/ShellScript/docker-install.sh --no-check-certificate && bash docker-install.sh
tomcat
一键安装tomcat
yum -y install wget && wget https://wangjian.run/ShellScript/tomjb.sh --no-check-certificate && bash tomjb.sh
openssh
yum -y install wget && wget https://wangjian.run/ShellScript/ssh.sh --no-check-certificate && bash ssh.sh
nginx
#nginx重启脚本
vim nginx-restart.sh
ngmul=/opt/nginx-1.24.0/sbin/
id=$(pgrep nginx)
kill -9 $id > /dev/null
#启动nginx
cd $ngmul && ./nginx
#查看进程
ps -ef|grep nginx
菜单制作select
方式1:使用select
- 优点:
select
命令提供了一个简洁的方式来创建菜单,它自动将选项列表显示成编号菜单,并处理用户的选择。此命令还支持自定义提示符,使得用户体验更加友好。select
命令还负责获取输入的答案并自动处理,减少了需要编写的代码量。 - 缺点:
select
命令创建的菜单在视觉上不如图形界面美观,但这对于命令行界面来说是可以接受的。 - 适用场景:适合于快速实现一个文本菜单,并且菜单项较多的情况。
export LANG=en_US.utf8
clear
#点菜函数
function diancai(){
sum=0
PS3="点菜选择对应的序号:"
select menu in 北京烤鸭 小龙虾 买单 退出点菜游戏
do
case $REPLY in
1)
echo $menu "价格是:100元"
let sum+=100
;;
2)
echo $menu "价格是:50元"
let sum+=50
;;
3)
echo "本次点菜价格是:$sum元"
sum=0
;;
4)
zhucaidan
;;
esac
done
}
function zhucaidan(){
PS3="请选择对应的序号: "
while true;
do
select num in 点菜游戏 退出;
do
case $num in
点菜游戏)
diancai
;;
退出)
exit
;;
*)
echo "输入错误,请重新输入对应的序号!"
break
esac
done
done
}
zhucaidan
方式2:使用 echo
命令和 read
命令
- 优点:这种方式通常结合
case
语句来处理用户的输入,可以清晰地列出所有选项,并且每个选项后都可以跟随特定的命令。例如,可以通过read
命令读取用户的输入,然后使用case
语句判断用户输入的值,并执行相应的命令。 - 缺点:需要手动编写更多的代码来显示菜单项和处理用户输入,且对用户输入的错误处理较为复杂。
- 适用场景:适合于功能选项较少,逻辑简单或需要详细定制菜单交互过程的场合。
- 这种方法是最基础的,它通过连续的
echo
命令打印出菜单项,然后使用read
命令读取用户的输入
#!/bin/sh
while true; do
echo "1. 目录内容"
echo "2. 切换目录"
echo "3. 创建文件"
echo "4. 编辑文件"
echo "5. 删除文件"
echo "6. 退出菜单"
read -p "请输入选择(1-6): " input
case $input in
1) ls ;;
2) echo "Enter target directory: "
read dir
cd $dir ;;
3) echo "Enter a file name: "
read file
touch $file ;;
4) echo "Enter a file name: "
read file
vi $file ;;
5) echo "Enter a file name: "
read file
rm $file ;;
6) break ;;
*) echo "错误选择!" ;;
esac
done
速查表定时更新
#!/bin/bash
#速查表定时获取最新版本脚本
#查找容器
rongqiid=$(docker ps | awk 'NR!=1{print }' | awk '{print $1}')
#停止容器
docker stop "$rongqiid"
#查看所有容器
rongqiids=$(docker ps -qa)
docker rm "$rongqiids"
#查找镜像删除
JiangXiangId=$(docker images | awk 'NR!=1{print }' | awk '{print $3}')
docker rmi -f "$JiangXiangId"
#下载镜像并启动容器
docker pull wcjiang/reference
docker run --name reference --rm -d -p 9667:3000 wcjiang/reference:latest
其他脚本
vim mysql-install-centos7.9.sh
#!/bin/bash
echo -e "\e[32m##########mysql安装环境开始检测##########\e[0m"
#软件安装环境检查
mariadb=$(rpm -qa|grep -c mariadb)
mysql=$(rpm -qa|grep -c mysql) #写法2 grep mysql | wc -l
if [[ $mariadb != 0 ]];then
echo -e "\e[31m##########mysql安装环境监测不通过##########\e[0m"
echo "本系统有安装mariadb数据库,请先卸载,卸载方法如下实例所示:"
echo "可以使用rpm -qa|grep mariadb 查询"
echo "然后使用rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps进行卸载"
exit 1
fi
if [[ $mysql != 0 ]];then
echo -e "\e[31m##########mysql安装环境监测不通过##########\e[0m"
echo "本系统有安装mysql数据库,请先卸载相关的安装"
exit 1
fi
#<<COMMENT
#用户和组检查
yonghuzu=$(more /etc/group | grep -c mysql) #shell规范中不建议用cat,cat是一个工具来欺骗"猫"的文件.将AINGLE文件作为程序的输入被认为是《禁止酷刑和其他残忍、不人道或有辱人格的待遇或处罚公约》
yonghu=$(more /etc/passwd |grep -c mysql)
if [[ $yonghuzu == 0 ]];then
groupadd mysql
echo -e "\e[32m##########本系统没有mysql组,脚本已自动完成mysql组创建##########\e[0m"
else
echo -e "\e[32m##########本系统有mysql组,无需脚本创建用户组##########\e[0m"
fi
if [[ $yonghu == 0 ]];then
useradd -g mysql mysql
echo -e "\e[32m##########本系统没有mysql用户,脚本已自动完成mysql用户创建,并添加到mysql组##########\e[0m"
else
echo -e "\e[32m##########本系统有mysql用户,无需脚本创建用户##########\e[0m"
fi
if [[ $mariadb == 0 && $mysql == 0 ]];then
echo -e "\e[32m##########恭喜你mysql安装环境监测通过,开始安装mysql##########\e[0m"
fi
#COMMENT
判断软件是否安装
Packs=("curl" "tar" "gzip" "netstat" "ss" "docker" ); for pack in "${Packs[@]}"; do command -v "$pack" >/dev/null 2>&1 || echo -e "\033[31mError: $pack 命令不存在\033[0m"; done
统计IP出现的次数
tail -n 1000 wangjian.run.log | awk '{print $1}' |sort | uniq -c | sort -nr | head -n 10
查看日志
sed -n '/09\/Jan\/2025:09:21:00/,/09\/Jan\/2025:09:21:59/'p wangjian.run.log
sed -n '/2019-07-30 20:00:00/,/2019-07-30 21:30:00/'p gateway.log
多列输出所在行
[root@wjcentos7 ~]# more wjip.txt
300 192.168.1.3
100 192.168.1.4
150 192.168.1.5
2 192.168.1.6
5 192.168.1.7
50 192.168.1.8
#!/bin/bash
file="wjip.txt"
#在这个脚本中,while read line循环会不断从文件(通过< "$file"重定向输入)中读取一行数据,将其存储到变量line中
#然后通过echo $line输出这一行数据,直到文件中的所有行都被读取完
if [ -f "$file" ];then
#count ip_address代表txt文件中的两个字段
while read count ip_address;do
#echo $ip_address
if [ $count -gt 200 ];then
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="'$ip_address'" port port="22" protocol="tcp" reject' --permanent
firewall-cmd --reload
echo "$ip_address:禁用成功"
fi
done < "$file"
else
echo "文件不存在"
fi
自动禁用启用IP
统计出现大于200的IP地址
tail -n 1000 wangjian.run.log | awk '{print $1}' |sort | uniq -c | awk '$1 > 200' | sort -nr | awk '{print $2}'| tr -d ' '
禁用脚本
[root@wjcentos7 ~]# more DisableIp.sh
#!/bin/bash
file="wjip.txt"
#在这个脚本中,while read line循环会不断从文件(通过< "$file"重定向输入)中读取一行数据,将其存储到变量line中
#然后通过echo $line输出这一行数据,直到文件中的所有行都被读取完
if [ -f "$file" ];then
while read ip_address;do
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="'$ip_address'" port port="22" protocol="tcp" reject' --permanent
firewall-cmd --reload
echo "$ip_address:禁用成功"
done < "$file"
else
echo "文件不存在"
fi
启用脚本
[root@wjcentos7 ~]# more EnableIp.sh
#!/bin/bash
file="wjip.txt"
#在这个脚本中,while read line循环会不断从文件(通过< "$file"重定向输入)中读取一行数据,将其存储到变量line中
#然后通过echo $line输出这一行数据,直到文件中的所有行都被读取完
if [ -f "$file" ];then
while read ip_address;do
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="'$ip_address'" port port="22" protocol="tcp" reject' --permanent
firewall-cmd --reload
echo "$ip_address:已取消禁用"
done < "$file"
else
echo "文件不存在"
fi
定时任务
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容