如何编写自动登录并备份脚本

wen 实用脚本 2

本文目录导读:

如何编写自动登录并备份脚本

  1. 基础 SSH 自动登录备份脚本
  2. 使用 SSH 密钥的最佳实践版本
  3. Windows PowerShell 版本
  4. 配置和使用步骤
  5. 安全建议
  6. 加密备份示例

我来为您编写一个自动登录并备份的脚本示例,这个脚本将涵盖 SSH 远程登录、文件备份以及可能的数据库备份功能。

基础 SSH 自动登录备份脚本

#!/bin/bash
# 自动登录备份脚本
# 作者: AI Assistant
# 版本: 1.0
# ========== 配置参数 ==========
REMOTE_HOST="your_server_ip"
REMOTE_PORT="22"
REMOTE_USER="your_username"
REMOTE_PASS="your_password"  # 建议使用SSH密钥免密登录
BACKUP_DIR="/backup"
REMOTE_BACKUP_DIR="/remote/backup"
DATE=$(date +%Y%m%d_%H%M%S)
# ========== 颜色输出函数 ==========
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}
# ========== 前置检查 ==========
pre_check() {
    # 检查必要工具
    for cmd in ssh scp tar rsync; do
        if ! command -v $cmd &> /dev/null; then
            log_error "$cmd 未安装,请先安装"
            exit 1
        fi
    done
    # 创建本地备份目录
    mkdir -p "$BACKUP_DIR"
    log_info "本地备份目录: $BACKUP_DIR"
}
# ========== 使用SSH密钥登录(推荐)==========
ssh_key_login() {
    log_info "尝试SSH密钥登录..."
    if ssh -o StrictHostKeyChecking=no -p $REMOTE_PORT -i ~/.ssh/id_rsa $REMOTE_USER@$REMOTE_HOST "echo '登录成功'"; then
        log_info "SSH密钥登录成功"
        return 0
    else
        log_warn "SSH密钥登录失败,尝试密码登录..."
        return 1
    fi
}
# ========== 使用密码登录(不推荐,仅作示例)==========
ssh_pass_login() {
    log_info "尝试密码登录..."
    # 需要安装 sshpass
    if command -v sshpass &> /dev/null; then
        if sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST "echo '登录成功'"; then
            log_info "密码登录成功"
            return 0
        else
            log_error "密码登录失败"
            return 1
        fi
    else
        log_error "sshpass未安装,请安装: apt-get install sshpass 或 yum install sshpass"
        return 1
    fi
}
# ========== 远程备份函数 ==========
remote_backup() {
    local BACKUP_NAME="backup_$DATE"
    local REMOTE_TEMP="/tmp/$BACKUP_NAME"
    log_info "开始远程备份..."
    # 远程创建备份目录
    ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_TEMP"
    # 远程备份命令(根据实际情况修改)
    ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST << 'EOF'
        echo "执行远程备份命令..."
        # 示例:备份 /var/www 目录
        tar -czf /tmp/www_backup.tar.gz /var/www 2>/dev/null || echo "www备份完成"
        # 示例:备份 /etc 配置
        tar -czf /tmp/etc_backup.tar.gz /etc 2>/dev/null || echo "etc备份完成"
        # 示例:备份数据库(如果有MySQL)
        mysqldump -u root --all-databases > /tmp/all_databases.sql 2>/dev/null || echo "数据库备份完成或无需备份"
        echo "远程备份完成"
EOF
    if [ $? -eq 0 ]; then
        log_info "远程备份执行成功"
        return 0
    else
        log_error "远程备份执行失败"
        return 1
    fi
}
# ========== 下载备份文件 ==========
download_backup() {
    log_info "开始下载备份文件..."
    # 下载远程备份文件到本地
    scp -P $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST:"/tmp/*.tar.gz /tmp/*.sql" "$BACKUP_DIR/"
    if [ $? -eq 0 ]; then
        log_info "备份文件下载成功"
        # 压缩本地备份
        cd "$BACKUP_DIR"
        tar -czf "backup_$DATE.tar.gz" *.tar.gz *.sql 2>/dev/null
        log_info "本地备份打包完成: $BACKUP_DIR/backup_$DATE.tar.gz"
        # 清理临时文件
        rm -f *.tar.gz *.sql
        return 0
    else
        log_error "备份文件下载失败"
        return 1
    fi
}
# ========== 清理远程文件 ==========
cleanup_remote() {
    log_info "清理远程临时文件..."
    ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST "rm -rf /tmp/*.tar.gz /tmp/*.sql /tmp/backup_*"
    log_info "远程临时文件清理完成"
}
# ========== 本地文件同步(替代方案)==========
sync_directory() {
    local LOCAL_DIR="/path/to/local/dir"
    local REMOTE_DIR="/path/to/remote/dir"
    log_info "开始目录同步..."
    # 使用 rsync 进行增量备份
    rsync -avz --progress -e "ssh -p $REMOTE_PORT" \
        $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR \
        $LOCAL_DIR \
        --exclude="*.tmp" \
        --exclude="cache/*"
    if [ $? -eq 0 ]; then
        log_info "目录同步完成"
    else
        log_error "目录同步失败"
    fi
}
# ========== 主要执行流程 ==========
main() {
    log_info "========== 自动备份脚本开始 =========="
    log_info "时间: $(date)"
    # 前置检查
    pre_check
    # 尝试登录
    if ! ssh_key_login; then
        if ! ssh_pass_login; then
            log_error "无法登录远程服务器"
            exit 1
        fi
    fi
    # 执行备份
    if remote_backup; then
        # 下载备份
        download_backup
        # 清理远程文件
        cleanup_remote
    fi
    log_info "========== 自动备份脚本完成 =========="
    log_info "备份文件位置: $BACKUP_DIR"
}
# 执行主函数
main

