添加 deepseek/shell/ftp_backup.sh

This commit is contained in:
2025-10-24 21:13:01 +00:00
parent bccfaeccfd
commit dadfd1b401
+292
View File
@@ -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 "$@"