网站建设哈尔滨,网站项目开发流程及规范,北关网站制作,包河网站建设系统初始化
#!/bin/bash
# 定义颜色常量
RED\033[0;31m
GREEN\033[0;32m
NC\033[0m # No Color
#功能菜单
menu() {clearecho 请选择要执行的操作:echo 1. 检查网络echo 2. 关闭防火墙和SELinuxecho 3. 替换YUM源echo …系统初始化
#!/bin/bash
# 定义颜色常量
RED\033[0;31m
GREEN\033[0;32m
NC\033[0m # No Color
#功能菜单
menu() {clearecho 请选择要执行的操作:echo 1. 检查网络echo 2. 关闭防火墙和SELinuxecho 3. 替换YUM源echo 4. 安装必要的工具echo 5. 设置时间同步echo 6. 磁盘分区echo 7. 更新DNSecho 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. 使用DHCPecho 2. 设置静态IPread -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.bakecho 已备份原始文件至 ${ifcfg_file}.bak # 使用 sed 修改 BOOTPROTO 为 dhcp# 查找并替换 BOOTPROTO 的行sed -i /^BOOTPROTO/c\BOOTPROTOdhcp $ifcfg_file# 如果文件中原本没有 BOOTPROTO 这一行添加它if [ ! grep -q ^BOOTPROTO $ifcfg_file ]; thenecho BOOTPROTOdhcp $ifcfg_filefi# 注释掉或删除与静态 IP 相关的行sed -i /^IPADDR/d $ifcfg_filesed -i /^NETMASK/d $ifcfg_filesed -i /^GATEWAY/d $ifcfg_filesed -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-$interfaceif [[ ! -f $config_file ]]; thenecho 指定的网络接口配置文件不存在请检查后重试.returnfi# 备份现有的网卡配置文件echo 是否需要备份现有的网卡配置文件? [y/N]read -r backup_choiceif [[ $backup_choice ~ ^[Yy]$ ]]; thencp $config_file ${config_file}.bakecho 备份成功.fi# 更新配置文件sed -i -e s/^BOOTPROTO.*/BOOTPROTOstatic/ \-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.*/SELINUXdisabled/ /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-$interfaceif [[ ! -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 deny3 unlock_time100 even_deny_root root_unlock_time200 | 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 ((i0; 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 请输入范围内的序号...
fissh自动跳转
#!/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_fileexit 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_filefi done else echo 无效的选择请重新运行脚本并选择正确的备份类型 rm -rf $use_fileexit 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 XtraBackupthenecho 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 $filedone echo 压缩并归档了七天前的日志文件。elseecho 没有找到7天前的日志文件进行归档。fi
}# 创建备份目录
for i in {1..7}; dodir_to_create$backup_dir/z$iif [ ! -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 NR1 {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 NR1 {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 NR1 {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 NR1 {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 NR1 {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 NR1 {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 NR1 {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