当前位置: 首页 > news >正文

几个常用脚本

系统初始化

#!/bin/bash
# 定义颜色常量
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
#功能菜单
menu() {clearecho "请选择要执行的操作:"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 "请输入菜单编号: " choicecase $choice in1) 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/nullif [ $? -eq 0 ]; thenecho "你的网络是没有问题的"elseecho "你的网络有问题,请先检查网络"exit 2fiecho "请选择网络配置方式:"echo "1. 使用DHCP"echo "2. 设置静态IP"read -p "请输入菜单编号: " choicecase $choice in1) 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" ]; thenecho "错误:文件 $ifcfg_file 不存在。请确认文件路径正确。"exit 1fi# 备份原始文件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" ]; thenecho "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 networkecho "已重启网络服务以启用 DHCP."# 等待一段时间,让用户查看输出sleep 2# 返回主菜单menu
}# 定义函数以配置静态 IP 地址
function configure_static_ip() {# 提示用户输入静态 IP 地址while true; doecho "请输入静态 IP 地址 (例如: 192.168.1.10):"read -r ip_addressif [[ $ip_address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; thenbreakelseecho "无效的 IP 地址格式,请重试."fidone# 提示用户输入子网掩码while true; doecho "请输入子网掩码 (例如: 255.255.255.0):"read -r netmaskif [[ $netmask =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; thenbreakelseecho "无效的子网掩码格式,请重试."fidone# 提示用户输入默认网关while true; doecho "请输入默认网关 (例如: 192.168.1.1):"read -r gatewayif [[ $gateway =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; thenbreakelseecho "无效的网关格式,请重试."fidone# 提示用户输入 DNS 服务器地址while true; doecho "请输入 DNS 服务器地址 (例如: 8.8.8.8):"read -r dns_serverif [[ $dns_server =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; thenbreakelseecho "无效的 DNS 服务器地址格式,请重试."fidone# 提示用户选择网络接口echo "请输入要配置的网络接口 (例如: ens33):"read -r interface# 读取现有的网卡配置文件config_file="/etc/sysconfig/network-scripts/ifcfg-$interface"if [[ ! -f "$config_file" ]]; thenecho "指定的网络接口配置文件不存在,请检查后重试."returnfi# 备份现有的网卡配置文件echo "是否需要备份现有的网卡配置文件? [y/N]"read -r backup_choiceif [[ $backup_choice =~ ^[Yy]$ ]]; thencp "$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 2menu
}# 2. 关闭防火墙和SELinux
function disable_firewall_selinux() {systemctl stop firewalldsystemctl disable firewalldsed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinuxsetenforce 0echo "防火墙和SELinux已关闭."sleep 1menu
}# 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.repocurl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum clean allyum makecacheecho "YUM源替换完成."sleep 2menu
}# 4. 安装必要的工具
function install_tools() {yum -y install vim wget ntpdate lrzsz unzip net-toolsecho "必要工具已安装."sleep 2menu
}# 5. 设置时间同步
function set_time_sync() {yum -y install ntpdatentpdate pool.ntp.org# 设置时区为上海时区(可以根据需要修改为你所需的时区)timedatectl set-timezone Asia/Shanghaisystemctl enable ntpdsystemctl start ntpd# 添加定时任务以每天凌晨1点同步时间(crontab -l ; echo "0 1 * * * /usr/sbin/ntpdate pool.ntp.org") | crontab -echo "时间同步已设置,已加入计划任务."sleep 2menu
}# 6. 磁盘分区
function disk_partition() {echo "请指定要分区的磁盘设备(例如 /dev/sdb):"read deviceread -p"请输入分区号"numread -p"请输入您的起始扇区(默认则直接回车)" startread -p"请输入您想要的分区空间(空间K/M/G/T)" spacefdisk $device <<EOF
n
p
$num
$start
$space
p
w
EOFpartprobe $deviceecho "磁盘分区已完成."sleep 2menu
}# 7. 更新DNS
function update_dns() {echo "请输入要配置的网络接口 (例如: ens33):"read -r interface# 读取现有的网卡配置文件local config_file="/etc/sysconfig/network-scripts/ifcfg-$interface"if [[ ! -f "$config_file" ]]; thenecho "指定的网络接口配置文件不存在,请检查后重试."returnfi  read -p"请输入想要更新的DNS地址(如114.114.114.114 8.8.8.8)" DNSipsed -ir '/^DNS/d' $config_filesed -ir -e '$a\' -e  "nameserver $DNSip" $config_filesystemctl restart networkecho "DNS更新完成."sleep 2menu
}# 8. 修改SSH会话保持
function modify_ssh_session() {
#  sed -i 's/^#Session\s*keepalive.*$/Session keepalive 60/' /etc/ssh/sshd_configread -p"发送心跳包间隔,如60(秒)" cairead -p"发送最大次数,如300(次)" cacmsed -ir "s/^#ClientAliveInterval.*/ClientAliveInterval $cai/" /etc/ssh/sshd_configsed -ir "s/^#ClientAliveCountMax.*/ClientAliveCountMax $cacm/" /etc/ssh/sshd_configsystemctl restart sshdecho "SSH会话保持时间已修改."sleep 2menu
}# 9. 限制用户登录次数锁死时间
function limit_user_login() {if ! rpm -q pam_tally2 &> /dev/null; thenecho -e "${RED}未检测到 pam_tally2,请先安装...${NC}"sudo yum install -y pam_tally2echo -e "${GREEN}pam_tally2 已安装.${NC}"elseecho -e "${GREEN}pam_tally2 已经安装.${NC}"fiecho "正在设置登录失败锁定..."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/nullecho -e "${GREEN}登录失败锁定已设置.${NC}"elseecho -e "${GREEN}登录失败锁定已存在,无需再次设置.${NC}"fisystemctl restart sshdecho -e "${GREEN}SSHD 服务已重启.${NC}"# 这里应该修改实际的PAM配置文件sleep 2menu
}# 主程序入口
menu

