本文提供四个实用的Shell脚本应用案例,包括:批量创建用户、Nginx源码安装、系统巡检以及主机连通性检测。
1、自动批量创建用户
创建100个用户,输出用户名和密码的列表,用户密码需要为随机字符串,用户列表在userlist.txt文件中。
需求实现shell脚本如下:
#!/bin/bash#this script is for adding user#version 1.0#author: albertzhang#user.txt格式如下#user1#user2#user3#....while read line;do username=$line #添加用户 useradd $username #产生随机密码 passwd=`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 10` #设置用户密码 echo "$passwd" |passwd --stdin $username #将账户密码输出到userlist.txt文件中 if [ $? -eq 0 ];then echo "$username$passwd" >> userlist.txt echo "add $username success." fidone < user.txt
脚本执行结果验证:
2、Nginx源码自动安装
通过原码编译安装linux,并实现nginx开机自启动。
需求实现shell脚本如下:
#!/bin/bash#this script is for installing nginx by using source code of nginx#version 1.0#author: albertzhang#安装基础软件包yum groupinstall "Development Tools"yum install wget pcre pcre-devel zlib zlib-devel openssl openssl-devel -y#下载nginx源码包并解压wget https://nginx.org/download/nginx-1.30.4.tar.gztar -zxvf nginx-1.30.4.tar.gzcd nginx-1.30.4#创建nginx运行用户groupadd nginxuseradd -g nginx -s /sbin/nologin -M nginx#nginx原码安装配置./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_stub_status_module \ --with-stream \ --with-http_gzip_static_module#编译与安装nginxmake && make install#测试nginx是否安装成功/usr/local/nginx/sbin/nginx && echo "nginx 启动成功" || (echo "nginx 启动失败";exit 1)ipaddr=`ifconfig |egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|grep -v '127.0.0.1' |awk -F' ' '{print (curl -o /dev/null -s -w "%{http_code}\n" http://status_code == '200' ]];then echo "nginx 安装成功"else echo "nginx 安装失败" exit 1fi#添加nginx服务文件,实现开机自启动cat > /etc/systemd/system/nginx.service << EOF[Unit]Description=The NGINX HTTP and reverse proxy serverAfter=network.target[Service]Type=forkingExecStartPre=/usr/local/nginx/sbin/nginx -tExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s stopPrivateTmp=true[Install]WantedBy=multi-user.targetEOF/usr/local/nginx/sbin/nginx -s stop && systemctl start nginx systemctl enable nginxif systemctl status nginx |grep running;then echo "nginx 服务启动成功" echo "nginx 访问地址:http://(hostname)fi
脚本执行结果验证:


