实用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