别再裸奔!一键证书登录+SCP自动备份MySQL:连密码都不给暴力破解留

一键证书登录+SCP自动备份MySQL:连密码都不给暴力破解留

其实我们用来备份的服务器都是内网服务器,非root账号加随机生成的密码还有非22端口已经很安全了,无奈前端设备改了证书登陆,之后一些自动化链接也也该全部改为证书登陆,只能一起改了。

 

天天手动 mysqldump 再 rz/sz 拖包?你不累我都嫌慢。今天这篇MySQL 自动备份+SCP证书传输教程,手把手教你:

  • 全程密钥登录,端口 12345,暴力扫描直接吃灰;
  • dump 完自动 zip 加密码,SCP 一脚踢到远程 Debian11 备份机;
  • crontab 无人值守,旧包自动清理,磁盘不爆。

照着抄,30 分钟搞定,老板都挑不出毛病。

一、环境清单(照抄就行)

主库 Ubuntu 20.04,MariaDB 10.6,端口 3306
备份机 Debian11,内网 IP 192.168.1.100,SSH 端口 12345
客户端 任意 Linux,带 cron 就行

二、证书登录:先给大门换锁

备份机如果还用密码,脚本里写明文等于裸奔。

# Debian11 生成专用钥匙(跑一遍)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/mysql_backup_key
#  passphrase 建议写:1122334455  (脚本里要用)

把公钥扔进备份机 authorized_keys:

ssh-copy-id -i ~/.ssh/mysql_backup_key.pub -p 12345 user@192.168.1.100

测试能无钥匙登录后再关密码:

sudo nano /etc/ssh/sshd_config
----
PasswordAuthentication no
PermitRootLogin prohibit-password
----
sudo systemctl restart ssh

三、自动备份脚本:dump→zip→SCP→清理 一条龙的日常

脚本放 /opt/mysql_backup.sh,记得 chmod +x。

#!/bin/bash
set -e

###################  只改这里  ###################
LOCAL_DIR="/home/backup/mysql8"                    # 本地暂存
REMOTE_HOST="192.168.1.100"
REMOTE_PORT="12345"
REMOTE_USER="backup"
IDENTITY_FILE="/home/backup/.ssh/mysql_backup_key" # 私钥路径
REMOTE_DIR="/data/backup/mysql"                    # 远端目录
RETAIN_DAY=7                                       # 保留天数
MAIL_TO="dba@rei3.com"

# 数据库列表(库名=压缩密码)
declare -A DB_PASS=([blog]="blog2024" [shop]="shop2024")
MYSQL_ROOT_PASS="your_mysql_root_pass"
##################################################

DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$LOCAL_DIR"

# 清理本地旧包
find "$LOCAL_DIR" -name "*.zip" -mtime +$RETAIN_DAY -delete

for DB in "${!DB_PASS[@]}"; do
    SQL="${DB}_${DATE}.sql"
    ZIP="${DB}_${DATE}.zip"

    # 1. 导出
    mysqldump -uroot -p"$MYSQL_ROOT_PASS" \
              --single-transaction --routines --triggers "$DB" \
              > "$LOCAL_DIR/$SQL"

    # 2. 压缩加密码
    zip -P "${DB_PASS[$DB]}" "$LOCAL_DIR/$ZIP" "$LOCAL_DIR/$SQL"
    rm -f "$LOCAL_DIR/$SQL"

    # 3. 证书上传,无密码裸奔
    scp -i "$IDENTITY_FILE" -P "$REMOTE_PORT" \
        "$LOCAL_DIR/$ZIP" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
done

# 远端清理
ssh -i "$IDENTITY_FILE" -p "$REMOTE_PORT" \
    "$REMOTE_USER@$REMOTE_HOST" \
    "find $REMOTE_DIR -name '*.zip' -mtime +$RETAIN_DAY -delete"

# 邮件打卡
echo "MySQL 自动备份完成 $(date +%F)" | mail -s "备份日报" "$MAIL_TO"

四、让钥匙永不断线:keychain 自动加载

crontab 里没环境变量,agent 会掉。

sudo apt install keychain -y
echo 'eval $(keychain --eval /home/backup/.ssh/mysql_backup_key)' >> ~/.bashrc
source ~/.bashrc

登录时输一次 passphrase 1122334455,后面关机重启都由 keychain 帮你挂 agent。

五、crontab 无人值守

# 每天 2 点备份
0 2 * * *  bash /opt/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1

日志看 `tail -f /var/log/mysql_backup.log`,出错会 mails 给你。

六、常见翻车笔记

  • 1130 Host ‘127.0.0.1’ is not allowed → 删掉 mysqldump 的 `-h127.0.0.1`,走 socket 最快。
  • scp: Permission denied (publickey) → 私钥权限 600、路径写错、passphrase 没加载,按顺序排查。
  • Could not open a connection to your authentication agent → crontab 没环境变量,用 keychain 或手动 `eval $(ssh-agent)` 再 `ssh-add`。

七、总结

证书登录 + SCP 自动备份 MySQL,全程零明文密码,端口 12345 让扫描器直接迷路;dump 后 zip 加密,老包自动清理,磁盘永不满。脚本一扔 crontab,你就可以安心喝茶去了。


© 万事屋原创 | 转载请保留出处:https://www.rei3.com

请登录后发表评论

    没有回复内容

万事屋新帖