实用shell脚本实践

批量创建用户(指定名称与指定位数随机密码)

[root@web01 ~]# cat useradd_new.sh

#!/usr/bin/bash
. /etc/init.d/functions

	# 让用户输入前缀名称		zjh
	# 让用户输入创建的数量		10
	# 使用有密码。且随机,长度15 大写5  小写5 数字3 特殊字符2


read -p "请输入要创建的用户名称[default: zjh]: " UserName
read -p "请输入要创建的用户数量[default: 10]: " UserNumber
read -p "请输入要创建的密码长度[default:  8]: " PassNumber
read -p "你要创建的用户是 ${UserName:=zjh} 随机密码 ${PassNumber:=8} 创建 ${UserNumber:=10}  ,确定创建吗? [ yes(default) | no ]: " Action


# 判断用户输入的是yes还是no
if [ "${Action:=yes}" == "yes" ];then

	# 完成用户的创建
	# 循环
	for number in $(seq ${UserNumber})
	do
		# 随机密码
		UserPass=$(mkpasswd -l ${PassNumber} )

		id "${UserName}_${number}" &>/dev/null
		if [ $? -eq 0 ];then
			action "用户: ${UserName}_${number} is already exists.." /bin/false
		else

			 # 创建用户
                	useradd "${UserName}_${number}" &>/dev/null
                	# 设定密码
                	echo "${UserPass}" | passwd --stdin "${UserName}_${number}" &>/dev/null
                	echo "${UserName}_${number} : ${UserPass}" >> /tmp/user_pass.txt

			action "用户: ${UserName}_${number} is Create ok" /bin/true
		fi 
	done
fi
数据库备份脚本

[root@db01 ~]# cat db_backup.sh

#!/usr/bin/bash
. /etc/init.d/functions

Db_Name=$(mysql -uroot -pzjh123 -e "show databases;" | sed 1d | egrep -v "*_schema")
Date=$(date +%F)
DB_Dir=/backup/mysql/${Date}

# 确保备份的目录是存在的
if [ ! -d ${DB_Dir} ];then
	mkdir -p ${DB_Dir}	
fi

# 备份业务逻辑
for database in ${Db_Name}
do
	mysqldump -uroot -pzjh123 -B ${database} > ${DB_Dir}/${database}.sql
	
	# 判断文件是否有内容
	if [ -s ${DB_Dir}/${database}.sql ];then
		action "${DB_Dir}/${database}.sql 备份成功" /bin/true
	else
		action "${DB_Dir}/${database}.sql 备份失败" /bin/true
	fi
done
数据库按表备份

[root@db01 ~]# cat db_table_backup.sh

#!/usr/bin/bash
. /etc/init.d/functions

DB_Name=$(mysql -uroot -pzjh123 -e "show databases;" | sed 1d | egrep -v "*_schema")
Date=$(date +%F)
DB_Dir=/backup/mysql/${Date}

# 外循环,提取库的名称
for database in ${DB_Name}
do
	# 创建库对应的备份目录
	if [ ! -d $DB_Dir/$database ];then
		mkdir -p "$DB_Dir/$database"
	fi

	# 提取表名称
	TB_Name=$(mysql -uroot -pzjh123 -e "use ${database};show tables;" | sed 1d)
	
	# 内循环,基于库名称然后取获取表名称
	for table in ${TB_Name}
	do
		mysqldump -uroot -pzjh123 ${database} ${table} > $DB_Dir/${database}/${table}.sql
		if [ -s $DB_Dir/${database}/${table}.sql ];then
			action "$DB_Dir/${database}/${table}.sql 备份成功" /bin/true
		else
			action "$DB_Dir/${database}/${table}.sql 备份失败" /bin/false
		fi
	done
done
测试对端主机是否能ping通

[root@web01 ~]# cat ping_host.sh

#!/bin/bash
read -p "请输入你要测试的主机ip地址: " ip_addr
#-W 1意思是ping的超时时间为1秒,超过超时时间则默认失败
#-c 1意思是只ping1次
ping -W 1 -c 1 $ip_addr &>/dev/null
if [ $? -eq 0 ];then
        echo "$ip_addr 能ping通"
else
        echo "$ip_addr 不能ping通"
fi

测试多个ip地址是否能ping通(需要自己编写一份ip.txt)

