系统初始化
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