引言
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学习的那些事儿
我的个人资源整理,满满都是干货: 可按需访问领取
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!