几个常用脚本

系统初始化

bash 复制代码
#!/bin/bash
# 定义颜色常量
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
#功能菜单
menu() {
	clear
	  echo "请选择要执行的操作:"
  echo "1. 检查网络"
  echo "2. 关闭防火墙和SELinux"
  echo "3. 替换YUM源"
  echo "4. 安装必要的工具"
  echo "5. 设置时间同步"
  echo "6. 磁盘分区"
  echo "7. 更新DNS"
  echo "8. 修改SSH会话保持"
  echo "9. 限制用户登录次数锁死时间"
  echo "0. 退出"
  read -p "请输入菜单编号: " choice
  case $choice in
    1) network_check ;;
    2) disable_firewall_selinux ;;
    3) replace_yum_repo ;;
    4) install_tools ;;
    5) set_time_sync ;;
    6) disk_partition ;;
    7) update_dns ;;
    8) modify_ssh_session ;;
    9) limit_user_login ;;
    0) exit ;;
    *) echo "无效的选项,请重新输入!" ; sleep 2; menu ;;
  esac
}
# 1. 检查网络
function network_check() {
  echo "正在检查网络通信"
  ping -c1 www.baidu.com 2>/dev/null
  if [ $? -eq 0 ]; then
      echo "你的网络是没有问题的"
  else
      echo "你的网络有问题,请先检查网络"
      exit 2
  fi
  echo "请选择网络配置方式:"
  echo "1. 使用DHCP"
  echo "2. 设置静态IP"
  read -p "请输入菜单编号: " choice
  case $choice in
    1) configure_dhcp ;;
    2) configure_static_ip ;;
    *) echo "无效的选项,请重新输入!" ; sleep 2; network_check ;;
  esac
}

# 1.1 使用DHCP
function configure_dhcp() {

   local ifcfg_file="/etc/sysconfig/network-scripts/ifcfg-ens33"
    # 检查文件是否存在
    if [ ! -f "$ifcfg_file" ]; then
        echo "错误:文件 $ifcfg_file 不存在。请确认文件路径正确。"
        exit 1
    fi
    # 备份原始文件
    cp "$ifcfg_file" "$ifcfg_file.bak"
    echo "已备份原始文件至 ${ifcfg_file}.bak" 
   # 使用 sed 修改 BOOTPROTO 为 dhcp
    # 查找并替换 BOOTPROTO 的行
    sed -i '/^BOOTPROTO=/c\BOOTPROTO=dhcp' "$ifcfg_file"
    # 如果文件中原本没有 BOOTPROTO 这一行,添加它
    if [ ! grep -q '^BOOTPROTO=' "$ifcfg_file" ]; then
        echo "BOOTPROTO=dhcp" >> "$ifcfg_file"
    fi
     # 注释掉或删除与静态 IP 相关的行
    sed -i '/^IPADDR/d' "$ifcfg_file"
    sed -i '/^NETMASK/d' "$ifcfg_file"
    sed -i '/^GATEWAY/d' "$ifcfg_file"
    sed -i '/^DNS/d' "$ifcfg_file"
    # 显示修改后的文件内容
    echo -e "${GREEN}修改后的 ifcfg-ens33 文件内容:${NC}"
    cat "$ifcfg_file"
    # 重启网络服务
    systemctl restart network
    echo "已重启网络服务以启用 DHCP."

    # 等待一段时间,让用户查看输出
    sleep 2

    # 返回主菜单
    menu
}

