几个常用脚本

CSDN 2024-08-16 08:37:09 阅读 54

系统初始化

<code>#!/bin/bash

# 定义颜色常量

RED='\033[0;31m'code>

GREEN='\033[0;32m'code>

NC='\033[0m' # No Colorcode>

#功能菜单

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"code>

# 检查文件是否存在

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"code>

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"code>

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"code>

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"code>

# 检查配置是否存在

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

跳转机

#!/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自动跳转

#!/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

逻辑备份

#!/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 "密码文件已删除,本次备份完成。"

物理备份

#!/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"code>

# 创建备份目录

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"code>

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"code>

# 检查备份是否成功

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"code>

# 检查备份是否成功

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"code>

# 检查备份是否成功

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"code>

# 检查备份是否成功

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"code>

# 检查备份是否成功

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"code>

# 检查备份是否成功

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。