3、系统自动巡检
巡检操作系统,获取CPU、内存、磁盘空间使用率、磁盘IO使用率等指标。
需求实现shell脚本如下:
#!/bin/bash# ============================================================# system inspection for centos7# function:usage of cpu、usage of memory、usage of disk capacity、util of disk# author:albertzhang# version:1.0# ============================================================# 设置颜色输出(可选)RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[0;33m'NC='\033[0m' # No Color# 获取主机名和当前时间HOSTNAME=$(hostname)DATETIME=$(date +"%Y-%m-%d %H:%M:%S")# 输出标题echo "============================================================"echo -e "系统巡检报告 - ${HOSTNAME}"echo "时间: ${DATETIME}"echo "============================================================"# ------------------------------------------------------------# 1. CPU 使用率# ------------------------------------------------------------echo -e "\n[1] CPU 使用率"# 使用 top 或 mpstat;这里用 top 的 batch 模式获取CPU_IDLE=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | cut -d. -f1)CPU_USAGE=$((100 - CPU_IDLE))echo " CPU 使用率: ${CPU_USAGE}% (空闲 ${CPU_IDLE}%)"# 系统负载(1分钟、5分钟、15分钟)LOAD=$(uptime | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//')echo " 系统负载: ${LOAD}"# ------------------------------------------------------------# 2. 内存使用率# ------------------------------------------------------------echo -e "\n[2] 内存使用率"MEM_TOTAL=$(free -m | awk '/^Mem:/{print $2}')MEM_USED=$(free -m | awk '/^Mem:/{print $3}')MEM_FREE=$(free -m | awk '/^Mem:/{print $4}')MEM_AVAIL=$(free -m | awk '/^Mem:/{print $7}')MEM_PERCENT=$((MEM_USED * 100 / MEM_TOTAL))echo " 总内存: ${MEM_TOTAL} MB"echo " 已用内存: ${MEM_USED} MB"echo " 空闲内存: ${MEM_FREE} MB"echo " 可用内存: ${MEM_AVAIL} MB"echo " 内存使用率: ${MEM_PERCENT}%"# ------------------------------------------------------------# 3. 磁盘空间使用率(主要分区)# ------------------------------------------------------------echo -e "\n[3] 磁盘空间使用率 (主要分区)"# 显示所有挂载点,排除 tmpfs、devtmpfs 等df -hP | grep -vE '^(Filesystem|tmpfs|devtmpfs)' | while read line; do usage=$(echo $line | awk '{print $5}' | sed 's/%//') mount=$(echo $line | awk '{print $6}') used=$(echo $line | awk '{print $3}') avail=$(echo $line | awk '{print $4}') size=$(echo $line | awk '{print $2}') # 如果使用率超过 80% 则高亮显示 if [ "$usage" -ge 80 ] 2>/dev/null; then echo -e " ${RED}${mount}${NC} 总容量 ${size} 已用 ${used} 可用 ${avail} 使用率 ${usage}% (警告)" else echo " ${mount} 总容量 ${size} 已用 ${used} 可用 ${avail} 使用率 ${usage}%" fidone# ------------------------------------------------------------# 4. 磁盘 I/O 使用率 (%util)# ------------------------------------------------------------echo -e "\n[4] 磁盘 I/O 使用率 (%util)"# 检查 iostat 是否安装if ! command -v iostat &>/dev/null; then echo -e " ${YELLOW}警告: iostat 未安装,请执行 'yum install -y sysstat' 安装。${NC}"else # 仅显示非 0 使用率的设备,或全部显示 iostat -x -k 1 2 | tail -n +4 | while read line; do # 跳过空行 [ -z "$line" ] && continue # 提取设备名和 %util(倒数第二列) device=$(echo $line | awk '{print $1}') util=$(echo $line | awk '{print $(NF-1)}') # 跳过 loop 或 ram 设备 if [[ "$device" =~ ^(loop|ram|sr) ]]; then continue fi # 如果 util 是数字且大于 0,或者我们想显示所有 if [[ "$util" =~ ^[0-9.]+$ ]] && [ "$(echo "$util > 0" | bc)" -eq 1 ] 2>/dev/null; then echo " ${device}: %util = ${util}%" fi donefiecho -e "\n============================================================"echo "巡检完成"echo "============================================================"

4、主机连通性自动检测
编写shell 脚本检测主机列表内的主机存活与否。
需求实现shell脚本如下:
#!/bin/bash#check host is up or down#version 1.0#author: albertzhang#第一种方法#for host in `cat iplist.txt`;do# ping -c 2 -w 1 $host >/dev/null 2>&1 && echo "$host is up." || echo "$host is down."#done#第二种方法cat iplist.txt | while read host;do ping -c 2 -w 1 $host >/dev/null 2>&1 && echo"$host is up." || echo"$host is down." done
Shell脚本相关文章到此就结束了,以上也只是展示了用shell脚本实现一些简单的功能,熟悉了shell之后,可以使用shell脚本结合现场的环境实现更多的复杂功能,将其应用到实际的运维工作中,作为提升工作效率的一大利器。熟悉shell的方法就是多写多练,无他唯手熟尔。如果你有任何疑问,欢迎您留言交流!