本文目录导读:

我来为您编写一个自动登录并备份的脚本示例,这个脚本将涵盖 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
安全建议
- 使用 SSH 密钥而不是密码:更安全且便于自动化
- 限制脚本权限:
chmod 700 backup.sh - 加密备份文件:使用 GPG 或 OpenSSL
- 日志记录:保存执行日志以便排查
- 测试恢复:定期测试备份恢复流程
加密备份示例
# 加密备份文件
encrypt_backup() {
local file=$1
gpg --symmetric --cipher-algo AES256 --passphrase "your_password" "$file"
rm "$file" # 删除原文件
}
# 在备份完成后调用
encrypt_backup "$BACKUP_DIR/backup_$DATE.tar.gz"
这个脚本可以根据您的具体需求进行调整,比如添加错误处理、邮件通知等功能,建议先在测试环境验证脚本的正确性,然后再部署到生产环境。