本文目录导读:

我来为您编写一个自动登录并备份的脚本示例,这个脚本将涵盖 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"
这个脚本可以根据您的具体需求进行调整,比如添加错误处理、邮件通知等功能,建议先在测试环境验证脚本的正确性,然后再部署到生产环境。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播