# 定义函数以配置静态 IP 地址
function configure_static_ip() {
  # 提示用户输入静态 IP 地址
  while true; do
    echo "请输入静态 IP 地址 (例如: 192.168.1.10):"
    read -r ip_address
    if [[ $ip_address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
      break
    else
      echo "无效的 IP 地址格式,请重试."
    fi
  done

  # 提示用户输入子网掩码
  while true; do
    echo "请输入子网掩码 (例如: 255.255.255.0):"
    read -r netmask
    if [[ $netmask =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
      break
    else
      echo "无效的子网掩码格式,请重试."
    fi
  done

  # 提示用户输入默认网关
  while true; do
    echo "请输入默认网关 (例如: 192.168.1.1):"
    read -r gateway
    if [[ $gateway =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
      break
    else
      echo "无效的网关格式,请重试."
    fi
  done

  # 提示用户输入 DNS 服务器地址
  while true; do
    echo "请输入 DNS 服务器地址 (例如: 8.8.8.8):"
    read -r dns_server
    if [[ $dns_server =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
      break
    else
      echo "无效的 DNS 服务器地址格式,请重试."
    fi
  done

  # 提示用户选择网络接口
  echo "请输入要配置的网络接口 (例如: ens33):"
  read -r interface

  # 读取现有的网卡配置文件
  config_file="/etc/sysconfig/network-scripts/ifcfg-$interface"
  if [[ ! -f "$config_file" ]]; then
    echo "指定的网络接口配置文件不存在,请检查后重试."
    return
  fi

  # 备份现有的网卡配置文件
  echo "是否需要备份现有的网卡配置文件? [y/N]"
  read -r backup_choice
  if [[ $backup_choice =~ ^[Yy]$ ]]; then
    cp "$config_file" "${config_file}.bak"
    echo "备份成功."
  fi

  # 更新配置文件
  sed -i -e "s/^BOOTPROTO=.*/BOOTPROTO=static/" \
      -e '$a\' -e "IPADDR=$ip_address" \
      -e "/^NETMASK=/ s/.*/NETMASK=$netmask/" \
      -e "/^GATEWAY=/ s/.*/GATEWAY=$gateway/" \
      -e "/^DNS1=/ s/.*/DNS1=$dns_server/" \
      -e '$a\' -e "NETMASK=$netmask" \
      -e '$a\' -e "GATEWAY=$gateway" \
      -e '$a\' -e "DNS1=$dns_server" "$config_file"

    # 显示修改后的文件内容
    echo -e "${GREEN}修改后的 ifcfg-ens33 文件内容:${NC}"
    cat "$config_file"
  # 重启网络服务使配置生效
  systemctl restart network

  # 输出配置完成信息
  echo "静态 IP 配置完成."

  # 返回主菜单
  sleep 2
  menu
}

# 2. 关闭防火墙和SELinux
function disable_firewall_selinux() {
  systemctl stop firewalld
  systemctl disable firewalld
  sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
  setenforce 0
  echo "防火墙和SELinux已关闭."
  sleep 1
  menu
}

# 3. 替换YUM源
function replace_yum_repo() {
  echo "正在替换YUM源..."
  #备份原yum源配置文件
  mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  # 下载阿里云CentOS 7 YUM源配置文件
  curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  yum clean all
  yum makecache
  echo "YUM源替换完成."
  sleep 2
  menu
}

# 4. 安装必要的工具
function install_tools() {
  yum -y install vim wget ntpdate lrzsz unzip net-tools
  echo "必要工具已安装."
  sleep 2
  menu
}

# 5. 设置时间同步
function set_time_sync() {
  yum -y install ntpdate
  ntpdate pool.ntp.org
   # 设置时区为上海时区(可以根据需要修改为你所需的时区)
  timedatectl set-timezone Asia/Shanghai
  systemctl enable ntpd
  systemctl start ntpd
  # 添加定时任务以每天凌晨1点同步时间
  (crontab -l ; echo "0 1 * * * /usr/sbin/ntpdate pool.ntp.org") | crontab -
  echo "时间同步已设置,已加入计划任务."
  sleep 2
  menu
}

# 6. 磁盘分区
function disk_partition() {
  echo "请指定要分区的磁盘设备(例如 /dev/sdb):"
  read device
  read -p"请输入分区号"num
  read -p"请输入您的起始扇区(默认则直接回车)" start
  read -p"请输入您想要的分区空间(空间K/M/G/T)" space
  fdisk $device <<EOF
n
p
$num
$start
$space
p
w
EOF
  partprobe $device
  echo "磁盘分区已完成."
  sleep 2
  menu
}

# 7. 更新DNS
function update_dns() {
  echo "请输入要配置的网络接口 (例如: ens33):"
  read -r interface
  # 读取现有的网卡配置文件
  local config_file="/etc/sysconfig/network-scripts/ifcfg-$interface"
  if [[ ! -f "$config_file" ]]; then
    echo "指定的网络接口配置文件不存在,请检查后重试."
    return
  fi  
  read -p"请输入想要更新的DNS地址(如114.114.114.114 8.8.8.8)" DNSip
  sed -ir '/^DNS/d' $config_file
  sed -ir -e '$a\' -e  "nameserver $DNSip" $config_file
  systemctl restart network
  echo "DNS更新完成."
  sleep 2
  menu
}

# 8. 修改SSH会话保持
function modify_ssh_session() {
#  sed -i 's/^#Session\s*keepalive.*$/Session keepalive 60/' /etc/ssh/sshd_config
  read -p"发送心跳包间隔,如60(秒)" cai
  read -p"发送最大次数,如300(次)" cacm
  sed -ir "s/^#ClientAliveInterval.*/ClientAliveInterval $cai/" /etc/ssh/sshd_config
  sed -ir "s/^#ClientAliveCountMax.*/ClientAliveCountMax $cacm/" /etc/ssh/sshd_config
  systemctl restart sshd
  echo "SSH会话保持时间已修改."
  sleep 2
  menu
}

# 9. 限制用户登录次数锁死时间
function limit_user_login() {
    if ! rpm -q pam_tally2 &> /dev/null; then
    echo -e "${RED}未检测到 pam_tally2,请先安装...${NC}"
    sudo yum install -y pam_tally2
    echo -e "${GREEN}pam_tally2 已安装.${NC}"
  else
    echo -e "${GREEN}pam_tally2 已经安装.${NC}"
  fi
  
  echo "正在设置登录失败锁定..."
  cal pam_file="/etc/pam.d/sshd"
  
  # 检查配置是否存在
  if ! grep -q "auth required pam_tally2.so" "$pam_file"; then
    # 添加配置
    echo "auth  required  pam_tally2.so  deny=3  unlock_time=100 even_deny_root root_unlock_time=200" | sudo tee -a "$pam_file" > /dev/null
    echo -e "${GREEN}登录失败锁定已设置.${NC}"
  else
    echo -e "${GREEN}登录失败锁定已存在,无需再次设置.${NC}"
  fi
  systemctl restart sshd
  echo -e "${GREEN}SSHD 服务已重启.${NC}"
  # 这里应该修改实际的PAM配置文件
  sleep 2
  menu
}

# 主程序入口
menu

跳转机

bash 复制代码
#!/bin/bash

# 服务器 IP 和名称列表
server_ip=(192.168.175.128 192.168.175.129 192.168.175.130)
server_name=("web-1" "web-2" "mysql-server")

# 遍历服务器列表
for ((i=0; i<${#server_ip[@]}; i++))
do
    echo "${i}---${server_ip[i]}---${server_name[i]}"
done

# 提示用户输入要连接的序号
echo "请输入要连接的序号:" && read n

# 判断用户输入的序号是否有效
if [[ $n -ge 0 && $n < ${#server_ip[@]} ]]; then
    echo "正在链接${server_ip[n]}"
    
    # 使用 expect 脚本进行 SSH 登录
    /opt/expect.sh "${server_ip[n]}" 
else
    echo "请输入范围内的序号..."
fi

ssh自动跳转

bash 复制代码
#!/usr/bin/expect
set user root
set ip [lindex $argv 0]
set pass 1
spawn ssh $user@$ip

expect {
    "yes/no" {send "yes\r"; exp_continue}
    "password:" {send "$pass\r"}
}
interact

逻辑备份

bash 复制代码
#!/bin/bash
echo "正在使用逻辑备份方式备份数据库"
echo "正在创建逻辑备份目录"
cd /opt && [ -d /mysql_logic ] || mkdir -p /opt/mysql_logic 
        if [ $? -eq 0 ];then
                echo "逻辑备份目录/opt/mysql_logic已创建"
        else
                echo "逻辑备份目录创建失败,请检查目录情况后运行"
        fi  

backup_dir=/opt/mysql_logic
date=$(date +%Y-%m-%d)
file=/tmp/my.txt
read -p "请输入备份使用的用户名:" user  
read -s -p "请输入用户登录密码:" pass  
mysql -u$user -p'$pass' dev/null &> /dev/null
	if [ $? -ne 0 ];then
		echo -e "$user\n$pass" > "$file"  
		echo "mysql用户密码输入正确,密码凭证已存储$file中,将在备份完成后删除。" 
	else
		echo "mysql密码输入错误,请输入正确密码"
		rm -rf /tmp/my.txt
		exit 1
	fi 

read -p "请输入数据库所在主机(本机:localhost,远端:ip地址):"  host
mysqlshow -u"$(head -1 "$file")" -p"$(tail -1 "$file")" -h$host 2> /dev/null
echo "请选择备份类型:"  
echo "1. 备份数据库"  
echo "2. 备份表" 
read -p "请输入选择(1/2): " bck
	
	if [ "$bck" = "1" ]; then 
	echo "关于备份数据库的参数"
cat <<EOF
++++++++++++++++++++++++++++++++++
-A, 备份所有库。
-B, 备份多个数据库。
-d 不导出任何数据,只导出数据库表结构。
++++++++++++++++++++++++++++++++++
EOF
	read -p "请输入所要备份的数据库名:" database
	mysqldump -u"$(head -1 "$file")" -p"$(tail -1 "$file")" $database > $backup_dir/$date-$database.bck &> /dev/null
    		if [ $? -eq 0 ];then
			echo "数据库备份成功"
    		else  
        		echo "数据库备份失败,请检查数据库是否存在"  
			rm -rf "$use_file"
                        exit 1    
    		fi  

	elif [ "$bck" = "2" ];then
	read -p "请输入备份表所在的数据库:" library    
	mysqlshow -u"$(head -1 "$file")" -p"$(tail -1 "$file")" -h$host $library 2> /dev/null
    	read -p "请输入要备份的表名(多个表名用空格分隔):" tables  
    		for table in $tables;
		do 
        	mysqldump -u"$(head -1 "$file")" -p"$(tail -1 "$file")" $library $table > $backup_dir/$date-${table}.sql  &> /dev/null
        		if [ $? -eq 0 ];then  
            			echo "表 $table 备份成功"  
        		else  
            			echo "表 $table 备份失败"  
				rm -rf "$use_file"
        		fi  
    		done  
	else  
    		echo "无效的选择,请重新运行脚本并选择正确的备份类型"  
    		rm -rf "$use_file"
		exit 1  
	fi  
clear
rm -rf "$file"  
echo "密码文件已删除,本次备份完成。"

物理备份

bash 复制代码
#!/bin/bash

# 检查 xtrabackup 是否已安装
if ! command -v innobackupex &> /dev/null 
then
	echo "xtrabackup 似乎没有安装。"
    read -p "是否要尝试自动安装?(y/n): " response
    if [[ $response =~ ^[Yy]$ ]]; then
        if [ $(id -u) -ne 0 ]; then
            echo "请使用 root 权限重新运行此脚本以安装 xtrabackup。"
            exit 1
        fi
		# 更新系统包缓存
		sudo yum update -y
		wget https://www.percona.com/downloads/percona-release/percona-release-0.1-4/redhat/percona-release-0.1-4.noarch.rpm
		rpm -ivh percona-release-0.1-4.noarch.rpm
		# 安装 xtrabackup
		yum -y install percona-xtrabackup-24.x86_64
		# 验证安装
		if innobackupex --version | grep -q 'Percona XtraBackup'
		then
			echo "XtraBackup 安装成功!"
		else
			echo "XtraBackup 安装失败,请检查错误并手动安装。"
		fi
	else
		echo "用户选择不安装 xtrabackup。"
    fi
else
    echo "xtrabackup 已经安装。"
fi

#校准时间
#yum install -y ntpdate
ntpdate  cn.pool.ntp.org
# MySQL 用户名和密码
read -p "请输入用户名: " user
read -s -p "请输入用户密码: " password

# 获取当前时间戳
timestamp=$(date +"%Y-%m-%d_%H-%M-%S")

# 备份目录
backup_dir="/xtrabackup"

# 创建备份目录
mkdir -p "$backup_dir" &>>/dev/null

# 压缩并归档七天前的日志文件
archive_logs() {
    # 创建归档目录
    mkdir -p "$backup_dir/archive_logs"

    # 查找7天前的日志文件
    log_files=$(find "$backup_dir" -name "xtrabackup-*.log" -mtime +7)

    # 如果找到了符合条件的日志文件
    if [ -n "$log_files" ]; then
        # 归档7天前的日志文件
        while IFS= read -r -d '' file; do
            # 压缩日志文件
            tar -czf "$backup_dir/archive_logs/$(basename "$file").tar.gz" "$file"
            # 删除原始日志文件
            rm "$file"
        done 

        echo "压缩并归档了七天前的日志文件。"
    else
        echo "没有找到7天前的日志文件进行归档。"
    fi
}

# 创建备份目录
for i in {1..7}; do
    dir_to_create="$backup_dir/z$i"
    if [ ! -d "$dir_to_create" ]; then
        mkdir -p "$dir_to_create" &>>/dev/null
    fi
done

# 完全备份函数 (周一)
z1() {
    # 检查 z1 是否为空
    if [ -z "$(ls -A "$backup_dir/z1")" ]; then
        # 执行完全备份到 z1 目录
        innobackupex --user=$user --password=$password "$backup_dir/z1" &>> "$backup_dir/xtrabackup-$timestamp.log"
        # 检查备份是否成功
        if [ $? -eq 0 ]; then
            echo "完全备份成功。"
        else
            echo "完全备份失败。"
        fi
    else
        echo "完全备份已存在。"
    fi
    # 记录最新备份的时间戳
    z1=$(ls -t "$backup_dir/z1" | awk 'NR==1 {print $1}') &>>/dev/null
}

# 增量备份函数 (周二、三、五、六增量,周四、日差异)
z2() {
    # 执行增量备份到 z2 目录
    innobackupex --user=$user --password=$password --incremental "$backup_dir/z2" --incremental-basedir="$backup_dir/z1/$z1" &>> "$backup_dir/xtrabackup-$timestamp.log"
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "增量备份成功。"
    else
        echo "增量备份失败。"
    fi
    # 记录最新备份的时间戳
    z2=$(ls -t "$backup_dir/z2" | awk 'NR==1 {print $1}') &>>/dev/null
}

z3() {
    # 执行增量备份到 z3 目录
    innobackupex --user=$user --password=$password --incremental "$backup_dir/z3" --incremental-basedir="$backup_dir/z2/$z2" &>> "$backup_dir/xtrabackup-$timestamp.log"
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "增量备份成功。"
    else
        echo "增量备份失败。"
    fi
    # 记录最新备份的时间戳
    z3=$(ls -t "$backup_dir/z3" | awk 'NR==1 {print $1}') &>>/dev/null
}

z4() {
    # 执行差异备份到 z4 目录
    innobackupex --user=$user --password=$password --incremental "$backup_dir/z4" --incremental-basedir="$backup_dir/z1/$z1" &>> "$backup_dir/xtrabackup-$timestamp.log"
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "差异备份成功。"
    else
        echo "差异备份失败。"
    fi
    # 记录最新备份的时间戳
    z4=$(ls -t "$backup_dir/z4" | awk 'NR==1 {print $1}') &>>/dev/null
}

z5() {
    # 执行增量备份到 z5 目录
    innobackupex --user=$user --password=$password --incremental "$backup_dir/z5" --incremental-basedir="$backup_dir/z4/$z4" &>> "$backup_dir/xtrabackup-$timestamp.log"
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "增量备份成功。"
    else
        echo "增量备份失败。"
    fi
    # 记录最新备份的时间戳
    z5=$(ls -t "$backup_dir/z5" | awk 'NR==1 {print $1}') &>>/dev/null
}

z6() {
    # 执行增量备份到 z6 目录
    innobackupex --user=$user --password=$password --incremental "$backup_dir/z6" --incremental-basedir="$backup_dir/z5/$z5" &>> "$backup_dir/xtrabackup-$timestamp.log"
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "增量备份成功。"
    else
        echo "增量备份失败。"
    fi
    # 记录最新备份的时间戳
    z6=$(ls -t "$backup_dir/z6" | awk 'NR==1 {print $1}') &>>/dev/null
}

z7() {
    # 执行差异备份到 z7 目录
    innobackupex --user=$user --password=$password --incremental "$backup_dir/z7" --incremental-basedir="$backup_dir/z1/$z1" &>> "$backup_dir/xtrabackup-$timestamp.log"
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "差异备份成功。"
    else
        echo "差异备份失败。"
    fi
    # 记录最新备份的时间戳
    z7=$(ls -t "$backup_dir/z7" | awk 'NR==1 {print $1}') &>>/dev/null
}

# 星期判断函数
function show_date() {
    # 输出当前星期
    date +"%A" >>/dev/null
}

# 获取当前日期
current_day=$(show_date)
# 转换星期名称为小写
time=$(echo "$current_day" | awk '{print tolower($0)}')

# 检查是否存在完全备份
if [ -z "$(ls -A "$backup_dir/z1")" ]; then
    # 执行完全备份 (周一)
    z1
else
    # 执行对应的备份任务
    case $time in
        monday)
            # 执行完全备份 (周一)
            z1
            ;;
        tuesday)
            # 执行增量备份 (周二)
            z2
            ;;
        wednesday)
            # 执行增量备份 (周三)
            z3
            ;;
        thursday)
            # 执行差异备份 (周四)
            z4
            ;;
        friday)
            # 执行增量备份 (周五)
            z5
            ;;
        saturday)
            # 执行增量备份 (周六)
            z6
            ;;
        sunday)
            # 执行差异备份 (周日)
            z7
            ;;
    esac
fi

# 在每天执行完备份后,归档日志
archive_logs
相关推荐
烦躁的大鼻嘎7 分钟前
【Linux】深入理解GCC/G++编译流程及库文件管理
linux·运维·服务器
乐大师7 分钟前
Deepin登录后提示“解锁登陆密钥环里的密码不匹配”
运维·服务器
ac.char14 分钟前
在 Ubuntu 上安装 Yarn 环境
linux·运维·服务器·ubuntu
敲上瘾14 分钟前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
长弓聊编程33 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.40 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
梅见十柒1 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Ai 编码助手1 小时前
使用php和Xunsearch提升音乐网站的歌曲搜索效果
开发语言·php
Koi慢热1 小时前
路由基础(全)
linux·网络·网络协议·安全
传而习乎1 小时前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos