添加 deepseek/shell/ftp_backup.sh
This commit is contained in:
@@ -0,0 +1,292 @@
|
||||
#!/bin/bash
|
||||
|
||||
# FTP备份脚本
|
||||
# 用法: ./ftp_backup.sh -p密码 目录1 目录2 目录3 文件1
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
# 配置信息(请根据实际情况修改)
|
||||
FTP_SERVER="ftp.example.com"
|
||||
FTP_PORT="21"
|
||||
FTP_USER="username"
|
||||
BACKUP_PREFIX="backup"
|
||||
REMOTE_PATH="/backups"
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
log() {
|
||||
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] 警告: $1${NC}"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] 错误: $1${NC}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 显示用法信息
|
||||
usage() {
|
||||
echo "用法: $0 -p密码 目录1 目录2 目录3 文件1"
|
||||
echo "选项:"
|
||||
echo " -p密码 FTP密码(包含特殊字符时请直接跟在-p后面)"
|
||||
echo "示例: $0 -pMy@Complex#Password123 /home/user /etc /var/log /important/file.txt"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 检测系统类型并安装FTP客户端
|
||||
install_ftp_client() {
|
||||
local ftp_client=""
|
||||
|
||||
# 检测系统类型
|
||||
if command -v apt-get >/dev/null 2>&1; then
|
||||
log "检测到 Debian/Ubuntu 系统"
|
||||
ftp_client="ftp"
|
||||
apt-get update && apt-get install -y $ftp_client
|
||||
elif command -v yum >/dev/null 2>&1; then
|
||||
log "检测到 RHEL/CentOS 系统"
|
||||
ftp_client="ftp"
|
||||
yum install -y $ftp_client
|
||||
elif command -v dnf >/dev/null 2>&1; then
|
||||
log "检测到 Fedora/RHEL 8+ 系统"
|
||||
ftp_client="ftp"
|
||||
dnf install -y $ftp_client
|
||||
elif command -v apk >/dev/null 2>&1; then
|
||||
log "检测到 Alpine 系统"
|
||||
ftp_client="lftp"
|
||||
apk add --no-cache $ftp_client
|
||||
elif command -v zypper >/dev/null 2>&1; then
|
||||
log "检测到 openSUSE 系统"
|
||||
ftp_client="ftp"
|
||||
zypper install -y $ftp_client
|
||||
else
|
||||
error "无法检测系统类型或不受支持的系统"
|
||||
fi
|
||||
|
||||
# 验证安装是否成功
|
||||
if command -v ftp >/dev/null 2>&1 || command -v lftp >/dev/null 2>&1; then
|
||||
log "FTP客户端安装/验证成功"
|
||||
else
|
||||
error "FTP客户端安装失败"
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查FTP客户端是否已安装
|
||||
check_ftp_client() {
|
||||
if command -v ftp >/dev/null 2>&1; then
|
||||
FTP_CMD="ftp"
|
||||
log "找到 ftp 命令"
|
||||
elif command -v lftp >/dev/null 2>&1; then
|
||||
FTP_CMD="lftp"
|
||||
log "找到 lftp 命令"
|
||||
else
|
||||
warn "未找到FTP客户端,尝试安装..."
|
||||
install_ftp_client
|
||||
# 重新检查
|
||||
if command -v ftp >/dev/null 2>&1; then
|
||||
FTP_CMD="ftp"
|
||||
elif command -v lftp >/dev/null 2>&1; then
|
||||
FTP_CMD="lftp"
|
||||
else
|
||||
error "FTP客户端安装后仍然不可用"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 解析命令行参数
|
||||
parse_arguments() {
|
||||
local password_provided=0
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
# 解析-p参数
|
||||
while getopts "p:" opt; do
|
||||
case $opt in
|
||||
p)
|
||||
FTP_PASS="$OPTARG"
|
||||
password_provided=1
|
||||
;;
|
||||
\?)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND -1))
|
||||
|
||||
# 检查密码是否提供
|
||||
if [ $password_provided -eq 0 ]; then
|
||||
error "必须通过 -p参数 提供FTP密码"
|
||||
fi
|
||||
|
||||
# 检查是否有备份目标
|
||||
if [ $# -eq 0 ]; then
|
||||
error "必须指定至少一个目录或文件进行备份"
|
||||
fi
|
||||
|
||||
# 存储要备份的路径
|
||||
BACKUP_PATHS=("$@")
|
||||
|
||||
log "密码参数已接收"
|
||||
log "备份目标: ${BACKUP_PATHS[*]}"
|
||||
}
|
||||
|
||||
# 验证备份路径是否存在
|
||||
validate_paths() {
|
||||
local invalid_paths=()
|
||||
|
||||
for path in "${BACKUP_PATHS[@]}"; do
|
||||
if [ ! -e "$path" ]; then
|
||||
warn "路径不存在: $path"
|
||||
invalid_paths+=("$path")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#invalid_paths[@]} -eq ${#BACKUP_PATHS[@]} ]; then
|
||||
error "所有指定的备份路径都不存在"
|
||||
elif [ ${#invalid_paths[@]} -gt 0 ]; then
|
||||
warn "以下路径将被忽略: ${invalid_paths[*]}"
|
||||
# 移除无效路径
|
||||
local valid_paths=()
|
||||
for path in "${BACKUP_PATHS[@]}"; do
|
||||
if [ -e "$path" ]; then
|
||||
valid_paths+=("$path")
|
||||
fi
|
||||
done
|
||||
BACKUP_PATHS=("${valid_paths[@]}")
|
||||
fi
|
||||
}
|
||||
|
||||
# 创建备份文件
|
||||
create_backup() {
|
||||
local timestamp=$(date +'%Y%m%d_%H%M%S')
|
||||
BACKUP_FILE="${BACKUP_PREFIX}_${timestamp}.tar.gz"
|
||||
|
||||
log "开始创建备份文件: $BACKUP_FILE"
|
||||
|
||||
# 创建临时目录
|
||||
local temp_dir=$(mktemp -d)
|
||||
trap 'rm -rf "$temp_dir"' EXIT
|
||||
|
||||
# 复制要备份的文件和目录到临时位置,保持相对路径结构
|
||||
for path in "${BACKUP_PATHS[@]}"; do
|
||||
if [ -e "$path" ]; then
|
||||
local parent_dir=$(dirname "$path")
|
||||
local base_name=$(basename "$path")
|
||||
|
||||
if [ "$parent_dir" = "/" ]; then
|
||||
# 处理根目录下的文件/目录
|
||||
cp -r "$path" "$temp_dir/root_$base_name"
|
||||
else
|
||||
# 创建父目录结构并复制
|
||||
mkdir -p "$temp_dir/$parent_dir"
|
||||
cp -r "$path" "$temp_dir/$parent_dir/"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# 创建tar.gz压缩包
|
||||
if tar -czf "$BACKUP_FILE" -C "$temp_dir" . 2>/dev/null; then
|
||||
log "备份文件创建成功: $BACKUP_FILE ($(du -h "$BACKUP_FILE" | cut -f1))"
|
||||
else
|
||||
error "创建备份文件失败"
|
||||
fi
|
||||
}
|
||||
|
||||
# 使用ftp命令上传
|
||||
upload_with_ftp() {
|
||||
log "使用ftp上传文件..."
|
||||
|
||||
# 创建ftp命令脚本
|
||||
local ftp_script=$(mktemp)
|
||||
cat > "$ftp_script" << EOF
|
||||
open $FTP_SERVER $FTP_PORT
|
||||
user $FTP_USER $FTP_PASS
|
||||
binary
|
||||
mkdir $REMOTE_PATH
|
||||
cd $REMOTE_PATH
|
||||
put $BACKUP_FILE
|
||||
quit
|
||||
EOF
|
||||
|
||||
if ftp -n < "$ftp_script" > /tmp/ftp_upload.log 2>&1; then
|
||||
log "FTP上传成功"
|
||||
rm -f "$ftp_script" "/tmp/ftp_upload.log"
|
||||
return 0
|
||||
else
|
||||
error "FTP上传失败,查看 /tmp/ftp_upload.log 获取详细信息"
|
||||
fi
|
||||
}
|
||||
|
||||
# 使用lftp命令上传(Alpine Linux)
|
||||
upload_with_lftp() {
|
||||
log "使用lftp上传文件..."
|
||||
|
||||
if lftp -e "set ftp:ssl-allow no; open $FTP_SERVER; user $FTP_USER '$FTP_PASS'; mkdir -p $REMOTE_PATH; cd $REMOTE_PATH; put $BACKUP_FILE; quit" > /tmp/lftp_upload.log 2>&1; then
|
||||
log "LFTP上传成功"
|
||||
rm -f "/tmp/lftp_upload.log"
|
||||
return 0
|
||||
else
|
||||
error "LFTP上传失败,查看 /tmp/lftp_upload.log 获取详细信息"
|
||||
fi
|
||||
}
|
||||
|
||||
# 上传备份文件
|
||||
upload_backup() {
|
||||
log "开始上传备份文件到 $FTP_SERVER:$REMOTE_PATH"
|
||||
|
||||
case $FTP_CMD in
|
||||
"ftp")
|
||||
upload_with_ftp
|
||||
;;
|
||||
"lftp")
|
||||
upload_with_lftp
|
||||
;;
|
||||
*)
|
||||
error "不支持的FTP命令: $FTP_CMD"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# 清理临时文件
|
||||
cleanup() {
|
||||
if [ -f "$BACKUP_FILE" ]; then
|
||||
rm -f "$BACKUP_FILE"
|
||||
log "已清理本地备份文件: $BACKUP_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
log "FTP备份脚本开始执行"
|
||||
|
||||
# 解析参数
|
||||
parse_arguments "$@"
|
||||
|
||||
# 验证路径
|
||||
validate_paths
|
||||
|
||||
# 检查FTP客户端
|
||||
check_ftp_client
|
||||
|
||||
# 创建备份
|
||||
create_backup
|
||||
|
||||
# 上传备份
|
||||
upload_backup
|
||||
|
||||
# 清理
|
||||
cleanup
|
||||
|
||||
log "FTP备份完成!"
|
||||
}
|
||||
|
||||
# 脚本入口点
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user