本文目录导读:

基础版:使用 7-Zip 加密压缩(推荐)
Windows 批处理脚本
@echo off
setlocal enabledelayedexpansion
REM ============================================
REM 加密压缩脚本 - Windows 版本
REM ============================================
REM 配置
set "SEVENZIP=C:\Program Files\7-Zip\7z.exe"
set "SOURCE_DIR=%USERPROFILE%\Documents\backup"
set "DEST_DIR=D:\backups"
set "PASSWORD=YourStrongPassword123!"
REM 检查7-Zip是否安装
if not exist "%SEVENZIP%" (
echo [错误] 未找到7-Zip,请先安装
exit /b 1
)
REM 创建目标目录
if not exist "%DEST_DIR%" mkdir "%DEST_DIR%"
REM 生成带时间戳的文件名
set "TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
set "FILENAME=backup_%TIMESTAMP%.7z"
REM 执行加密压缩
"%SEVENZIP%" a -t7z "%DEST_DIR%\%FILENAME%" "%SOURCE_DIR%\*" -mx=9 -p"%PASSWORD%" -mhe -r
if %errorlevel% == 0 (
echo [成功] 加密压缩完成: %FILENAME%
) else (
echo [错误] 加密压缩失败
exit /b 1
)
endlocal
进阶版:Python 跨平台脚本
#!/usr/bin/env python3
"""
加密压缩脚本 - Python版本
支持 Windows/Linux/Mac
需要安装: pip install py7zr pyzipper
"""
import os
import sys
import time
import getpass
import argparse
from pathlib import Path
from datetime import datetime
try:
import py7zr
import pyzipper
except ImportError:
print("请安装依赖: pip install py7zr pyzipper")
sys.exit(1)
class EncryptedArchive:
def __init__(self, source, dest, password, format_type='7z'):
self.source = Path(source)
self.dest = Path(dest)
self.password = password
self.format_type = format_type
def create_7z(self):
"""创建加密的7z压缩包"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"backup_{timestamp}.7z"
filepath = self.dest / filename
# 加密参数: AES256加密
options = {
'method': 'AES-256',
'password': self.password,
'headers_encrypted': True # 加密文件头,增强安全性
}
try:
with py7zr.SevenZipFile(
str(filepath),
'w',
password=self.password,
filters=[{'id': py7zr.FILTER_LZMA2, 'preset': 9}]
) as archive:
archive.set_encrypted_header(True)
archive.writeall(str(self.source))
return filepath
except Exception as e:
print(f"创建7z压缩包失败: {e}")
return None
def create_zip(self):
"""创建加密的ZIP压缩包"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"backup_{timestamp}.zip"
filepath = self.dest / filename
try:
with pyzipper.AESZipFile(
str(filepath),
'w',
compression=pyzipper.ZIP_LZMA,
encryption=pyzipper.WZ_AES,
compresslevel=9
) as archive:
archive.setpassword(self.password.encode())
archive.writeall(src=str(self.source), arcname=self.source.name)
return filepath
except Exception as e:
print(f"创建ZIP压缩包失败: {e}")
return None
def run(self):
"""执行压缩"""
if not self.source.exists():
print(f"源路径不存在: {self.source}")
return None
self.dest.mkdir(parents=True, exist_ok=True)
if self.format_type.lower() == '7z':
result = self.create_7z()
elif self.format_type.lower() == 'zip':
result = self.create_zip()
else:
print(f"不支持的格式: {self.format_type}")
return None
if result:
size_mb = result.stat().st_size / (1024 * 1024)
print(f"压缩完成:")
print(f" 文件: {result}")
print(f" 大小: {size_mb:.2f} MB")
# 验证压缩包
if self.format_type.lower() == '7z':
self.verify_7z(result)
else:
self.verify_zip(result)
return result
def verify_7z(self, filepath):
"""验证7z压缩包"""
try:
with py7zr.SevenZipFile(str(filepath), 'r', password=self.password) as archive:
names = archive.getnames()
print(f"验证通过,包含 {len(names)} 个文件")
except Exception as e:
print(f"验证失败: {e}")
def verify_zip(self, filepath):
"""验证ZIP压缩包"""
try:
with pyzipper.AESZipFile(str(filepath), 'r') as archive:
archive.setpassword(self.password.encode())
file_info = archive.namelist()
print(f"验证通过,包含 {len(file_info)} 个文件")
except Exception as e:
print(f"验证失败: {e}")
def main():
parser = argparse.ArgumentParser(description='加密压缩脚本')
parser.add_argument('-s', '--source', required=True, help='要压缩的源文件或目录')
parser.add_argument('-d', '--dest', default='./backups', help='输出目录')
parser.add_argument('-p', '--password', help='加密密码 (不提供则交互式输入)')
parser.add_argument('-f', '--format', default='7z', choices=['7z', 'zip'], help='压缩格式')
args = parser.parse_args()
# 获取密码
password = args.password
if not password:
password = getpass.getpass("请输入加密密码: ")
confirm = getpass.getpass("确认密码: ")
if password != confirm:
print("密码不匹配!")
sys.exit(1)
# 创建并运行
archive = EncryptedArchive(args.source, args.dest, password, args.format)
result = archive.run()
if not result:
sys.exit(1)
if __name__ == "__main__":
main()
Linux Shell 脚本版本
#!/bin/bash
# ============================================
# 加密压缩脚本 - Linux/Mac 版本
# 使用方法: ./encrypt_backup.sh [源目录] [目标目录]
# ============================================
set -e
# 配置
SOURCE_DIR="${1:-$HOME/documents/backup}"
DEST_DIR="${2:-$HOME/backups}"
PASSWORD="${BACKUP_PASSWORD:-}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILENAME="backup_${TIMESTAMP}.tar.gz"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 日志函数
log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
}
error() {
echo -e "${RED}[错误] $1${NC}"
exit 1
}
# 检查依赖
check_dependencies() {
command -v openssl >/dev/null 2>&1 || error "需要安装 openssl"
command -v tar >/dev/null 2>&1 || error "需要安装 tar"
}
# 获取密码
get_password() {
if [ -z "$PASSWORD" ]; then
echo -n "请输入加密密码: "
read -s PASSWORD
echo
echo -n "确认密码: "
read -s CONFIRM_PASSWORD
echo
if [ "$PASSWORD" != "$CONFIRM_PASSWORD" ]; then
error "密码不匹配"
fi
fi
if [ ${#PASSWORD} -lt 8 ]; then
error "密码长度至少8个字符"
fi
}
# 检查源目录
check_source() {
[ -d "$SOURCE_DIR" ] || error "源目录不存在: $SOURCE_DIR"
[ -r "$SOURCE_DIR" ] || error "源目录不可读: $SOURCE_DIR"
}
# 创建加密压缩
create_encrypted_archive() {
log "开始加密压缩..."
# 创建临时文件储存加密密钥
TMP_KEY_FILE=$(mktemp)
chmod 600 "$TMP_KEY_FILE"
# 主执行函数
main() {
# 检查依赖
check_dependencies
# 获取密码
get_password
# 检查源目录
check_source
# 创建目标目录
mkdir -p "$DEST_DIR" || error "无法创建目标目录"
# 执行加密压缩
log "压缩并加密: $FILENAME"
tar czf - -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")" | \
openssl enc -aes-256-cbc -salt -pbkdf2 -k "$PASSWORD" > "$DEST_DIR/$FILENAME"
if [ $? -eq 0 ]; then
log "加密压缩完成: $DEST_DIR/$FILENAME"
ls -lh "$DEST_DIR/$FILENAME"
else
error "加密压缩失败"
fi
# 清理临时文件
rm -f "$TMP_KEY_FILE"
}
main "$@"
}
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
-s|--source)
SOURCE_DIR="$2"
shift 2
;;
-d|--dest)
DEST_DIR="$2"
shift 2
;;
-p|--password)
PASSWORD="$2"
shift 2
;;
-h|--help)
echo "用法: $0 [-s 源目录] [-d 目标目录] [-p 密码]"
exit 0
;;
*)
echo "未知参数: $1"
exit 1
;;
esac
done
# 执行主函数
create_encrypted_archive
自动化定时备份版本(集成cron任务)
#!/usr/bin/env python3
"""
自动化定时加密备份脚本
配合 cron/scheduler 使用
"""
import os
import sys
import json
import logging
import schedule
import time
from datetime import datetime
from pathlib import Path
from encrypt_backup import EncryptedArchive
class AutoBackup:
def __init__(self, config_path):
self.config = self.load_config(config_path)
self.setup_logging()
def load_config(self, config_path):
"""加载配置文件"""
with open(config_path, 'r') as f:
return json.load(f)
def setup_logging(self):
"""设置日志"""
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('backup.log'),
logging.StreamHandler()
]
)
def cleanup_old_backups(self):
"""清理旧备份"""
max_backups = self.config.get('max_backups', 30)
dest = Path(self.config['dest'])
backups = sorted(dest.glob('*'))
if len(backups) > max_backups:
for old in backups[:-max_backups]:
old.unlink()
logging.info(f"删除旧备份: {old}")
def run_backup(self, profile=None):
"""执行备份"""
profiles = self.config['profiles']
if profile:
profiles = [p for p in profiles if p['name'] == profile]
for prof in profiles:
try:
logging.info(f"开始备份: {prof['name']}")
archive = EncryptedArchive(
source=prof['source'],
dest=self.config['dest'],
password=self.config['password'],
format_type=self.config.get('format', '7z')
)
result = archive.run()
if result:
logging.info(f"备份成功: {result}")
# 清理旧备份
self.cleanup_old_backups()
except Exception as e:
logging.error(f"备份失败 {prof['name']}: {e}")
def schedule_backups(self):
"""设置定时任务"""
schedule = self.config.get('schedule', {})
if schedule.get('daily', False):
at_time = schedule.get('daily_time', '02:00')
schedule.every().day.at(at_time).do(self.run_backup)
logging.info(f"已设置每日 {at_time} 备份")
if schedule.get('weekly', False):
day = schedule.get('weekly_day', 'monday')
at_time = schedule.get('weekly_time', '03:00')
getattr(schedule.every(), day).at(at_time).do(self.run_backup)
logging.info(f"已设置每周{day} {at_time} 备份")
def run(self):
"""主循环"""
# 立即执行一次
self.run_backup()
# 设置定时任务
self.schedule_backups()
logging.info("备份服务已启动")
# 持续运行
while True:
schedule.run_pending()
time.sleep(60)
if __name__ == "__main__":
if len(sys.argv) > 1:
backup = AutoBackup(sys.argv[1])
backup.run()
else:
print("用法: python auto_backup.py config.json")
配置文件 config.json 示例:
{
"password": "YourStrongPassword123!",
"dest": "D:/backups",
"format": "7z",
"max_backups": 30,
"schedule": {
"daily": true,
"daily_time": "02:00",
"weekly": false
},
"profiles": [
{
"name": "documents",
"source": "D:/Documents"
},
{
"name": "photos",
"source": "D:/Photos"
}
]
}
使用建议
-
选择加密方式:
- 7z: 压缩率好,支持AES-256加密
- ZIP: 兼容性好,Windows原生支持
- tar.gz+openssl: Linux系统常用
-
密码安全管理:
- 使用环境变量存储密码
- 避免在脚本中硬编码密码
- 定期更换密码
-
测试验证:
- 首次使用前小范围测试
- 定期抽查备份能否正常解压
-
错误处理:
- 添加日志记录
- 失败时邮件/短信通知
- 保留足够的磁盘空间
根据你的需求,可以选择适合的实现方案,如果还有不明白的地方,可以告诉我你具体的使用场景,我可以给出更针对性的建议。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播