掌握100个开箱即用的Shell脚本~(附PDF)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
可观测可视化 Grafana 版,10个用户账号 1个月
简介: Shell脚本是实现Linux系统管理及自动化运维所必备的重要工具。许多其它岗位的小伙伴也经常使用Shell脚本来实现某项需求。今天分享《100个shell脚本案例》,共有55页,支持文字搜索定位,代码清晰可复制。

linux for shell.jpg


引言

Shell脚本是实现Linux系统管理及自动化运维所必备的重要工具。许多其它岗位的小伙伴也经常使用Shell脚本来实现某项需求。

今天分享《100个shell脚本案例》,共有55页,支持文字搜索定位,代码清晰可复制。

需要的话,可以留言或回复 shell 获取下载PDF电子版。


内容

- 通过位置变量创建 Linux 系统账户及密码

#!/bin/bash
# 通过位置变量创建 Linux 系统账户及密码
#$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数
useradd "$1"
echo "$2" | passwd ‐‐stdin "$1"

- 备份日志

#!/bin/bash
# 每周 5 使用 tar 命令备份/var/log 下的所有日志文件
# vim /root/logbak.sh
# 编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份
数据覆盖
# 注意 date 命令需要使用反引号括起来,反引号在键盘<tab>键上面
tar -czf log-`date +%Y%m%d`.tar.gz /var/log 
# crontab ‐e #编写计划任务,执行备份脚本
00 03 * * 5 /root/logbak.sh

- 一键部署 LNMP(RPM 包版本)

#!/bin/bash
# 一键部署 LNMP(RPM 包版本)
# 使用 yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败
# 本脚本使用于 centos/rhel7.2以上
yum ‐y install httpd
yum ‐y install mariadb mariadb‐devel mariadb‐server
yum ‐y install php php‐mysql
systemctl start httpd mariadb
systemctl enable httpd mariadb

- 监控内存和磁盘容量,小于给定值时报警

#!/bin/bash
# 实时监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小
于 1000M 时,发送报警邮件给 root 管理员
# 提取根分区剩余空间
disk_size=$(df / | awk '/\//{print $4}')
# 提取内存剩余空间
mem_size=$(free | awk '/Mem/{print $4}')
while :
do
# 注意内存和磁盘提取的空间大小都是以 Kb 为单位
if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
then
 mail ‐s "Warning" root <<EOF
 Insufficient resources,资源不足
EOF
fi
done

- 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及 配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本; 如果用户不输入密码,则统一使用默认的 123456 作为默认密码

#!/bin/bash
# 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密
码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 作为默认密码。
read -p "请输入用户名: " user
#使用‐z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并
退出脚本,退出码为 2
#没有输入用户名脚本退出后,使用$?查看的返回码为 2
if [ -z $user ];then
   echo "您不需输入账户名"
 exit 2
fi
#使用 stty ‐echo 关闭 shell 的回显功能
#使用 stty echo 打开 shell 的回显功能
stty -echo
read -p "请输入密码: " pass
stty echo
pass=${pass:‐123456}
useradd "$user"
echo "$pass" | passwd ‐‐stdin "$user"

- 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状 态,哪些主机处于关机状态(for 版本)

#!/bin/bash
# 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主
机处于关机状态(for 版本)
for i in {1..254}
do
 # 每隔 0.3 秒 ping 一次,一共 ping2 次,并以 1 毫秒为单位设置 ping 的超时时间
   ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null
 if [ $? -eq 0 ];then
     echo "192.168.4.$i is up"
   else
     echo "192.168.4.$i is down"
   fi
done

- 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状 态,哪些主机处于关机状态(while 版本)

#!/bin/bash
# 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主
机处于关机状态(while 版本) 
i=1
while [ $i -le 254 ]
do
   ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null
   if [ $? -eq 0 ];then
     echo "192.168.4.$i is up"
 else
     echo "192.168.4.$i is down"
   fi
   let i++
done

- 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状 态,哪些主机处于关机状态(多进程版)

#!/bin/bash
# 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主
机处于关机状态(多进程版)
#定义一个函数,ping 某一台主机,并检测主机的存活状态
myping(){
ping ‐c 2 ‐i 0.3 ‐W 1 $1 &>/dev/null
if [ $? -eq 0 ];then
 echo "$1 is up"
else
 echo "$1 is down"
fi
}
for i in {1..254}
do
   myping 192.168.4.$i &
done
# 使用&符号,将执行的函数放入后台执行
# 这样做的好处是不需要等待 ping 第一台主机的回应,就可以继续并发 ping
第二台主机,依次类推。

- 编写脚本,显示进度条

#!/bin/bash
# 编写脚本,显示进度条
jindu(){
while :
do
   echo -n '#'
   sleep 0.2
done
}
jindu &
cp -a $1 $2
killall $0
echo "拷贝完成"

- 进度条,动态时针版本;定义一个显示进度的函数,屏幕快速显示