使用 SSH 密钥的最佳实践版本

#!/bin/bash
# 简化版 SSH 密钥认证备份脚本
# 配置
REMOTE_HOST="example.com"
REMOTE_USER="user"
BACKUP_DIR="./backups"
DATE=$(date +%Y%m%d)
# 需要备份的目录
BACKUP_PATHS=(
    "/var/www"
    "/etc/nginx"
    "/etc/ssl"
)
# 确保 SSH 密钥已配置
ensure_ssh_key() {
    if [ ! -f ~/.ssh/id_rsa ]; then
        echo "生成 SSH 密钥..."
        ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
    fi
    # 复制公钥到服务器
    ssh-copy-id -i ~/.ssh/id_rsa.pub $REMOTE_USER@$REMOTE_HOST
}
# 执行备份
backup_directories() {
    mkdir -p "$BACKUP_DIR/$DATE"
    for path in "${BACKUP_PATHS[@]}"; do
        local name=$(basename $path)
        echo "备份 $path..."
        # 使用 tar 通过 SSH 直接备份
        ssh $REMOTE_USER@$REMOTE_HOST "tar czf - $path" > "$BACKUP_DIR/$DATE/${name}.tar.gz"
        if [ $? -eq 0 ]; then
            echo "✓ $path 备份成功"
        else
            echo "✗ $path 备份失败"
        fi
    done
}
# 主函数
main() {
    ensure_ssh_key
    backup_directories
    echo "备份完成: $BACKUP_DIR/$DATE"
}
main

Windows PowerShell 版本

# auto_backup.ps1
param(
    [string]$RemoteHost = "your_server",
    [string]$RemoteUser = "your_user",
    [string]$BackupPath = "C:\Backups"
)
# 加载 SSH 模块 (Windows 需要安装 OpenSSH)
$date = Get-Date -Format "yyyyMMdd_HHmmss"
$backupDir = "$BackupPath\$date"
# 创建备份目录
New-Item -ItemType Directory -Path $backupDir -Force
# 执行远程备份命令
$commands = @"
mkdir -p /tmp/backup_$date
tar -czf /tmp/backup_$date/www.tar.gz /var/www
tar -czf /tmp/backup_$date/etc.tar.gz /etc
"@
# 通过 SSH 执行
ssh "$RemoteUser@$RemoteHost" $commands
# 下载备份文件
scp "$RemoteUser@$RemoteHost:/tmp/backup_$date/*.tar.gz" "$backupDir\"
# 清理远程文件
ssh "$RemoteUser@$RemoteHost" "rm -rf /tmp/backup_$date"
Write-Host "备份完成: $backupDir"

配置和使用步骤

1 SSH 密钥配置(推荐)

# 1. 生成 SSH 密钥
ssh-keygen -t rsa -b 4096
# 2. 复制公钥到服务器
ssh-copy-id user@server_ip
# 3. 测试免密登录
ssh user@server_ip "ls"

2 安装必要工具

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install sshpass rsync
# CentOS/RHEL
sudo yum install sshpass rsync

3 设置定时任务

# 编辑 crontab
crontab -e
# 每天凌晨2点执行备份
0 2 * * * /path/to/backup_script.sh
# 每周日凌晨3点执行完整备份
0 3 * * 0 /path/to/backup_script.sh --full

安全建议

  1. 使用 SSH 密钥而不是密码:更安全且便于自动化
  2. 限制脚本权限chmod 700 backup.sh
  3. 加密备份文件:使用 GPG 或 OpenSSL
  4. 日志记录:保存执行日志以便排查
  5. 测试恢复:定期测试备份恢复流程

加密备份示例

# 加密备份文件
encrypt_backup() {
    local file=$1
    gpg --symmetric --cipher-algo AES256 --passphrase "your_password" "$file"
    rm "$file"  # 删除原文件
}
# 在备份完成后调用
encrypt_backup "$BACKUP_DIR/backup_$DATE.tar.gz"

这个脚本可以根据您的具体需求进行调整,比如添加错误处理、邮件通知等功能,建议先在测试环境验证脚本的正确性,然后再部署到生产环境。

抱歉,评论功能暂时关闭!