跳转机

#!/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++))
doecho "${i}---${server_ip[i]}---${server_name[i]}"
done# 提示用户输入要连接的序号
echo "请输入要连接的序号:" && read n# 判断用户输入的序号是否有效
if [[ $n -ge 0 && $n < ${#server_ip[@]} ]]; thenecho "正在链接${server_ip[n]}"# 使用 expect 脚本进行 SSH 登录/opt/expect.sh "${server_ip[n]}" 
elseecho "请输入范围内的序号..."
fi

ssh自动跳转

#!/usr/bin/expect
set user root
set ip [lindex $argv 0]
set pass 1
spawn ssh $user@$ipexpect {"yes/no" {send "yes\r"; exp_continue}"password:" {send "$pass\r"}
}
interact

逻辑备份

#!/bin/bash
echo "正在使用逻辑备份方式备份数据库"
echo "正在创建逻辑备份目录"
cd /opt && [ -d /mysql_logic ] || mkdir -p /opt/mysql_logic if [ $? -eq 0 ];thenecho "逻辑备份目录/opt/mysql_logic已创建"elseecho "逻辑备份目录创建失败,请检查目录情况后运行"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/nullif [ $? -ne 0 ];thenecho -e "$user\n$pass" > "$file"  echo "mysql用户密码输入正确,密码凭证已存储$file中,将在备份完成后删除。" elseecho "mysql密码输入错误,请输入正确密码"rm -rf /tmp/my.txtexit 1fi 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): " bckif [ "$bck" = "1" ]; then echo "关于备份数据库的参数"
cat <<EOF
++++++++++++++++++++++++++++++++++
-A, 备份所有库。
-B, 备份多个数据库。
-d 不导出任何数据,只导出数据库表结构。
++++++++++++++++++++++++++++++++++
EOFread -p "请输入所要备份的数据库名:" databasemysqldump -u"$(head -1 "$file")" -p"$(tail -1 "$file")" $database > $backup_dir/$date-$database.bck &> /dev/nullif [ $? -eq 0 ];thenecho "数据库备份成功"else  echo "数据库备份失败,请检查数据库是否存在"  rm -rf "$use_file"exit 1    fi  elif [ "$bck" = "2" ];thenread -p "请输入备份表所在的数据库:" library    mysqlshow -u"$(head -1 "$file")" -p"$(tail -1 "$file")" -h$host $library 2> /dev/nullread -p "请输入要备份的表名(多个表名用空格分隔):" tables  for table in $tables;do mysqldump -u"$(head -1 "$file")" -p"$(tail -1 "$file")" $library $table > $backup_dir/$date-${table}.sql  &> /dev/nullif [ $? -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 "密码文件已删除,本次备份完成。"

物理备份

#!/bin/bash# 检查 xtrabackup 是否已安装
if ! command -v innobackupex &> /dev/null 
thenecho "xtrabackup 似乎没有安装。"read -p "是否要尝试自动安装?(y/n): " responseif [[ $response =~ ^[Yy]$ ]]; thenif [ $(id -u) -ne 0 ]; thenecho "请使用 root 权限重新运行此脚本以安装 xtrabackup。"exit 1fi# 更新系统包缓存sudo yum update -ywget https://www.percona.com/downloads/percona-release/percona-release-0.1-4/redhat/percona-release-0.1-4.noarch.rpmrpm -ivh percona-release-0.1-4.noarch.rpm# 安装 xtrabackupyum -y install percona-xtrabackup-24.x86_64# 验证安装if innobackupex --version | grep -q 'Percona XtraBackup'thenecho "XtraBackup 安装成功!"elseecho "XtraBackup 安装失败,请检查错误并手动安装。"fielseecho "用户选择不安装 xtrabackup。"fi
elseecho "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 "压缩并归档了七天前的日志文件。"elseecho "没有找到7天前的日志文件进行归档。"fi
}# 创建备份目录
for i in {1..7}; dodir_to_create="$backup_dir/z$i"if [ ! -d "$dir_to_create" ]; thenmkdir -p "$dir_to_create" &>>/dev/nullfi
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 ]; thenecho "完全备份成功。"elseecho "完全备份失败。"fielseecho "完全备份已存在。"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 ]; thenecho "增量备份成功。"elseecho "增量备份失败。"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 ]; thenecho "增量备份成功。"elseecho "增量备份失败。"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 ]; thenecho "差异备份成功。"elseecho "差异备份失败。"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 ]; thenecho "增量备份成功。"elseecho "增量备份失败。"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 ]; thenecho "增量备份成功。"elseecho "增量备份失败。"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 ]; thenecho "差异备份成功。"elseecho "差异备份失败。"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 inmonday)# 执行完全备份 (周一)z1;;tuesday)# 执行增量备份 (周二)z2;;wednesday)# 执行增量备份 (周三)z3;;thursday)# 执行差异备份 (周四)z4;;friday)# 执行增量备份 (周五)z5;;saturday)# 执行增量备份 (周六)z6;;sunday)# 执行差异备份 (周日)z7;;esac
fi# 在每天执行完备份后,归档日志
archive_logs

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 消费企业经营管理的两大痛点!一篇文章讲透解决办法!
  • Spring Boot 3.x Web MVC实战:实现流缓存的request
  • 速盾:高防ip和cdn哪个好?
  • 按钮(Buttons)-Qt-思维导图-学习笔记
  • Flink开发(一):概述与基础
  • SpringCloud 微服务nacos和eureka
  • 深入探针:PHP与DTrace的动态追踪艺术
  • 【Python快速入门和实践004】Python控制流
  • 机器学习中的距离概念
  • Java8_关于list集合的操作Stream
  • 安科瑞Acrel-2000ES储能能量管理系统在新型电力系统下分布式储能的研究
  • Condition使用
  • 安全测试中参数校验测试
  • 2024最全最新VMWare以及Linux配置(含yum失效解决方案)
  • 算法解析——双指针算法(3)数据匹配
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • exports和module.exports
  • git 常用命令
  • iOS编译提示和导航提示
  • JavaScript服务器推送技术之 WebSocket
  • js
  • mac修复ab及siege安装
  • Python - 闭包Closure
  • python 装饰器(一)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spark本地环境的搭建到运行第一个spark程序
  • Vue.js源码(2):初探List Rendering
  • Vue2.x学习三:事件处理生命周期钩子
  • 对超线程几个不同角度的解释
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 简单基于spring的redis配置(单机和集群模式)
  • 数组的操作
  • 无服务器化是企业 IT 架构的未来吗?
  • 用Visual Studio开发以太坊智能合约
  • 正则学习笔记
  • No resource identifier found for attribute,RxJava之zip操作符
  • 进程与线程(三)——进程/线程间通信
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​决定德拉瓦州地区版图的关键历史事件
  • #pragma once
  • (十)Flink Table API 和 SQL 基本概念
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET/C# 的字符串暂存池
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .Net的DataSet直接与SQL2005交互
  • .NET下ASPX编程的几个小问题
  • /var/spool/postfix/maildrop 下有大量文件
  • @PostConstruct 注解的方法用于资源的初始化
  • [15] 使用Opencv_CUDA 模块实现基本计算机视觉程序
  • [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测
  • [BZOJ 4598][Sdoi2016]模式字符串