#!/bin/bash
# 进度条,动态时针版本
# 定义一个显示进度的函数,屏幕快速显示| / ‐ \
rotate_line(){
INTERVAL=0.5 #设置间隔时间
COUNT="0" #设置 4 个形状的编号,默认编号为 0(不代表任何图像)
while :
do
 COUNT=`expr $COUNT + 1` #执行循环,COUNT 每次循环加 1,(分别代表 4种不同的形状)
 case $COUNT in #判断 COUNT 的值,值不一样显示的形状就不一样
 "1") #值为 1 显示‐
     echo -e '‐'"\b\c"
     sleep $INTERVAL
     ;;
 "2") #值为 2 显示\\,第一个\是转义
     echo -e '\\'"\b\c"
     sleep $INTERVAL
     ;;
 "3") #值为 3 显示|
     echo -e "|\b\c"
     sleep $INTERVAL
     ;;
 "4") #值为 4 显示/
     echo -e "/\b\c"
     sleep $INTERVAL
     ;;
 *) #值为其他时,将 COUNT 重置为 0
     COUNT="0";;
   esac
done
}
rotate_line

- 使用死循环实时显示 eth0 网卡发送的数据包流量

#!/bin/bash
# 使用死循环实时显示 eth0 网卡发送的数据包流量
while :
do
   echo '本地网卡 eth0 流量信息如下: '
   ifconfig eth0 | grep "RX pack" | awk '{print $5}'
   ifconfig eth0 | grep "TX pack" | awk '{print $5}'
   sleep 1
done

- 查看有多少远程的 IP 在连接本机

#!/bin/bash
# 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 
都统计) 
# 使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有,
# -t 仅显示 tcp 连接的信息,‐n 数字格式显示
# Local Address(第四列是本机的 IP 和端口信息)
# Foreign Address(第五列是远程主机的 IP 和端口信息)
# 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息
# sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复
的次数
netstat -atn | awk '{print $5}' | awk '{print $1}' | sort 
-nr | uniq -c

- 统计每个远程 IP 访问了本机 apache 几次?

#!/bin/bash
# 统计每个远程 IP 访问了本机 apache 几次? 
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log

- 自动对磁盘分区、格式化、挂载

#!/bin/bash
# 自动对磁盘分区、格式化、挂载
# 对虚拟机的 vdb 磁盘进行分区格式化,使用<<将需要的分区指令导入给程序fdisk
# n(新建分区),p(创建主分区),1(分区编号为 1),两个空白行(两个回车,相当于将整个磁盘分一个区)
# 注意:1 后面的两个回车(空白行)是必须的!
fdisk /dev/vdb << EOF
n
p
1
wq
EOF
#格式化刚刚创建好的分区
mkfs.xfs /dev/vdb1
#创建挂载点目录
if [ -e /data ]; then
exit
fi
mkdir /data
#自动挂载刚刚创建的分区,并设置开机自动挂载该分区
echo '/dev/vdb1 /data xfs defaults 0 0' >>/etc/fstab
mount -a

- 切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)

#mkdir /data/scripts
#vim /data/scripts/nginx_log.sh 
#!/bin/bash
# 切割 Nginx 日志文件(防止单个文件过大,后期处理很困难) 
logs_path="/usr/local/nginx/logs/"
mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
# chmod +x /data/scripts/nginx_log.sh
# crontab ‐e #脚本写完后,将脚本放入计划任务每天执行一次脚本
0 1 * * * /data/scripts/nginx_log.sh

- 根据 md5 校验码,检测文件是否被修改

#!/bin/bash
# 根据 md5 校验码,检测文件是否被修改
# 本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,
您可以修改为其他目录或文件
# 本脚本在目标数据没有被修改时执行一次,当怀疑数据被人篡改,再执行一次
# 将两次执行的结果做对比,MD5 码发生改变的文件,就是被人篡改的文件
for i in $(ls /etc/*.conf)
do
 md5sum "$i" >> /var/log/conf_file.log
done

- 备份 MySQL 的 shell 脚本(mysqldump 版本)

#!/bin/bash
# 备份 MySQL 的 shell 脚本(mysqldump 版本) 
# 定义变量 user(数据库用户名),passwd(数据库密码),date(备份的时间标
签)
# dbname(需要备份的数据库名称,根据实际需求需要修改该变量的值,默认备
份 mysql 数据库)
user=root
passwd=123456
dbname=mysql
date=$(date +%Y%m%d)
# 测试备份目录是否存在,不存在则自动创建该目录
[ ! -d /mysqlbackup ] && mkdir /mysqlbackup
# 使用 mysqldump 命令备份数据库
mysqldump -u "$user" -p "$passwd" "$dbname" >/mysqlbackup/"$dbname"-${date}.sql

- Shell 脚本的 fork 炸弹(建议测试一下~)

#!/bin/bash
# Shell 脚本的 fork 炸弹
# 快速消耗计算机资源,致使计算机死机
# 定义函数名为.(点), 函数中递归调用自己并放入后台执行
.() { .|.& };.

不写了内容太长了,先输出上面一部分作展示(主要没有文件版看着舒服、方便~)。 需要的话,可以留言或回复 shell 获取下载PDF电子版。

资料获取不易,还请勿做收藏党哦~

资料整理于网络,仅做免费交流分享,如侵权请联系删除!


最后~欢迎关注我! @Linux学习的那些事儿

我的个人资源整理,满满都是干货: 可按需访问领取

200T免费资料,持续发布中...

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
109 1
|
1月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
62 2
6种方法打造出色的Shell脚本
|
1月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
58 1
|
1月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
49 2
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
54 6
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
81 12
|
2月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
72 2
|
3月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
3月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
731 2