[root@web01 ~]# vim ip.txt

[root@web01 ~]# cat wangduan.sh

#!/bin/bash
for ip in $(cat ip.txt)
do
    {
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
            echo "$ip ok" >> ip_ok.txt
            echo "$ip ok"
    fi
    }&
done
    wait
    echo "done.."
替换当前主机的主机名称和IP地址

[root@web01 ~]# cat sed_host_ip.sh

#!/bin/bash
[ $# -ne 2 ] && {
	echo "脚本使用姿势不对"
	echo "正确姿势:$0 主机名 ip地址"
	exit 1
}
#获取当前主机ip地址
ip=`hostname -I |awk '{print $1}'|sed 's#.*\.##g'`
#新的ip
ip_new=`echo $2 |sed 's#^.*\.##g'`
#新的主机名
hostname=$1
#修改ip
sed -i "s#10.0.0.$ip#10.0.0.$ip_new#g"	/etc/sysconfig/network-scripts/ifcfg-eth0
sed -i "s#172.16.1.$ip#172.16.1.$ip_new#g"	/etc/sysconfig/network-scripts/ifcfg-eth1
#重启网卡
systemctl restart network 
#修改主机名
hostnamectl set-hostname $hostname
提取当前主机的主机名称和IP地址

[root@work ~]# cat host_ip.sh

#!/bin/bash

# 获取系统主机名
hostname=$(hostname)

# 获取默认路由对应的主IPv4地址
ip_address=$(ip route get 1 2>/dev/null | awk '{print $7;exit}')

# 备用方法:获取第一个非127回环地址的IP(当无网络连接时使用)
[ -z "$ip_address" ] && ip_address=$(hostname -I 2>/dev/null | awk '{print $1}')

# 输出结果
echo "Hostname : $hostname"
if [ -n "$ip_address" ]; then
    echo "IPv4     : $ip_address"
else
    echo "IPv4     : Not Available"
fi
备份当前目录的指定后缀的文件到/backup目录下,并统计备份的文件数量

[root@work ~]# cat backup.sh

#!/bin/bash
read -p $'请输入文件后缀(例如.txt,默认备份路径为/backup): \n' a
file=$( ls | grep $a  )
mkdir -p /backup
cp $file /backup/
echo "本次备份文件数量为:$( ls | grep $a | wc -l )"
检测java进程状态(需筛选并指定java进程特征)

[root@ciallo ~]# ps -ef | grep "java"

root      5379  5349  0 Mar14 ?        02:43:36 java org.springframework.boot.loader.launch.JarLauncher --spring.r2dbc.url=r2dbc:pool:mysql://mysql:3306/halo_cd6i8n --spring.r2dbc.username=halo_h56r47 --spring.r2dbc.password=halo_EpejBA --spring.sql.init.platform=mysql --halo.external-url=http://39.98.42.20

[root@ciallo ~]# cat java.sh

#!/bin/bash
# 单次检查Java进程监控脚本
# 检测到正常运行时自动退出,异常时尝试重启一次

APP_PATTERN="org.springframework.boot.loader.launch.JarLauncher"
START_CMD="java org.springframework.boot.loader.launch.JarLauncher --spring.r2dbc.url=r2dbc:pool:mysql://mysql:3306/halo_cd6i8n --spring.r2dbc.username=halo_h56r47 --spring.r2dbc.password=halo_EpejBA --spring.sql.init.platform=mysql --halo.external-url=http://39.98.42.20"

# 检查进程是否存在
if pgrep -f "$APP_PATTERN" >/dev/null; then 
    pid=$(pgrep -f "$APP_PATTERN")
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Java进程运行正常 [PID: $pid]"
    echo "检测完成,进程正常运行。脚本自动退出。"
    exit 0  # 正常运行时退出脚本
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Java进程未运行,尝试启动..."
    $START_CMD &
    sleep 5
    
    if pgrep -f "$APP_PATTERN" >/dev/null; then
        pid=$(pgrep -f "$APP_PATTERN")
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 启动成功 [PID: $pid]"
        echo "已成功启动Java进程。脚本自动退出。"
        exit 0  # 启动成功后退出脚本
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 启动失败!请手动检查"
        exit 1  # 启动失败后退出(非0状态码)
    fi
fi